什么是HTML MS Excel文件的优秀CPAN解析器?

时间:2013-02-22 20:05:02

标签: perl parsing html-parsing excel

我知道可以通过Spreadsheet::ParseExcel处理常规(二进制)Excel文件。

但是,我有一个HTML格式的文件:

<html xmlns:x="urn:schemas-microsoft-com:office:excel">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=windows-1252">
<!--[if gte mso 9]>
<xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>Holdings</x:Name>
<x:WorksheetOptions>

如果没有手动将其解析为通用HTML文件(例如TreeBuilder等),是否有一个CPAN模块可以解析并让我访问这样的文件作为电子表格,类似于Spreadsheet::ParseExcel

这是模块不起作用的地方:

#!/usr/local/bin/perl
use strict; use warnings;
use Spreadsheet::ParseExcel;
my $parser   = Spreadsheet::ParseExcel->new();
my $file     = 'file1.xls';
my $workbook;
eval {$workbook   = $parser->Parse($file);}; 
#($Workbook returned here is ‘undef’)

1 个答案:

答案 0 :(得分:2)

我使用XPath解析器从这样的文件中提取我需要的东西,在./Cell/Data节点内的//Row节点上进行迭代,但是没有使用与Spreadsheet::ParseExcel相同的接口。

我还发现在使用XML解析器之前需要先进行一些源过滤。至少你必须运行

s/<xml version>/<!-- xml version -->/;
s/&/&amp;/g

输入。


这是一个简洁但完整的解决方案,将这样的文件解压缩为二维数组:

use XML::XPath;
open F, '<', $dirty_file_name;
open G, '>', $clean_file_name;
while(<F>) { 
    s/<xml version>/<!-- xml version -->/;
    s/&/&amp;/g;
    print G
}
close G;
close F;

@table = map { [ map { $_->string_value } $_->find('./Cell/Data')->get_nodelist ]
  } XML::XPath->new( filename => $clean_file_name )->find('//Row')->get_nodelist;