2011-03-04 107 views
1

我正在嘗試將.xlsx文件轉換爲.xml文件。 .xlsx文件的第一行(標題)將成爲xml文件的標籤。.xlsx轉換爲Perl中的xml轉換

我已經寫了下面的代碼這是工作細

open(XML, ">temp.csv") or die "not able to open $!"; 

use Spreadsheet::XLSX; 
my $excel = Spreadsheet::XLSX -> new ('test.xlsx'); 

foreach my $sheet (@{$excel -> {Worksheet}}) { 
     $sheet -> {MaxRow} ||= $sheet -> {MinRow}; 
     foreach my $row ($sheet -> {MinRow} .. $sheet -> {MaxRow}) { 
       $sheet -> {MaxCol} ||= $sheet -> {MinCol}; 
       foreach my $col ($sheet -> {MinCol} .. $sheet -> {MaxCol}) { 
         my $cell = $sheet -> {Cells} [$row] [$col]; 
         if ($cell) { 
          print XML $cell -> {Val}; 
         } 
         unless($col == $sheet -> {MaxCol}) {print XML ",";} 
       } 
       unless($row == $sheet -> {MaxRow}){print XML "\n";} 
     } 
    } 
close(XML); 
use XML::CSV; 
my $csv_obj = XML::CSV->new(); 
    $csv_obj->parse_doc("temp.csv", {headings => 1}); 
    $csv_obj->print_xml("out.xml"); 

任何人都可以提出一個更好的代碼(模塊),因爲我必須處理大量的.xlsx文件。

在此先感謝。

回答

1

你有2007或更高它的Excel訪問Windows中?然後你可以做類似的事情:

my $excel = Win32::OLE->new('Excel.Application') 
    or die "Could Not Start Excel.\n"; 
$excel->{ 'Visible' }   = 0; 
$excel->{ DisplayAlerts }  = 0; 

my $workbook = $excel->Workbooks->Open('test.xlsx'); 

#save as Spreadsheet XML (46) 
# 51 = xlsx, more mappings here: http://www.datapigtechnologies.com/downloads/Excel_Enumerations.txt 
$workbook->SaveAs($output_file, 46); 
$workbook->Close(); 
$excel->Quit(); 
2

如果你的代碼工作,那麼爲什麼你需要更好的東西?如果僅用於速度,則需要找到避免寫入臨時.csv文件的方法。文件IO速度很慢,您正在編寫然後重新讀取和重新分析。您是否可以不將數據讀入散列,然後使用類似XML::Simple或CPAN上的任何其他XML模塊將其轉儲到XML文件?再次編寫CSV,重讀,重新編寫和寫入XML將會很慢!

0

在githup上有一個項目來開發輕量級XLSX reader。它目前處於某種alpha狀態,但它確實有效。如果你喜歡,你可以試試。