У меня огромный файл xlsx (около 127 МБ), и я хочу прочитать с помощью модуля Spreadsheet::Excel
, но я получаю ошибки « Out of Memory» на 2 ГБ ОЗУ . (Обратите внимание, что скрипт отлично работает с небольшими файлами Excel 2007)
Есть ли способ читать файл Excel построчно, не превышая лимит памяти.? В поиске Google я наткнулся http://discuss.joelonsoftware.com/default.asp?joel.3.160328.14, но я не знаю, как сохранить электронную таблицу в скаляре. Может кто-нибудь дать мне пример чтения файлов Excel 2007 в виде скалярных и печатных значений ячеек.
Ниже приведен текущий скрипт, который я запускаю на небольших таблицах.
#!/usr/bin/perl
use Excel::Writer::XLSX;
use Spreadsheet::XLSX;
my $workbook = Excel::Writer::XLSX->new('Book1.xlsx');
my $worksheet = $workbook->add_worksheet();
# use strict;
my $excel = Spreadsheet::XLSX -> new ('Book2.xlsx');
my $date_format = $workbook->add_format();
$date_format->set_num_format('dd/mm/yy hh:mm');
# Columns of interest
@columns=(0,1,2,5,9,10,12,13,31);
@reportlist=("string1","String2","String3");
@actuallist=("ModifiedString1","ModifiedString2","ModifiedString3");
$max_list=$#reportlist;
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};
for ($c=0;$c<=$#columns;$c++){
$col=$columns[$c];
my $cell = $sheet -> {Cells} [$row] [$col];
if($col==0){
$cell->{Val}=~ s/\ GMT\+11\:00//g;
$worksheet->write($row,$c,$cell->{Val},$date_format);
}
if ($cell) {
$worksheet->write($row,$c,$cell -> {Val});
for($z=0;$z<=$#reportisplist;$z++){
if(($cell->{Val})=~ m/$reportlist[$z]/i){
$worksheet->write($row,$c,$actuallist[$z]);
}
}
}
}
}
}
$workbook->close();