2011-03-04 84 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状态,但它确实有效。如果你喜欢,你可以试试。