Невозможно сохранить формат при копировании из одного файла Excel в другой - PullRequest
1 голос
/ 11 июня 2019
#!/usr/bin/perl

use strict;
use warnings;

use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::SaveParser;

# Open an existing file with SaveParser
my $parser   = Spreadsheet::ParseExcel::SaveParser->new();
my $template = $parser->Parse('template.xls');

my $parser1   = Spreadsheet::ParseExcel::SaveParser->new();
my $template1 = $parser1->Parse('test_perl.xls');

my $worksheet11 = $template->worksheet(0);

 $template1->AddWorksheet('New Data');

my $worksheet22 = $template1->worksheet(0);

my $cellz; my $valua;my $format_number;
    for (my $i = 0; $i < 400; $i++) {
        for (my $j = 0; $j < 20; $j++) {
            $cellz = $worksheet11->get_cell( $i, $j );
            if($cellz){
                $valua = $cellz->unformatted(); $format_number = $cellz->{FormatNo};
                $worksheet22->AddCell($i, $j, $valua,$format_number);
            }
        }   
    }

my $workbook;
$workbook = $template1->SaveAs('newfile1.xls');

Я хочу скопировать содержимое из одного файла Excel в другой, сохранив формат. Здесь под форматом я подразумеваю цвет заливки, границы, полужирный, курсив и т. Д. Я написал код для этого, где я извлекаю значение и номер формата из одного файла Excel и просто записываю в другой лист Excel. Я сослался на следующую ссылку для этого.

https://metacpan.org/pod/Spreadsheet::ParseExcel::SaveParser

Проблема в том, что он не сохраняет формат. Я думаю, что проблема заключается в том, что номер формата не является универсальным, что означает, что номер формата означает две разные вещи в двух разных файлах Excel. Когда я запускаю этот код, я получаю ошибку

Использование неинициализированного значения в хеш-элементе в /pkg/qct/software/perl/5.18.0_test/lib/site_perl/5.18.0/Spreadsheet/ParseExcel.pm строка 2383.

По-моему, это означает, что извлеченный номер формата ничего не значит для другого файла. Пожалуйста, дайте мне знать решение этой проблемы

В основном моя проблема в том, что я изменил два файла xls с помощью Spreadsheet :: ParseExcel :: SaveParser, и я хочу объединить эти два файла xls с помощью Perl. Пожалуйста, предложите способ объединения двух файлов xls с использованием Perl любым другим способом, так что форматирование сохраняется. Пожалуйста, предложите не-Perl способ, используя другой язык кодирования.

Этот вопрос также опубликован на perl-monks: https://perlmonks.org/index.pl?node_id=11101251

1 Ответ

1 голос
/ 18 июля 2019

Решение вышеупомянутой проблемы такое же, как в комментариях @simbabque.Вы должны извлечь все свойства формата каждой ячейки и создать новый формат для каждой ячейки, используя эти извлеченные свойства.Как очень правильно сказал @simbabque, количество свойств фиксировано.Пожалуйста, смотрите ссылку ниже:

https://metacpan.org/pod/Spreadsheet::ParseExcel#Format

Я также прилагаю окончательный код для объединения двух файлов xls.В этом коде два файла xls взяты в качестве аргумента и объединены в первый и сохранены с именем «testing.xls».

Спасибо @simbabque за вашу помощь.Пожалуйста, оставьте свой комментарий в качестве ответа, и я приму его в качестве решения.

Ниже приведен код:

#!/usr/bin/perl

use strict;
use warnings;

use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;
use Spreadsheet::ParseExcel::SaveParser;

print "FILE 1 $ARGV[0]"."\n";
my $parser1   = Spreadsheet::ParseExcel::SaveParser->new();
my $template1 = $parser1->Parse($ARGV[0])  or die "Unable to open first xls file";

my $func_worksheet_count = $template1->worksheet_count();

my $parser2   = Spreadsheet::ParseExcel::SaveParser->new();
my $template2 = $parser2->Parse($ARGV[1])  or die "Unable to open second xls file";

my $test_worksheet_count = $template2->worksheet_count();

print "FILE 2 $ARGV[1]"."\n";


my $worksheet22;
my $worksheet11;
my $sheet_name;

 for (my $i = 0; $i < $test_worksheet_count; $i++) {
    $worksheet22 = $template2->worksheet($i);
    $sheet_name = $worksheet22->get_name();
        print $sheet_name."\n";
    $template1->AddWorksheet($sheet_name);
 } 

 my $font;
 my $AlignH;
 my $AlignV; 
 my $Indent;
 my $Wrap;
 my $Shrink;
 my $Rotate;
 my $JustLast;
 my $ReadDir;
 my $BdrStyle;
 my $BdrColor;
 my $BdrDiag;
 my $Fill;
 my $Lock;
 my $Hidden;
 my $Style;

 my $iFmt;
 my $format;
my $iF1;





 for (my $k = 0; $k < $test_worksheet_count; $k++) {

    $worksheet22 = $template2->worksheet($k);
    $worksheet11 = $template1->worksheet($func_worksheet_count+$k); 


    my $cellz; my $valua;my $format_number;
    for (my $i = 0; $i < 1000; $i++) {
        for (my $j = 0; $j < 30; $j++) {
            $cellz = $worksheet22->get_cell( $i, $j );
            if($cellz){
                $valua = $cellz->value(); $format_number = $cellz->{FormatNo};
                $format = $cellz->get_format(); 
                 $font = $format->{Font};
                 $AlignH = $format->{AlignH};
                 $AlignV = $format->{AlignV}; 
                 $Indent = $format->{Indent};
                 $Wrap = $format->{Wrap};
                 $Shrink = $format->{Shrink};
                 $Rotate = $format->{Rotate};
                 $JustLast = $format->{JustLast};
                 $ReadDir = $format->{ReadDir};
                 $BdrStyle = $format->{BdrStyle};
                 $BdrColor = $format->{BdrColor};
                 $BdrDiag = $format->{BdrDiag};
                 $Fill = $format->{Fill};
                 $Lock = $format->{Lock};
                 $Hidden = $format->{Hidden};
                 $Style = $format->{Style};


                 $iFmt =
                $template1->AddFormat(
                    Font => $font,
                    AlignH => $AlignH,
                    AlignV => $AlignV,
                    Indent => $Indent,
                    Wrap => $Wrap,
                    Shrink => $Shrink,
                    Rotate => $Rotate,
                    JustLast => $JustLast,
                    ReadDir => $ReadDir,
                    BdrStyle => $BdrStyle,
                    BdrColor => $BdrColor,
                    BdrDiag => $BdrDiag,
                    Fill => $Fill,
                    Lock => $Lock,
                    Hidden => $Hidden,
                    Style     =>  $Style,
                );


                $worksheet11->AddCell($i, $j, $valua, $iFmt);
            }
        }   
    }
 }



my $workbook3 = $template1->SaveAs("testing.xls"); 
...