これまでの認識
(以下、ColdFusion2018での動作となり、最新版では異なるかもしれません)
ColdFusionにはcfspreadsheet
タグなどでExcelの読み書きをする機能が実装されていますが、
処理が遅かったり、メモリを大量消費するなどを理由に、利用を見送った方もいると思います。
これは、Apache POIを利用しているのが理由です。
ColdFusionのExcel読み書きが遅いこともあり、POIを使って自前実装する方もいたと思います。
恐らくColdFusionではorg.apache.poi.xssf.usermodel.XSSFWorkbook
クラスを利用していることが処理が重い原因だと思います。
(POIが重い理由などがあまりよくわからない方は、適当にググってみてください)
なので、org.apache.poi.xssf.streaming.SXSSFWorkbook
クラスを使って速度改善を試みた方もいるのではないでしょうか?
最新のColdFusion2021ではPOIを使っていないかも?(認識が間違っていたので削除)
先日、最新のColdFusion2021をちょっとだけ触ってみたのですが、
org.apache.poi.xssf.streaming.SXSSFWorkbook
を使ってみたらこんなエラーメッセージが表示されました。
クラスが見つからない・・・
ちなみに、org.apache.poi.xssf.usermodel.XSSFWorkbook
でも同様でした。
Dockerを使って環境を構築しているので、/opt/coldfusion/cfusion/lib
にjarファイルなどがあるのですが、ここにPOI関連のファイルが無いようです。
(ColdFusion2018では、ここにPOI関連のjarファイルがありました)
POIを置いてないなどの理由なのか、ColdFusion2021のDockerイメージは2018のDockerイメージと比べてサイズが半分くらいになっているようです。
(2018が992MB、2021が412MB)
もしかして、ColdFusion2021ではPOIを使わずにExcel出力が実装されているのでは・・・
もしそうなら、パフォーマンスが大幅に改善されているのでは・・・
いつか試したいのですが、現時点でColdFusion2021を使う開発案件はないので、
一旦ColdFusion2021の調査はここまで・・・
追記
コメントで情報をいただきました。ありがとうございます。
ColdFusion2021からパッケージマネージャーなるものが導入されたようです。
これを利用してPOIを追加する、と言った感じになりそうです。
(そのうち時間を作ってまた試してみます)
公式の日本語ドキュメントが少なくなってきたColdFusionですが、2022年もドキュメントを更新しているので、まだまだやる気はあるみたいですね。
おまけ:ColdFusion2018でSXSSFWorkbookを使う
ColdFusion2018ではPOIが使われているので、org.apache.poi.xssf.streaming.SXSSFWorkbook
も使えるのですが、なぜかシート作成に失敗するようです(自分だけ?)。
// パフォーマンス改善のためSXSSFWorkbookを利用
var workbook = createObject("java", "org.apache.poi.xssf.streaming.SXSSFWorkbook");
// この処理が失敗する(XSSFWorkbookだと問題なく動くけど・・・)
var sheet = workbook.createSheet();
この場合、Dockerfile
をこんな感じにするとorg.apache.poi.xssf.streaming.SXSSFWorkbook
でも動きました。
(libfreetype6-devは環境に合わせてそれらしく・・・)
FROM adobecoldfusion/coldfusion2018
RUN apt-get update -y
RUN apt-get install fontconfig libfreetype6-dev -y
あとはPOIのドキュメントとにらめっこしながらJavaっぽいコードを書けば、だいぶパフォーマンスは改善されるはずです。