什么是一个很好的CPANparsing器的HTML MS Excel文件?
我知道常规(二进制)Excel文件可以通过Spreadsheet::ParseExcel
进行处理。
但是,我有一个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>
没有手动parsing它作为一个通用的HTML文件(如TreeBuilder等),是否有一个CPAN模块,将parsing,让我像电子表格访问这样的文件,类似于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')
我使用XPathparsing器从这样的文件中提取需要的东西,在//Row
节点内部的./Cell/Data
节点上迭代,但不是使用与Spreadsheet::ParseExcel
相同的接口。
我还发现,在使用XMLparsing器之前,您需要进行一些源过滤。 至less你必须跑步
s/<xml version>/<!-- xml version -->/; s/&/&/g
在input。
这是一个简洁但完整的解决scheme,将这样的文件提取到一个二维数组:
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;