Bir .xlsx (MS Excel) dosyasını, noktalı virgülle ayrılmış alanlarla komut satırında .csv dosyasına dönüştürün


31

Bunun tamamen unix / linux ile ilgili bir soru olmadığını biliyorum . Ama bu linux'ta yapacağım bir şey olduğundan, umarım birinin cevabı vardır.

.xlsxDüzenli olarak (bir başkası tarafından) güncellenen çevrimiçi bir excel dosyası ( ) var. Bu mükemmel sayfayı işlemek için bir senaryo yazmak ve bir cronjob olarak koymak istiyorum. Ancak bunu yapmak için, bunu .csvnoktalı virgülle ayrılmış sütunlarla bir metin dosyasına (yani a ) dönüştürmem gerekiyor . Bazı sütunlarda virgül bulunduğundan, ne yazık ki virgülle ayrıştırılamaz. Bu dönüşümü kabuktan yapmak mümkün mü? Open office'i kurdum ve GUI'sini kullanarak bunu yapabilirim, ancak bunu komut satırından yapmanın mümkün olup olmadığını bilmek istiyorum. Teşekkürler!

Not: Benim de bir Mac makinem var, bu yüzden eğer bir çözüm orada işe yarayabilirse, bu da iyi. :)

Yanıtlar:


21

OpenOffice , komut satırında format dönüşümleri gerçekleştirmek için unoconv programıyla birlikte gelir .

unoconv -f csv filename.xlsx

Daha karmaşık gereksinimler için, XLSX dosyalarını Spreadsheet::XLSXPerl veya openpyxlPython ile ayrıştırabilirsiniz . Örneğin, bir çalışma sayfasını noktalı virgülle ayrılmış bir CSV dosyası olarak yazdırmak için hızlı bir komut dosyası (uyarı: denenmemiş, doğrudan tarayıcıya yazılan):

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

unoconv benim OO ile gelmedi, ama kurdum ve harika çalışıyor (virgülle ayrılmış dosyaya dönüştürür, noktalı virgülle değil)! Teşekkürler! Hala virgül içeren alanlarımı nasıl alacağımı bulmam gerekecek. Ama yine de teşekkürler.
allrite

@ allrite Oh, noktalı virgül ayırıcı olarak gereksinimini kaçırdım. Python veya Perl'de işlem yapma önerim hala geçerli. Ancak, CSV'ye ;ayırıcı olarak dönüştürmek için bir komut dosyası (denenmemiş) de ekledim .
Gilles 'SO- kötülük yapmayı bırak'

Teşekkürler! Spreadsheet :: XLSX'i kullandım ancak sağladığınız CPAN bağlantısındaki kodu kullandım. Çalışır :)
allrite


9

https://github.com/dilshod/xlsx2csv

Benim için iyi çalıştı. Yaklaşık 85 MB XLSX dosyası, Mac Book Pro SSD'de yaklaşık 3 dakikada dönüştürülmüştür.


1
OSX'te $ python xlsx2csv.py -d ";" my.xlsx my.csviyi çalıştı, sınırlayıcıyı tanımlamada iyi çalıştı ve teşekkür ederiz!
hhh

6

Dosyaları dönüştürmek için Perl'in xls2csv kullanıyorum .xlscsv

Onunla da çalışıp çalışmadığından emin değilim xlsx.

Hakkında:

Bazı sütunlarda virgül bulunduğundan, ne yazık ki virgülle ayrıştırılamaz.

bu yüzden alıntılama yapılmaya başlandı:

1,2,"data,data, more data"

bahşiş için teşekkürler, bunu deneyeceğim. Ben hala noktalı virgül ayırmayı tercih ediyorum, çünkü csv dönüşümünden sonra dosya awkscriptleri geçiyor . Ve alan ayırıcı olarak noktalı virgülün geçişi daha kolaydır awk. Onları başka bir şeyle değiştirmek için tırnak içinde virgüller
arayabilirim

@Neurino'ya teşekkürler. Bunun yerine Gilles yöntemini kullandım, ama yine de cevap için teşekkürler.
allrite

1

PHP kullanıyorum. PHPExel kütüphanesini http://phpexcel.codeplex.com/ adresinden kurmanız yeterlidir ve muhtemelen XML işlevlerine de ihtiyacınız vardır.

Bu benim kodum:

<?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));
?>

İşlemi geri alabilir veya farklı Excel / CSV formatlarını kullanabilirsiniz. PHPExcel dizinindeki farklı php dosyalarına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.