私は以前に何度も使用したPHPExcelを使用しています。私が今抱えている問題は、Excel2007 ファイル (.xlsx - 形式) を読み取るときです。私がやっていることは、.xlsx
ファイルをループして行/列ごとに配列を作成しprint_r()
、読み取り操作の後に結果を取得して、MySQL データベースにインポートする前にデータ出力が適切であることを確認することです。
Excel2007.xlsx
ファイル (6MB) を読み取ると出力に失敗しますが、興味深いのは、ファイルを古い形式.xls
(1992-2004 - Excel5) で保存すると、ファイルが大きく (16MB) なりますが、正しく出力されることです。古い大きなファイル (16MB) は問題なく実行され、ファイルのサイズ (6MB).xls
のほぼ 3 倍だったので、これはもともとメモリの問題ではないと思いました。.xlsx
テスト目的で、.xlsx
(6MB) ファイルの 30,000 行のうち 25 行をコピーし、新しい Excel2007 を作成.xlsx
して、小さい 25 行のデータセットに対してインポートを実行すると、正しく出力されました。これにより、メモリの問題であると思いましたが、特に.xlsx
フォーマットに関連しています...
私は Amazon Web Services でサーバーを実行しており、C4.Xlarge (16 コア、30 GB RAM) を使用しているため、この操作を実行するには十分なリソースが必要です。
質問:.xlsx
小さいファイルと大きいファイルの読み取りでは出力が失敗し、小さい(25 行) ファイル.xls
では成功するのはなぜですか?.xlsx
//PHP 関数
function parse_xls($file){
ini_set('memory_limit','-1');
$type = PHPExcel_IOFactory::identify($file);
$reader = PHPExcel_IOFactory::createReader($type);
$reader->setReadDataOnly(true);
$xls = $reader->load($file);
$sheet = $xls->getActiveSheet();
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
for($row=2; $row <= ($highestRow+2); $row++){
$import[$row] = [];
for($col=0; $col < $highestColumnIndex; $col++){
$result = $sheet->getCellByColumnAndRow($col, $row)->getValue();
array_push($import[$row],$result);
}
}
print_r($import);
die();
}