Spreadsheet::ParseExcel可以正常工作,但是我需要一种方法来读取没有它的文件,让我们说“开箱即用Perl”,因为我无法安装任何PM或CPAN模块。有没有人建议让我开始?
答案 0 :(得分:5)
使用CPAN模块相对容易的任务实际上很难没有它们。
首先,Excel二进制数据(BIFF)以另一种称为OLE复合文档的二进制文件格式存储。这就像文件中的文件系统,BIFF数据可能不会按顺序存储。所以要开始你必须编写一个解析器来获取数据。
提取原始BIFF数据后,您必须解析它以查找单元格数据。这有点容易但仍然包含诸如字符串存储在远离单元数据的散列表中的困难。与普通数字无法区分的日期。合并单元格中的数据。一切都仍然是二进制的,位掩码控制着数据结构的含义。
幸运的是,所有这些令人头痛的事情都被其他人*所困扰,并被module所包围,所以没有人能够忍受他们。
因此,即使您的管理员不会为您安装模块,也有很多方法可以在本地install modules甚至install perl进行操作,这样您就不必为此烦恼了。最后,这可能是一个更容易的解决方案。
*我是部分。
答案 1 :(得分:2)
OpenDocument is an ISO standard所以你可以阅读规范并为它编写自己的解析器。
存在CPAN模块,因为有些东西(人们想要做的很简单,有些复杂)不适合成为核心语言的一部分。解析Excel电子表格就是其中之一(其中一个比较复杂的)。
您应该修复阻止您安装模块以帮助的任何障碍。它可能是管理性的(在这种情况下,您需要游说以更改策略),它可能是技术性的(在这种情况下,您可能只需要了解local::lib
。
答案 2 :(得分:0)
将电子表格导出到csv文件,并使用或不使用Text::CSV
进行解析。
答案 3 :(得分:0)
我将基于@mob关于Text :: CSV的上述答案。前段时间我在CPAN上找到了Text:CSV::Slurp并且是一个即时转换。它采用带有标题行的CSV文件,并返回hashrefs的arrayref,其中键是标题行中的名称。显然这并不适用于所有情况,但如果确实如此,您的代码很简单:
my $slurp = Text::CSV::Slurp->new;
my $data = $slurp->load(file => $filename);
for my $record (@$data) {
...
}