2013-02-22 23 views
3

我知道普通(二進制)Excel文件可以通過Spreadsheet::ParseExcel進行處理。對於HTML MS Excel文件,一個好的CPAN解析器是什麼?

不過,我有一個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’) 

回答

2

我使用XPath解析器來提取我從這樣的文件需要,迭代的//Row節點內./Cell/Data節點,但不是使用與Spreadsheet::ParseExcel相同的界面。

我還發現,在使用XML解析器之前,您需要進行一些源過濾。至少您必須運行

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

上的輸入。


這裏有一個簡潔而完整的解決方案,提取這樣的文件,以一個2-d數組:

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; 
+0

沒有專門建造的CPAN模塊?我感到震驚! – DVK 2013-02-22 21:09:38

+0

這是你的錯誤機會。捆綁@暴徒的解決方案與一些額外的輔助方法,你有一個勝利者。 – 2013-02-22 21:43:13

+0

我不能相信@mob使用全局文件句柄! * \ *昏倒\ ** – DVK 2013-02-23 00:23:19

相關問題