我知道可以通过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’)
答案 0 :(得分:2)
我使用XPath解析器从这样的文件中提取我需要的东西,在./Cell/Data
节点内的//Row
节点上进行迭代,但是没有使用与Spreadsheet::ParseExcel
相同的接口。
我还发现在使用XML解析器之前需要先进行一些源过滤。至少你必须运行
s/<xml version>/<!-- xml version -->/;
s/&/&/g
输入。
这是一个简洁但完整的解决方案,将这样的文件解压缩为二维数组:
use XML::XPath;
open F, '<', $dirty_file_name;
open G, '>', $clean_file_name;
while(<F>) {
s/<xml version>/<!-- xml version -->/;
s/&/&/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;