我意识到这是不是一个完全与 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 的xls2csv将xls
文件转换为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 文件。