PSLブログ

ヨシナシゴトヲツヅリマス

ubuntu 20.04LTS/PHP-7.4にLibXL-3.9.5+php_excelを入れた話

LibXL+PHP Extensionの組み合わせは、大変重宝している。LibXLは有償だが、いままで使っていたPHPExcelのメモリ+実行時間浪費でちょっとでもシートが大きくなると処理が戻ってこなくなるのとくらべたら雲泥の差である。

github.com

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 に以下の記述を追加

; LibXL PHP Extension
[php_excel]
extension=excel.so

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年経過している。もうメンテされていないっぽい。とても便利なのに有償でもいいので使えるようにして欲しいところ。