使用分号分隔的字段在命令行上将.xlsx(MS Excel)文件转换为.csv


31

我意识到这不是一个完全与unix / linux相关的问题。但是,由于这是我将在linux上执行的操作,因此希望有人能提供答案。

我有一个在线excel文件(.xlsx),该文件会定期(由其他人)更新。我想编写一个脚本并将其作为cronjob放入以便处理该excel工作表。但是要做到这一点,我需要将其转换成一个.csv用分号分隔的列的文本文件(so )。不幸的是,不能用逗号分隔,因为有些列中有逗号。是否完全可以从Shell进行转换?我已经安装了Open office,并且可以使用其GUI来执行此操作,但是想知道是否可以从命令行执行此操作。谢谢!

PS:我也有一台Mac机器,所以如果某些解决方案可以在那里工作,那也很好。:)

Answers:


21

OpenOffice附带了unoconv程序,可以在命令行上执行格式转换。

unoconv -f csv filename.xlsx

对于更复杂的要求,可以Spreadsheet::XLSX在Perl或openpyxlPython中解析XLSX文件。例如,这是一个快速脚本,用于将工作表打印为以分号分隔的CSV文件(警告:未经测试,请直接在浏览器中键入):

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没有随我的OO一起提供,但是我安装了它,并且效果很好(转换为逗号分隔的文件,虽然不是分号)!谢谢!我仍然需要弄清楚如何获取包含逗号的字段。但是还是谢谢你。
allrite

@allrite哦,我错过了分号作为分隔符的要求。我仍然建议使用Python或Perl进行处理。但我还添加了一个脚本(未经测试),可以使用;分隔符将其转换为CSV 。
吉尔(Gilles)'所以

谢谢!我使用了Spreadsheet :: XLSX,但是使用了您提供的CPAN链接中的代码。它有效:)
allrite

1
一个匿名用户对此有疑问
Michael Mrozek


6

我正在使用Perl的xls2csvxls文件转换为csv

不确定是否也可以使用xlsx

关于:

不幸的是,不能用逗号分隔,因为有些列中有逗号

这就是为什么引入了报价的原因:

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

感谢您的提示,我会尝试的。我仍然更喜欢用分号分隔,因为在进行csv转换后,该文件将通过awk脚本进行处理。而且分号作为字段分隔符更容易通过awk。我可以在引号内寻找逗号来替换其他内容...现在是另一个问题:)
引发

谢谢@neurino。我改用Gilles方法,但无论如何还是感谢您的答复。
allrite

1

我使用PHP。只需从http://phpexcel.codeplex.com/安装PHPExel库 ,也许您也需要XML函数。

这是我的代码:

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

您可以还原该过程或使用其他Excel / CSV格式。查看PHPExcel目录中的不同php文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.