我使用
xls
成功解析了 Spreadsheet::ParseExcel::SaveParser
文件,并使用 Spreadsheet::WriteExcel
对其进行了修改。
但是使用
xlsx
文件是完全不同的事情。
我正在尝试弄清楚如何使用 Spreadsheet::XLSX
进行解析以及如何使其与 Excel::Writer::XLSX
一起使用。 Spreadsheet::ParseExcel::SaveParser
有一个 SaveAs()
方法,可以在解析的 Spreadsheet::WriteExcel
文件上应用 xml
方法,但我不明白如何使其与 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');
现在,在解析
xlsx
文件后,我想向其中添加一些数据,但我不知道该怎么做。
正如您在上面使用 Spreadsheet::ParseExcel::SaveParser
时看到的那样,我使用了 SaveAs()
函数,
但 Spreadsheet::XLSX
没有 SaveAs()
方法。那么如何将数据添加到已解析的 xlsx
文件中?
我无法在此链接中找到我的问题的答案。
谢谢您的帮助:)
Spreadsheet::XLSX 模块是一个 Parser,即它不应该写入文件,而只能读取和理解它们。
要将文件写回磁盘,我建议您使用 John McNamara 的 Excellent(无双关语:))Excel::Writer::XLSX。
http://search.cpan.org/~jmcnamara/Excel-Writer-XLSX/lib/Excel/Writer/XLSX.pm
基本上,您可以将 XLSX 文件(通过 Spreadsheet::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
试试这个:-
使用电子表格::XLSX;
我的 $excel = Spreadsheet::XLSX -> new ('test.xlsx', $converter);
my $excel_xlsx = Spreadsheet::XLSX -> new ('input_x.xlsx');
my ($sheet_xlsx, $row, $col, $cell);
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})
{
}
$sheet_xls->write($row, $col, $cell->{Val});
}
}
}
现在有一个模块可以帮助您将使用 Spreadsheet::ParseXLSX 读取的数据转换为 Excel::Writer::XLSX 可以写入的对象。如果有一个模块可以完成所有这些工作,那就太好了,但据我所知,还没有最好的模块。因此,现在您必须使用三个模块来完成此任务。请参阅 Excel::CloneXLSX::Format