我正在尝试将.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文件。
提前致谢。
曼
答案 0 :(得分:2)
如果您的代码正常运行,那么为什么还需要更好的代码呢?如果只是为了速度,你需要找到一种方法来避免编写临时的.csv文件。文件IO很慢,您正在编写,然后重新读取和重新分析。您是否可以将数据读入哈希值,然后使用XML::Simple
或CPAN上的任何其他XML模块将其转储到XML文件中?再次编写CSV,重读,重新分析和编写XML将会很慢!
答案 1 :(得分:1)
您是否可以访问包含excel 2007或更高版本的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 :(得分:0)
github上有一个开发轻量级XLSX reader的项目。它目前处于某种alpha状态,但确实有效。你可以试试。