LibXL+PHP Extensionの組み合わせは、大変重宝している。LibXLは有償だが、いままで使っていたPHPExcelのメモリ+実行時間浪費でちょっとでもシートが大きくなると処理が戻ってこなくなるのとくらべたら雲泥の差である。
CentOS 8がいきなり今年の12月いっぱいでサポート終了となるため、自社で運用手しているサーバのOSをUbuntu 20.04LTSに順次切り替えていく作業を進めている。そこで、あらたにLibXL+php_excelをコンパイル+インストールしていく必要があるが、試行錯誤の結果、概ねうまくいったが、1点問題が出てきた。
インストールは、ubuntuでログインして、php-devが入っていない場合は先に入れて置く。
sudo apt install php-dev
その後以下の手順で進めたがエラーになってしまった。
cd libxl-3.9.5.0 wget https://github.com/iliaal/php_excel/archive/php7.zip unzip php7.php cd php_excel-php7 phpize ./configure --with-libxl-incdir=../include_c --with-libxl-libdir=../lib64 make
※以下のようなエラー
/home/ubuntu/libxl-3.9.5.0/include_c/libxl.h:481:30: error: too many arguments to function ‘xlSheetRemoveRowA’ 481 | #define xlSheetRemoveRow xlSheetRemoveRowA
いろいろと当たってみた結果、別の方のリポジトリに作者のリポジトリからforkしてプルリクエストを反映しているものがあったのでそれを使ってみた。
wget https://github.com/Jan-E/php_excel/archive/refs/heads/php7_with_pulls.zip unzip php7_with_pulls.zip cd php_excel-php7_with_pulls phpize ./configure --with-libxl-incdir=../include_c --with-libxl-libdir=../lib64 make make install (中略) Installing shared extensions: /usr/lib/php/20190902/
無事コンパイル・インストールまでできた!
Virtualminを使っているので、
Webmin⇒PHP Configuration⇒Edit Configuration Manually
/etc/php/7.4/cgi/php.ini に以下の記述を追加
apacheをreload
これで、無事動いた。
PHP ExtensionのPHP5版ではAutoFilterクラスに対応していないなど不十分だったが、今度のバージョンは申し分ない。瞬時にファイルが生成される。とても幸せなライブラリである。
しかし、画像をセルに貼り付けようとして、タイムアウトになるまで処理が戻ってこない現象が起きた。CentOS 7のサーバに入れたときは問題なかったのだが、これは一体どうしたことか。
以下、サンプルコード。
<?php ini_set("display_errors", 1); $excel = new ExcelBook("userid", "key", true); $excel->setDefaultFont("Meiryo UI", 11); $sheet = $excel->addSheet('Sheet1'); $pic = $excel->addPictureFromFile("sample.png"); // $sheet->addPictureDim(0, 0, $pic, 128, 128, 0, 0); $sheet->addPictureScaled(0, 0, $pic, 1, 0, 0); $filename = "rawdata_".date("YmdHis").".xlsx"; $filename_j = rawurlencode("テスト3-".date("YmdHis").".xlsx"); header("Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); header("Content-Disposition: attachment; filename={$filename}; filename*=utf-8''{$filename_j}"); $excel->save("php://output"); ?>
addPictureDimとaddPictureScaledのどちらを使っても、何十秒も処理が止まってしまう。中で何が起きているかわからないが、もしかして無限ループになっている?
公開している人に修正版を出して欲しいところだが、本家のサイトでも、PHP7版の1.0.2が出てから5年経過している。もうメンテされていないっぽい。とても便利なのに有償でもいいので使えるようにして欲しいところ。