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

入力に。


これが簡潔ですが完全な解決策であり、このようなファイルを2次元配列に抽出します。

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 に答える