Скопируйте формат ячейки из файла .xlsx, используя Spreadsheett :: ParseXLSX, чтобы записать другую ячейку, используя EXCEL: WRITER :: XLSX? - PullRequest
0 голосов
/ 12 марта 2020

Пожалуйста, проверьте код ниже. если я удаляю формат $ из последней строки в $ sheet_write-> write ($ row, $ col, $ cell -> value), то он работает нормально.

Я заявляю о добавлении формата в электронную таблицу excel_2 который будет написан "Excel :: Writer :: XLSX;" пакет. И я копирую формат ячейки ($ format = $ cell-> get_format ();) из другого парсера чтения " use Spreadsheet :: ParseXLSX ". Любая помощь будет оценена. Я ожидаю, что есть какое-то несоответствие между этими двумя разными методами.

#!/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);

        }
    }
}

1 Ответ

2 голосов
/ 12 марта 2020

Spreadsheet :: ParseXLSX's cell-> get_format дает объект, отличный от того, что Excel :: Writer :: XLSX ожидает в качестве объекта форматирования в своем методе write. Хотя они оба имеют дело с электронными таблицами, они представляют собой разные модули и вряд ли будут совместно использовать класс таким образом.

Свойства объекта формата Excel :: Writer :: XLSX хорошо документированы:

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

Я вижу, что есть модуль формата клона:

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

Нет личного опыта с ним, но выглядит многообещающе ... В противном случае вам, вероятно, придется выбросить содержимое модуля Parse, выяснить, что для вас наиболее важно, и затем выполнить переводы сами. А если серьезно, попробуйте модуль.

В качестве альтернативы, если это на машине Windows, Win32 :: OLE может быть лучше для решения этого типа задач для вас, если вы привязаны к Perl (который Излишне говорить, что это не будет моим первым выбором, если вы будете заниматься исключительно операциями с электронными таблицами Excel).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...