0

私は以前に何度も使用した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();
}
4

1 に答える 1