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

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

我意识到这是不是一个完全与 UNIX/Linux 相关的问题。但由于这是我将在 Linux 上做的事情,我希望有人能给出答案。

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

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

答案1

OpenOffice 附带乌诺夫程序在命令行上执行格式转换。

unoconv -f csv filename.xlsx

对于更复杂的需求,您可以使用以下命令解析 XLSX 文件Spreadsheet::XLSX在 Perl 或openpyxl在Python中。例如,下面是一个快速脚本,用于将工作表打印为以分号分隔的 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

答案2

https://github.com/dilshod/xlsx2csv

对我来说效果很好。在 Mac Book Pro SSD 上转换大约 85 MB XLSX 文件大约需要 3 分钟。

答案3

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

不确定它是否xlsx也适用。

关于:

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

这就是引入引用的原因:

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

答案4

我使用 PHP。只需安装 PHPExel 库即可http://phpexcel.codeplex.com/ 也许您还需要 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 文件。

相关内容