【发布时间】:2010-10-30 21:34:48
【问题描述】:
有没有一种简单的方法可以在不启动 Excel 窗口应用程序的情况下将 XLS 转换为 CSV 格式的文件?
我需要使用脚本处理一些 Excel XLS 工作簿。为此,我需要将 xls 文件转换为 csv 文件。这可以通过 Excel 应用程序中的另存为来完成。但是,我想自动化这个(所以,不要打开 Excel 应用程序窗口)。
如果将工作簿中的第一张工作表翻译成 CSV 格式就足够了。 我只需要处理该表中的数据。
我的系统上安装了 Cygwin 和 Excel -- 如果有帮助的话。
编辑:好的,我有一个使用 Perl 的有效解决方案。更新以供他人将来使用。
我安装了 Spreadsheet::ParseExcel 模块。 然后使用read-excel.pl 示例。
我的代码是这个示例代码的轻微变化,如下所示。
#!/usr/bin/perl -w
# For each tab (worksheet) in a file (workbook),
# spit out columns separated by ",",
# and rows separated by c/r.
use Spreadsheet::ParseExcel;
use strict;
my $filename = shift || "Book1.xls";
my $e = new Spreadsheet::ParseExcel;
my $eBook = $e->Parse($filename);
my $sheets = $eBook->{SheetCount};
my ($eSheet, $sheetName);
foreach my $sheet (0 .. $sheets - 1) {
$eSheet = $eBook->{Worksheet}[$sheet];
$sheetName = $eSheet->{Name};
print "#Worksheet $sheet: $sheetName\n";
next unless (exists ($eSheet->{MaxRow}) and (exists ($eSheet->{MaxCol})));
foreach my $row ($eSheet->{MinRow} .. $eSheet->{MaxRow}) {
foreach my $column ($eSheet->{MinCol} .. $eSheet->{MaxCol}) {
if (defined $eSheet->{Cells}[$row][$column])
{
print $eSheet->{Cells}[$row][$column]->Value . ",";
} else {
print ",";
}
}
print "\n";
}
}
更新:这是一个 Powershell 脚本,可能也很容易使用; 原样来自this MSDN blogand, SO Reference。
$excel = New-Object -comobject Excel.Application
$workbooks = $excel.Workbooks.Open("C:\test.xlsx")
$worksheets = $workbooks.Worksheets
$worksheet = $worksheets.Item(1)
$range = $worksheet.UsedRange
foreach($row in $range.Rows)
{
foreach($col in $row.Columns)
{
echo $col.Text
}
}
更新:我最近在Superuser answer 遇到了一个 Windows 工具 CSVed,它可能对某些人有用。
【问题讨论】:
-
New-Object -comobject Excel.Application看起来它会启动 Excel 应用程序——你说过你不想这样做。 -
@John,感谢您指出这一点。我喜欢并使用了 Perl 解决方案。
-
这是一个很好的问题。我设法运行代码并按预期返回用逗号分隔的 Excel 条目。抱歉这个愚蠢的问题,但如何将最终信息实际保存在 csv 文件中?