3

我知道常规(二进制)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>

除了手动将其解析为通用 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’)
4

1 回答 1

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;
于 2013-02-22T20:42:34.800 回答