用perl修改xlsx文件
我使用Spreadsheet::ParseExcel::SaveParser
成功parsing了xls
文件,并使用Spreadsheet::WriteExcel
对其进行了修改。
但是使用xlsx
文件是完全不同的事情。 我想弄清楚如何使用Spreadsheet::XLSX
parsing,以及如何使它与Excel::Writer::XLSX
。 Spreadsheet::ParseExcel::SaveParser
有一个SaveAs()
方法,可以在分析的xml
文件上应用Spreadsheet::WriteExcel
方法,但我不明白如何使它与xlsx文件一起工作
编辑:当使用Spreadsheet::ParseExcel::SaveParser
和Spreadsheet::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::XLSX
和Excel::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}); } } }