用perl修改xlsx文件

我使用Spreadsheet::ParseExcel::SaveParser成功parsing了xls文件,并使用Spreadsheet::WriteExcel对其进行了修改。

但是使用xlsx文件是完全不同的事情。 我想弄清楚如何使用Spreadsheet::XLSXparsing,以及如何使它与Excel::Writer::XLSXSpreadsheet::ParseExcel::SaveParser有一个SaveAs()方法,可以在分析的xml文件上应用Spreadsheet::WriteExcel方法,但我不明白如何使它与xlsx文件一起工作

编辑:当使用Spreadsheet::ParseExcel::SaveParserSpreadsheet::WriteExcel我可以写:

 #!/usr/bin/perl -w use strict; use Spreadsheet::ParseExcel; use Spreadsheet::ParseExcel::SaveParser; # Open the template with SaveParser my $parser = new Spreadsheet::ParseExcel::SaveParser; my $template = $parser->Parse('template.xls'); # Rewrite the file or save as a new file $workbook = $template->SaveAs('new.xls'); # Use Spreadsheet::WriteExcel methods my $worksheet = $workbook->sheets(0); $worksheet->write($row+2, $col, "World2"); $workbook->close(); 

我想用xlsx文件做同样的事情。 因此我试图使用Spreadsheet::XLSXExcel::Writer::XLSX 。 代替

 my $parser = new Spreadsheet::ParseExcel::SaveParser; my $template = $parser->Parse('template.xls'); 

我用

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

现在,parsingxlsx文件后,我想添加一些数据,我不知道该怎么做。 正如你在上面看到的,当使用Spreadsheet::ParseExcel::SaveParser我使用了SaveAs()函数,但Spreadsheet::XLSX没有SaveAs()方法。 那么如何将数据添加到已parsing的xlsx文件?

我在这个链接找不到我的问题的答案。

谢谢你的帮助:)

Spreadsheet :: XLSX模块是一个parsing器 ,即它不应该写入文件,只能读取和理解它们。

要将文件写回到磁盘,我build议你的优秀(没有双关语:))约翰麦克纳马拉Excel :: Writer :: XLSX

http://search.cpan.org/~jmcnamara/Excel-Writer-XLSX/lib/Excel/Writer/XLSX.pm

基本上,你可以将(通过Spreadsheet :: XLSX)XLSX文件转换成一个多级哈希引用,如下所示:

 $xlsx_as_read->{worksheet_name}->{column}->{row}=value; 

修改您发布的CPAN链接上的示例:

 use Text::Iconv; my $converter = Text::Iconv -> new ("utf-8", "windows-1251"); # Text::Iconv is not really required. # This can be any object with the convert method. Or nothing. use Spreadsheet::XLSX; my $xlsx_as_read; my $excel = Spreadsheet::XLSX -> new ('test.xlsx', $converter); foreach my $sheet (@{$excel -> {Worksheet}}) { printf("Sheet: %s\n", $sheet->{Name}); $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) { $xlsx_as_read->{$sheet->{Name}}->{$col}->{$row}=$cell -> {Val}; } } } } 

然后将其倒回到可写入磁盘的Excel :: Writer :: XLSX工作簿中。

 my $new_workbook = Excel::Writer::XLSX->new( 'output_file_name.xlsx' ); #populate cells with a loop similar to the one before, #iterating on $xlsx_as_read 

尝试这个:-

使用Spreadsheet :: XLSX;
我的$ excel = Spreadsheet :: XLSX – > new('test.xlsx',$ converter);

 my $excel_xlsx = Spreadsheet::XLSX -> new ('input_x.xlsx'); my ($sheet_xlsx, $row, $col, $cell); 

请立即在xls文件中写下内容:

 my $excel_xls = Spreadsheet::WriteExcel->new('input.xls'); my $sheet_xls = $excel_xls->add_worksheet(); 

取内容:

 for $sheet_xlsx ( @{ $excel_xlsx->{Worksheet} } ) { for $row ( $sheet_xlsx->{MinRow} .. $sheet_xlsx->{MaxRow} ) { for $col ( $sheet_xlsx->{MinCol} .. $sheet_xlsx->{MaxCol} ) { my $cell = $sheet_xlsx->{Cells}[$row][$col]; if($cell->{Val}) { } 

写在这里的xls:

  $sheet_xls->write($row, $col, $cell->{Val}); } } }