设置首页  |   加入收藏  |  联系我们   
您的位置: 主页>Linux知识>Linux程序设计>正文
用功能强大的Perl读写Excel文件
文章来源:IBM DW中国   编辑:  发布时间:2007-11-01

直到最近才开启了通往 Microsoft Excel 这个最流行的桌面电子表格应用程序的大门。本文研究了在 Windows 和 Linux 中怎么样使用 Perl 和几个简单模块读写 Excel 文件。本文的作者 Teodor Zlatanov 是一名 Perl 专家,自 1992 年起,他一直在该社区中工作,在他涉足的各种领域中,他专长于文本解析中的开放源码工作。

解析 Excel 文件提出了一个无论如何看都很困难的难题。直到去年,UNIX 模块还完全不可用,并且只能用 Win32::OLE 模块来检索来自 Windows Excel 文件的数据。但由于两位 Perl 高手和许多志愿者的帮助和奉献,情况最终得以改变!

Spreadsheet::WriteExcel 和 Spreadsheet::ParseExcel

在 2000 年,Takanori Kawai 和 John McNamara 编写出了 Spreadsheet::WriteExcelSpreadsheet::ParseExcel 模块并将它们张贴在 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::ParseExcelSpreadsheet::WriteExcel 模块是困难的。PPM 没有历史记录,难以设置选项,帮助会滚出屏幕并且缺省方式是忽略相关性而安装。您可以从命令行输入“ppm”然后发出以下命令来调用 PPM:


清单 1:安装 Excel 模块的 PPM 命令
ppm> install OLE::Storage_Lite
ppm> install Spreadsheet::ParseExcel
ppm> install Spreadsheet::WriteExcel

在这种情况下,该模块的安装将失败,因为 IO::Scalar 还不可用,因此,您可能想放弃 PPM 问题的查找,而转向内置的 Win32::OLE 模块。然而,在您阅读本文时,ActiveState 可能已经发布了该问题的修正。

有了 ActiveState 的 Win32::OLE ,您可以使用下面所列的代码逐个单元地转储工作表:

下载 win32excel.pl


清单 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;



Tags:文件 Excel 模块 安装 使用 Perl Win32::OLE the 数据
Google
 

上一篇: 学习使用Perl 5.8.6 中的Unicode 特性   下一篇: Python anygui 项目预览
【返回顶部】 【打印】 【大】 【中】 【小】 【关闭】

 我来说两句
用户名: 新注册) 密码: 匿名评论 [论坛讨论]
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 相关文章
 热门文章

 
版权所有  2005-2006  Linux集中营  闽ICP备07500055号