免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2992 | 回复: 5
打印 上一主题 下一主题

用 Perl 读写 Excel 文件(转帖) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-09-13 10:51 |只看该作者 |倒序浏览
使用 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 的指南。

论坛徽章:
0
2 [报告]
发表于 2003-09-13 14:18 |只看该作者

用 Perl 读写 Excel 文件(转帖)

十分感谢:)

原文在此:
http://www-900.ibm.com/developerWorks/cn/linux/sdk/perl/culture-8/index.shtml

论坛徽章:
0
3 [报告]
发表于 2006-02-08 15:03 |只看该作者
这个模块有办法避免修改excel文件后弹出“是否保存”对话框,直接保存文件吗?

论坛徽章:
0
4 [报告]
发表于 2006-02-08 22:20 |只看该作者
谢谢共享!

论坛徽章:
0
5 [报告]
发表于 2006-02-09 14:44 |只看该作者
这么强

论坛徽章:
0
6 [报告]
发表于 2006-02-09 14:56 |只看该作者
好帖,试试看,问题是怎么能把那些表情给屏蔽掉!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP