Konversikan file .xlsx (MS Excel) ke .csv pada baris perintah dengan bidang yang dipisahkan titik koma

31

Saya menyadari bahwa ini bukan pertanyaan yang sepenuhnya terkait unix / linux. Tetapi karena ini adalah sesuatu yang akan saya lakukan di linux, saya harap seseorang memiliki jawaban.

Saya memiliki file excel online ( .xlsx) yang diperbarui secara berkala (oleh orang lain). Saya ingin menulis naskah dan memasukkannya sebagai cronjob untuk memproses lembar excel itu. Tetapi untuk melakukan itu, saya perlu mengubahnya menjadi file teks (jadi a .csv) dengan kolom yang dipisahkan titik koma. Sayangnya, tidak dapat dipisahkan koma karena beberapa kolom memiliki koma di dalamnya. Apakah mungkin melakukan konversi ini dari shell? Saya telah menginstal Open Office dan saya dapat melakukan ini dengan menggunakan GUI-nya, tetapi ingin tahu apakah mungkin untuk melakukan ini dari baris perintah. Terima kasih!

PS: Saya punya mesin Mac juga, jadi kalau ada solusi yang bisa digunakan, bagus juga. :)

allrite
sumber

Jawaban:

21

OpenOffice hadir dengan program unoconv untuk melakukan konversi format pada baris perintah.

unoconv -f csv filename.xlsx

Untuk persyaratan yang lebih kompleks, Anda dapat mem-parsing file XLSX dengan Spreadsheet::XLSXPerl atau openpyxlPython. Misalnya, berikut ini skrip quickie untuk mencetak lembar kerja sebagai file CSV yang dipisahkan dengan titik koma (peringatan: belum diuji, diketik langsung di browser):

perl -MSpreadsheet::XLSX -e '
    $\ = "\n"; $, = ";";
    my $workbook = Spreadsheet::XLSX->new()->parse($ARGV[0]);
    my $worksheet = ($workbook->worksheets())[0];
    my ($row_min, $row_max) = $worksheet->row_range();
    my ($col_min, $col_max) = $worksheet->col_range();
    for my $row ($row_min..$row_max) {
        print map {$worksheet->get_cell($row,$_)->value()} ($col_min..$col_max);
    }
' filename.xlsx >filename.csv
Gilles 'SANGAT berhenti menjadi jahat'
sumber
unoconv tidak datang dengan OO saya, tapi saya menginstalnya dan berfungsi dengan baik (mengkonversi ke file yang dipisahkan koma, bukan titik koma)! Terima kasih! Saya masih perlu mencari tahu bagaimana saya akan mendapatkan bidang saya yang mengandung koma. Tapi terima kasih.
allrite
@allrite Oh, saya melewatkan persyaratan titik koma sebagai pemisah. Saran saya untuk melakukan pemrosesan dengan Python atau Perl masih berdiri. Tapi saya juga menambahkan skrip (belum diuji) untuk dikonversi ke CSV dengan ;sebagai pemisah.
Gilles 'SO- stop being evil'
Terima kasih! Saya menggunakan Spreadsheet :: XLSX, tetapi menggunakan kode di tautan CPAN yang Anda berikan. Ini bekerja :)
allrite
1
Seorang pengguna anonim memiliki masalah dengan ini
Michael Mrozek
9

https://github.com/dilshod/xlsx2csv

Bekerja dengan baik untuk saya. Sekitar 85 MB file XLSX dikonversi sekitar 3 menit pada Mac Book Pro SSD.

Bohumir Zamecnik
sumber
1
Bekerja dengan baik di OSX $ python xlsx2csv.py -d ";" my.xlsx my.csvbekerja dengan baik dan kemampuan untuk mendefinisikan pembatas, terima kasih +!
hhh
6

Saya menggunakan xls2csv dari Perl untuk mengonversi xlsfile menjadi csv.

Tidak yakin apakah itu berfungsi dengan baik xlsx.

Tentang:

Sayangnya, tidak dapat dipisahkan koma karena beberapa kolom memiliki koma di dalamnya

itu sebabnya kutipan telah diperkenalkan:

1,2,"data,data, more data"
neurino
sumber
terima kasih atas tipnya, saya akan mencobanya. Saya masih lebih suka tanda titik koma, karena setelah konversi csv, file melewati awkskrip. Dan itu hanya lebih mudah untuk melewati titik koma sebagai pemisah bidang di awk. Saya bisa mencari koma di dalam tanda kutip untuk menggantinya dengan yang lain ... sekarang itu pertanyaan lain :)
allrite
Terima kasih @neurino. Saya menggunakan metode Gilles sebagai gantinya, tapi terima kasih atas jawabannya.
allrite
1

Saya menggunakan PHP. Cukup instal pustaka PHPExel dari http://phpexcel.codeplex.com/ dan mungkin Anda memerlukan fungsi XML juga.

Ini kode saya:

<?php

error_reporting(E_ALL);
date_default_timezone_set('Europe/London');

/** PHPExcel_IOFactory */

require_once '/home/markov/Downloads/1.7.6/Classes/PHPExcel/IOFactory.php';

$file="RIF394305.xlsx"; //PATH TO CSV FILE

// Check prerequisites

if (!file_exists($file)) {
    exit("Please run 06largescale.php first.\n");
}

$objReader = PHPExcel_IOFactory::createReader('Excel2003XML');

$objPHPExcel = $objReader->load($file);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');

$objWriter->save(str_replace('.xlsx', '.csv',$file));
?>

Anda dapat mengembalikan proses atau menggunakan format Excel / CSV yang berbeda. Lihatlah berbagai file php di direktori PHPExcel.

magilda
sumber