8

xlsを使用してファイルを正常に解析しSpreadsheet::ParseExcel::SaveParser、変更しましたSpreadsheet::WriteExcel

ただし、xlsxファイルの操作はまったく別のものです。Spreadsheet::XLSX解析のためにどのように作業するか、そしてそれをどのように動作させるかを理解しようとしていExcel::Writer::XLSXます。 解析済みファイルにメソッドを適用できるようにするSpreadsheet::ParseExcel::SaveParserメソッドがありますが、xlsx ファイルで機能させる方法がわかりませんSaveAs()Spreadsheet::WriteExcelxml

編集:使用するとき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::XLSXandを使用しようとしています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::XLSXSaveAs()xlsx

このリンクで私の質問に対する答えが見つかりませんでした。

助けてくれてありがとう:)

4

3 に答える 3

2

Spreadsheet::XLSX モジュールはパーサーです。つまり、ファイルを書き込むことは想定されておらず、ファイルを読み取って理解することのみを想定しています。

ファイルをディスクに書き戻すには、 John McNamara による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
于 2016-04-28T07:43:24.430 に答える
0

これを試して:-

スプレッドシート::XLSX を使用します。
my $excel = Spreadsheet::XLSX -> new ('test.xlsx', $converter);

于 2015-05-15T12:43:22.470 に答える
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});
        }
    }
}
于 2016-07-09T13:54:01.613 に答える