NO IMAGE

【PHP】WindowsでLibXLを使うまでの道

  1. 有料でも良いから、PHPで高速なExcel出力処理を行いたい
  2. 有料でも良いから、PHPで低負荷なExcel出力処理を行いたい
  3. テンプレートファイルを用いたExcel出力処理を実装したが、出力ファイルからテンプレートの内容が消えていて何とかしたい

LibXLとは?

高速かつ、少ないリソースでExcel出力を行えるライブラリです。また、PhpSpreadsheetPHPExcelなどの無償のライブラリよりも高性能となっています。(LibXLは有償
私がこのライブラリを使用するに至った経緯としては

  1. Excel処理が頻繁に行われるシステムであり、サーバのリソース不足が懸念された
  2. テンプレートを用いた出力が必要であったが、無償ライブラリでは出力時にテンプレートの内容が破棄されてしまった
    1. ボタンオブジェクトが消える
    2. 条件付き書式が消える(一部)
         など

そのため、機能を実現するために今回のライブラリ選定に至りました。大量のテンプレートがあり、大量の出力リクエストが想定されたのでLibXLに価格以上の価値を見出したわけですね。
もちろん、組み方が悪かったり、組み方で改善できる部分はあるとは思いましたが、全テンプレートに対しての組み直しは現実的ではなかったので、ライブラリ自体を変更する方向で考えました。
公式サイトはこちらです。(LibXL 公式サイト
有償とは言え、私が業務で使用した様々な有償ライブラリやソフトと比べるとお手頃な価格設定だと感じました。

準備に当たって

公式サイトに使用方法は書いてありますが、今回はWindows環境で使用していくので、参考になる部分は少ないかもしれません。
また、PHPのインストールは済んでいることを前提に進めていきます。
(記事にする環境では、「PHP 7.4.21 Non Thread Safe x64」のインストールが済んでいます。配置は「C:\php」です。)

LibXLの導入

まずは公式サイトのダウンロードページより、Window用のzipファイルをダウンロードします。

今回はWindow版をダウンロード

ダウンロードしたzipを展開して、フォルダから下記ファイルを探します。

  • libxl-win-3.9.4.3\libxl-3.9.4.3\bin64\libxl.dll
  • libxl-win-3.9.4.3\libxl-3.9.4.3\php\php-7.4-nts-x64\php_excel.dll
libxl-x.x.x.xはバージョン情報を含むため、ダウンロード時期によって異なる場合があります。
今回は「PHP 7.4」「Non Thread Safe」「x64」のためのファイルを使用しています。
ご自身の環境に合わせて、使用するファイルを変更してください。

これをPHPフォルダに配置します。

  • php\libxl.dll
  • php\ext\php_excel.dll

配置が出来たら、php.iniにdll読み込みの追記を行います。

;excel.license_name=””;excel.license_key=”” はコメントアウトしていますが、ライセンスキーを購入済みの場合はこちらに設定をしてください。

読込設定が出来たら「php -v」でエラーが出ないことを確認。

PHPExcelで警告が。。。

んーーー。。。。何でしょう。

警告の対応

上述した「php_excel.dll」をApacheサイトからダウンロードしたものに差し替えたところ、正常に動作しました。
リンク先にはたくさんのダウンロードリンクがあるので、自分の環境に合ったものをダウンロードして配置してください。
今回使用したモノは「php-7.4.21-nts-Win32-vc15-x64」になります。
dllは「php-7.4.21-nts-Win32-vc15-x64\ext\php_excel.dll」を使用しました。
原因が分からず、今回と前回使用時の違いを洗い出してみました。
  • PHPのバージョンが違う(前回:PHP 7.4.15)
  • 前回はXAMPPで環境構築を行った
  • dll等は開発メンバが用意してくれたものを使用した
こんなところでした。とりあえず片っ端から試してみることに。

PHPのバージョンが違う(前回:PHP 7.4.15)

これは簡単でした。PHPのサイトに行って必要なバージョンをダウンロードして配置。
上記手順でLibXLのセットアップ。同じように「php -v」しましたが結果は変わらず。。。

前回はXAMPPで環境構築を行った

これは今の環境でXAMPPを使用したくなかったので、別のWindowsを用意して行いました。
PHPバージョンは前回(7.4.15)に合わせています。
が、こちらもLibXL導入後の結果は変わりませんでした。

dll等は開発メンバが用意してくれたものを使用した【これで解決】

最後はこれ。思い返すと、前回も私だけ微妙にPHPのバージョンが違ったので、自分でPHPExcelのdllを用意したんですよね。
LibXL本体は公式サイト以外の取得方法が思い当たらないので、とりあえずPHPExcelだけ別の所から取得することにしました。
上述の手順ではLibXlをダウンロードした際に同梱されていたものを使用しましたが、今回は別のサイトからとってこようと思います。ApacheサイトからPHP一式を落としてくると、PHPExcelも含まれています。今回はこちらを使用することにしました。
差し替えたファイルは

  • (新)php-7.4.21-nts-Win32-vc15-x64\ext\php_excel.dll > (旧)C:\php\ext\php_excel.dll

でした。
そしてコマンドを実行すると、、、、警告が消えました。

LibXL同梱のものが原因でした。たまたま前回の経験活きたのでよかったですが、一生解決できなかったかもしれませんね。。。

結果

  • LibXlのdllは公式サイトのものを使用
  • PHPExcelのdllはLibXl同梱のものではなく、別途自身のバージョンのものを取得して使用
    ※今回はApacheサイトから取得

今回は変なところでハマってしまった気がしますが、導入自体は簡単でした。
公式サイトが英語なので詳細を読むことが出来ませんでしたが、もしかしたらPHPExcelのdllについては記載があったかもしれませんね。

LibXLの動作検証

LibXLには試験出力用のファイルが用意されています。
このファイルを使用して出力テストを行ってみます。
まずは試験出力用のファイルをコピーします。そのままでも問題ないですが、ダウンロードディレクトリで作業をしたくなかったので、私はこのようにコピーしました。

Downloads\libxl-win-3.9.4.3\libxl-3.9.4.3\php\php-7.4-nts-x64\example.php > C:\work\example.php

このPHPファイルを実行するとファイルが作成されます。
コマンドを実行したカレントディレクトリにファイルが作成されてしまうので、今回は「C:\work」をカレントディレクトリにしてコマンドを実行します。

cd C:\work
php "example.php"

すると、”C:\work\test.xlsx”が作成されます。

ライセンス認証をしていないと1行目に「買ってね!」と言うようなメッセージが出力されます。
1行目に出力しようとするとエラーとなるので注意。開発中に謎のエラーも多発したので(ログを見るとライセンス関連の様子、、、)本格的に使用する際はライセンス認証を行いましょう。
今回は以上となります。
PHPでハードにExcel出力を行うなんて、、、と言われそうですが、私の地域ではまだまだExcel離れができていません。
でも「Web化」に対するあこがれは強いようで、PHPでExcel出力は良く求められます。
(WindowsServer + ASP をPHPに移行した際のExcel出力は地獄でした、、、)
LibXLを使用することで、ある程度自由に出力が出来るので、悩んでいる方はご一考ください。