- 论坛徽章:
- 0
|
使用 Spreadsheet::WriteExcel 和 Spreadsheet: arseExcel 模块
直到最近才开启了通往 Microsoft Excel 这个最流行的桌面电子表格应用程序的大门。本文研究了在 Windows 和 Linux 中如何使用 Perl 和几个简单模块读写 Excel 文件。本文的作者 Teodor Zlatanov 是一名 Perl 专家,自 1992 年起,他一直在该社区中工作,在他涉足的各种领域中,他专长于文本解析中的开放源码工作。
解析 Excel 文件提出了一个无论怎样看都很困难的难题。直到去年,UNIX 模块还完全不可用,并且只能用 Win32::OLE 模块来检索来自 Windows Excel 文件的数据。但由于两位 Perl 高手和许多志愿者的帮助和奉献,情况最终得以改变!
Spreadsheet::WriteExcel 和 Spreadsheet: arseExcel
在 2000 年,Takanori Kawai 和 John McNamara 编写出了 Spreadsheet::WriteExcel 和 Spreadsheet: arseExcel 模块并将它们张贴在 CPAN 上,这两个模块使得在任何平台上从 Excel 文件抽取数据成为可能(尽管不容易)。
正如我们在稍后将看到的,如果您正在使用 Windows,Win32::OLE 仍提供一个更简单、更可靠的解决方案,并且 Spreadsheet::WriteExcel 模块建议使用 Win32::OLE 来进行更强大的数据和工作表操纵。Win32::OLE 带有 ActiveState Perl 工具箱,可以用来通过 OLE 驱动许多其它 Windows 应用程序。请注意,要使用此模块,您仍需要在机器上安装和注册一个 Excel 引擎(通常随 Excel 本身安装)。
需要解析 Excel 数据的应用程序数以千计,但是这里有几个示例:将 Excel 导出到 CSV、与存储在共享驱动器上的电子表格交互、将金融数据移至数据库以便形成报告以及在不提供任何其他格式的情况下分析数据。
要演示这里给出的示例,必须在您的系统上安装 Perl 5.6.0。您的系统最好是最近(2000 年或以后)的主流 UNIX 安装(Linux、Solaris 和 BSD)。虽然这些示例在以前版本的 Perl 和 UNXI 以及其他操作系统中也可以使用,但是您应该考虑到您将面对那些它们无法作为练习发挥作用的情况。
Windows 示例:解析
本节仅适用于 Windows 机器。所有其它各节适用于 Linux。
在进行之前,请安装 ActiveState Perl(这里使用版本 628)或 ActiveState Komodo IDE 以编辑和调试 Perl。Komodo 为家庭用户提供一个免费许可证,您大概在几分钟之内就可以得到它。(有关下载站点,请参阅本文后面的参考资料。)
使用 ActiveState PPM 软件包管理器安装 Spreadsheet: arseExcel 和 Spreadsheet::WriteExcel 模块是困难的。PPM 没有历史记录,难以设置选项,帮助会滚出屏幕并且缺省方式是忽略相关性而安装。您可以从命令行输入“ppm”然后发出以下命令来调用 PPM:
清单 1:安装 Excel 模块的 PPM 命令
ppm>; install OLE::Storage_Lite
ppm>; install Spreadsheet: arseExcel
ppm>; install Spreadsheet::WriteExcel
在这种情况下,该模块的安装将失败,因为 IO::Scalar 还不可用,因此,您可能想放弃 PPM 问题的查找,而转向内置的 Win32::OLE 模块。然而,在您阅读本文时,ActiveState 可能已经发布了该问题的修正。
有了 ActiveState 的 Win32::OLE,您可以使用下面所列的代码逐个单元地转储工作表:
清单 2:win32excel.pl
#!/usr/bin/perl -w
use strict;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
$Win32::OLE::Warn = 3; # die on errors...
# get already active Excel application or open new
my $Excel = Win32::OLE->;GetActiveObject('Excel.Application')
|| Win32::OLE->;new('Excel.Application', 'Quit');
# open Excel file
my $Book = $Excel->;Workbooks->;Open("c:/komodo projects/test.xls" ;
# You can dynamically obtain the number of worksheets, rows, and columns
# through the Excel OLE interface. Excel's Visual Basic Editor has more
# information on the Excel OLE interface. Here we just use the first
# worksheet, rows 1 through 4 and columns 1 through 3.
# select worksheet number 1 (you can also select a worksheet by name)
my $Sheet = $Book->;Worksheets(1);
foreach my $row (1..4)
{
foreach my $col (1..3)
{
# skip empty cells
next unless defined $Sheet->;Cells($row,$col)->;{'Value'};
# print out the contents of a cell
printf "At ($row, $col) the value is %s and the formula is %s\n",
$Sheet->;Cells($row,$col)->;{'Value'},
$Sheet->;Cells($row,$col)->;{'Formula'};
}
}
# clean up after ourselves
$Book->;Close;
请注意,您可以用以下方式很轻松地为单元分配值:
$sheet->;Cells($row, $col)->;{'Value'} = 1;
如果您正在使用 Windows 机器,请坚持使用 Win32::OLE 模块,除非您的机器上根本没有 Excel。虽然 Spreadsheet::WriteExcel 和 Spreadsheet: arseExcel 模块的功能正不断完善,但 Win32::OLE 是目前获得 Excel 数据的最简便方式。
在 UNIX,特别是 Linux 上,请使用 Spreadsheet::WriteExcel 和 Spreadsheet: arseExcel 模块对 Excel 数据进行编程访问。但是事先警告:它们还是相当不成熟的模块,如果您需要稳定性,则它们可能不适合您。
您还可以考虑象 Gnumeric 和 StarOffice(请参阅参考资料)这样的软件包,可以免费获得它们,而且它们提供一个完整的 GUI 界面和 Excel 文件的导入/导出能力。如果您不需要对 Excel 数据进行编程访问,则它们很有用。这两个应用程序我都用过,我发现它们对于日常工作很不错。
参考资料
===============================================
ActiveState 编写了极佳的 ActiveState Perl 工具箱和 Komodo 开发环境。
请访问 CPAN 以查找您所感兴趣的所有 Perl 模块。
Gnumeric 提供了一个完整的 GUI 界面和 Excel 文件的导入/导出能力。
Perl.com 提供了关于 Perl 信息和相关资源。
perldoc.com 有在线的 Perldoc 信息。
Spreadsheet::WriteExcel 模块使得在任何平台上从 Excel 文件抽取数据成为可能。还可以从 CPAN 获得更多信息。
Spreadsheet: arseExcel 与 Spreadsheet::WriteExcel 协同工作。还可以从 CPAN 获得更多信息。
" rogramming Perl Third Edition" 由 Larry Wall、Tom Christiansen 和 Jon Orwant 著(O'Reilly & Associates,2000),这本书是现今最好的、针对 Perl 5.005 和 5.6.0 的指南。 |
|