使用 Spreadsheett::ParseXLSX 从 .xlsx 文件复制单元格格式以使用 EXCEL:WRITER::XLSX 写入另一个单元格?

Copy the cell format from .xlsx file using Spreadsheett::ParseXLSX to write another cell using EXCEL:WRITER::XLSX?

请检查下面的代码。如果我从最后一行删除 $format 到 $sheet_write->write($row, $col,$cell -> value) 然后它工作正常。

我声明要在 excel_2 电子表格中添加由 "Excel::Writer::XLSX;" 包编写的格式。我正在处理来自另一个 reader 解析器“use Spreadsheet::ParseXLSX”的单元格格式($format= $cell->get_format();) .任何帮助,将不胜感激。我预计这两种不同的方法之间存在一些不匹配。

#!/home/utils/perl-5.24/5.24.2-058/bin/perl -w
use strict;
use warnings;


use Excel::Writer::XLSX;
use Spreadsheet::ParseXLSX;


my $parser   = Spreadsheet::ParseXLSX->new();
my $workbook = $parser->parse('abc.xlsx');
my $excel_2 = Excel::Writer::XLSX -> new ('abc_copied.xlsx');

my $format = $excel_2->add_format();

if ( !defined $workbook ) {
    die $parser->error(), ".\n";
}


for my $worksheet ( $workbook->worksheets() ) {

    my ( $row_min, $row_max ) = $worksheet->row_range();
    my ( $col_min, $col_max ) = $worksheet->col_range();
    printf("Sheet: %s\n", $worksheet->{Name});

    my $sheet_write = $excel_2->add_worksheet($worksheet->{Name});

    for my $row ( $row_min .. $row_max ) {
    for my $col ( $col_min .. $col_max ) {

            my $cell = $worksheet->get_cell( $row, $col );
            next unless $cell;

            print "Row, Col    = ($row, $col)\n";
            #print "Value       = ", $cell->value(),       "\n";
            #print "Unformatted = ", $cell->unformatted(), "\n";
            #print "\n";
            $format= $cell->get_format();
            $sheet_write->write($row, $col,$cell -> value,$format);

        }
    }
}

Spreadsheet::ParseXLSX 的 cell->get_format 生成的对象与 Excel::Writer::XLSX 在其 write 方法中期望的格式对象不同。尽管它们都处理电子表格,但它们是不同的模块,并且不太可能以这种方式共享 class。

Excel::Writer::XLSX 格式对象的属性有据可查:

https://metacpan.org/pod/Excel::Writer::XLSX#CELL-FORMATTING

我看到有一个克隆格式模块:

https://metacpan.org/pod/Excel::CloneXLSX::Format

没有个人经验,但看起来很有前途...否则您可能不得不转储 Parse 模块的内容,找出对您最重要的内容,然后自己进行翻译。但说真的,试试这个模块。

或者,如果这是在 Windows 机器上,如果您受制于 Perl(不用说,这不是我的),Win32::OLE 可能更适合为您处理此类任务如果您的唯一关注点是 Excel 电子表格操作,则首选。