.xlsx到Perl中的xml转换

我正在尝试将.xlsx文件转换为.xml文件。 .xlsx文件的第一行(标题)将成为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文件。

提前致谢。

如果你的代码正在工作,那么为什么你需要更好的东西? 如果只为了速度,你需要find一种避免写入临时.csv文件的方法。 文件IO速度慢,你正在写,然后重新读取和重新分析。 你不能将数据读入散列,然后使用XML::Simple或CPAN上的其他任何XML模块将其转储到XML文件中? 再次编写一个CSV文件,重读,重新编写和写入XML将会很慢!

你有没有进入一个Wi​​ndows框与Excel 2007或更高版本? 那么你可以做一些事情:

 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(); 

githup上有一个项目来开发一个轻量级的XLSX阅读器 。 它目前处于一种alpha状态,但它确实有效。 你可以尝试,如果你喜欢。