修改.xlsx文件(Excel 2007及更高版本)

时间:2013-09-19 15:39:30

标签: perl excel xlsx

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

然而,使用xlsx文件是完全不同的事情。 我试图弄清楚如何使用Spreadsheet::XLSX进行解析以及如何使其与Excel::Writer::XLSX一起使用。 Spreadsheet::ParseExcel::SaveParser有一个SaveAs()方法,可以在已解析的Spreadsheet::WriteExcel文件中应用xml方法,但我不明白如何使其与xlsx文件一起使用< / p>

编辑: 使用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');

现在,在解析xlsx文件之后,我想向它添加一些数据,我不知道该怎么做。 正如您在使用Spreadsheet::ParseExcel::SaveParser时所见,我使用了SaveAs()函数, 但是Spreadsheet::XLSX没有SaveAs()方法。那么如何将数据添加到已解析的xlsx文件?

我在link中找不到我的问题的答案。

感谢您的帮助:)

3 个答案:

答案 0 :(得分:2)

Spreadsheet :: XLSX模块是 Parser ,即它不应该写文件,只是为了阅读和理解它们。

要将文件写回磁盘,我建议您使用John McNamara的优秀(没有双关语:) :) 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

答案 1 :(得分:0)

试试这个: -

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

答案 2 :(得分:0)

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