2012-03-15 54 views
1

Spreadsheet::ParseExcel可以正常工作,但是我需要一种方法来读取没有它的文件,可以说“随带Perl”,因为我无法安装任何PM或CPAN模块。有没有人有建议让我开始?如何用Perl读取excel文件?

+1

[Are](http://shadow.cat/blog/matt-s-trout/but-i-cant -use-cpan /)[you](http://www.perlmonks.org/?node=693828)[sure](http://twiki.org/cgi-bin/view/TWiki/HowToInstallCpanModules#Setting_a_private_CPAN_librar)[你](http://twiki.org/cgi-bin/view/TWiki/HowToInstallCpanModules#Installing_CPAN_modules_manually)[can not](http://linuxgazette.net/139/okopnik.html)[use](http:/ /www.thegeekstuff.com/2008/09/how-to-install-perl-modules-manually-and-using-cpan-command/)[CPAN](http://www.activestate.com/blog/2010/ 10 /如何安装,CPAN模块-的activeperl)? – mob 2012-03-15 17:16:12

+0

完全确定...不是超级用户,请求被拒绝 – isJustMe 2012-03-15 17:17:44

+4

您可以使用模块而不需要以根用户身份进行安装。 – 2012-03-15 17:22:16

回答

5

什么是使用CPAN模块相对轻松的工作实际上是没有他们非常困难。

对于打开Excel二进制数据(BIFF)存储在另一个二进制文件格式称为OLE复合文件,这就像一个文件内的文件系统,BIFF数据可能不会被顺序存储,所以开始时你必须编写一个解析器来获取数据。

一旦提取了原始BIFF数据,您必须解析它才能找到单元数据。这样稍微简单一点,但仍然存在诸如将字符串存储在离开单元数据的散列表中的困难。和日期无法区分纯数字。和合并单元格中的数据。而且一切仍然是二进制的,位掩码控制着数据结构的含义。

幸运的是,所有这些令人头疼的事情已经被其他人所困扰,并且被包裹在module之中,所以没有其他人必须忍受它们。

因此,即使您的管理员不会为您安装模块,也有很多方法可以在本地使用install modules或甚至install perl,这样您就不必打扰他们。最后,这可能会是一个更简单的解决方案。

*我部分地。

+0

麦克纳马拉先生,我是你的工作的粉丝,我会听取你的意见和追求模块的安装。 – isJustMe 2012-03-15 18:36:12

2

OpenDocument is an ISO standard所以你可能阅读规范并编写你自己的解析器。

CPAN模块的存在是因为有很多事情(一些简单的,一些复杂的),人们想做的事情不适合成为核心语言的一部分。解析Excel电子表格就是其中之一(更复杂的一个)。

您应该修复阻碍您安装模块的障碍。它可能是管理性的(在这种情况下,您需要游说以更改策略),它可能是技术性的(在这种情况下,您可能需要了解local::lib

+0

感谢您的建议,而不是我正在寻找的答案。 – isJustMe 2012-03-15 18:25:38

+0

对不起,我以为我看到在之前的评论中导出为CSV是一个选项。我现在看到我错了。 – 2012-03-19 05:46:37

0

将电子表格导出到csv文件并解析它有或没有Text::CSV

+0

感谢您的建议,这实际上是我想要做的..读取文件并通过Perl导出为CSV。我需要这个以编程方式进行。 – isJustMe 2012-03-15 17:35:23

+0

你可以下载[XLS2CSV](http://download.cnet.com/XLS2CSV/3000-2079_4-10718456.html)吗? – mob 2012-03-15 17:54:18

+0

是的,我可以但最新的用途呢?不妨将单击文件另存为excel中的csv。 – isJustMe 2012-03-15 18:12:11

0

我将基于@mob关于Text :: CSV的上述回答。前一段时间,我在CPAN上发现Text:CSV::Slurp,并且是即时转换。它采用带有标题行的CSV文件并返回hashref的arrayref,其中的键是标题行中的名称。很明显,这在所有情况下都不起作用,但如果它确实代码很简单:

my $slurp = Text::CSV::Slurp->new; 
my $data = $slurp->load(file => $filename); 
for my $record (@$data) { 
    ... 
} 
+0

谢谢,问题是我必须解析一个XLS文件而不是CSV – isJustMe 2012-03-17 19:39:34