9から追加されたExcel操作は、Excelのセルの値をColdFusionで読み込んでクエリオブジェクトに変換したり、Excelに値やフォーマットを指定する事ができる便利な機能です。Excelファイルへのさまざまな処理に対応するためにcfspreadsheetタグや多数のCF関数が用意されていますが、CFタグや関数に汎用化されることによって、どうしても制限等が発生する事もあります。今回はXLSファイルにセルのスタイルを設定するにあたって起こる制限を回避する例を紹介します。実験室で公開している情報は、ColdFusionの標準の機能では無いため動作の保証外(未サポート)となります。下記の事項も含めてそれらを予めご認識頂いた上で、参考にされるかどうかをご判断下さい。評価版で試しています。それ以外の異なるOS(32bit/64bit)やエディションなどでは確認していませんので、動き等が異なる場合はご了承下さい最初にExcelのファイル形式にはxls形式とxlsx形式があります。xlsx形式はExcel2007から追加されたXMLベースの新しいファイル形式です。xlsxの両方の形式に対応しています。xlsxの形式の方が使用できる行・列が増えるなどメリットもあるのですが、私はなるべくxls形式を利用しています。エラーが発生する事を確認しているからです。POIでも多くの報告がされていました。http://ap.atmarkit.co.jp/bbs/core/fjava/26689)ただ、xls形式で処理を行ってセルに書式をセットした際、Excel2003などでそのファイルを開いた際に「セルの書式が多すぎるため、書式を追加できません。」というエラーが表示される場合があります。このエラーは、xls形式の制限(4000)を超えて書式のセットが行われたファイルを開いた際などに発生するエラーです。SpreadsheetFormatCellRange()関数などを使用して複数のセルにスタイルをセットした場合、セルの数だけ内部でスタイルが作られているようです。セルの選択範囲によっては異なる動作になる場合もあるようですが、私が「セルの書式が多すぎる〜」エラーに最も遭遇したのは、このパターンの処理でした。この問題の回避するために、あらかじめExcelにスタイルを定義しておきColdFusionではセルに値を入れることだけを行うなどをして対処していましたが、やっぱり動的な処理でセルに罫線を引きたいときなどは不便です。そこで、POIライブラリをColdFusionから直接呼び出し、POIでスタイルをコピーして行こうと思い、試してみました。この方法でもうまくいかない場合はあるかと思いますが、試した限りの内容をご紹介します。POIはColdFusionに同梱されています。従ってPOIライブラリのダウンロードなどの準備は必要ありません。呼び出すメソッドなどは、Webで検索して引っかかったページを参考に、そのコードをColdFusionベースに移植していきました。POIを直接呼び出す際は、ファイル形式に合わせて呼び出すライブラリが異なります。Excelワークブックを読み込むために使用するクラスは、.xls形式の場合...org.apache.poi.hssf.usermodel.HSSFWorkbook.xlsx形式の場合...org.apache.poi.hssf.usermodel.XSSFWorkbookとなり、使用するクラスが異なるので注意が必要して下さい。セルにどのようなスタイルを適用するか今回はスタイルが適用されたかどうかを確認したかったので、読み込む.xlsファイルのセルには予め文字を入れておきました。と1、と2、・・・と1000」まで入れました。その範囲にスタイルを適用したいので、20×1000=20000セルが対象です。ゴシック」に、文字の配置を「中央寄せ」、そして、罫線で各セルの上・下・左・右を囲みます。通常のColdFusionで処理を行った場合SpreadsheetFormatCellRange()関数を使ってセルにスタイルを設定した例は下記となります。同じフォルダにsample.xlsと名前で.xlsファイルを置いておき、そのファイルを読み込みスタイルをセットした後、output.xlsという名前でファイルを書き出しています。1,1000,20);SpreadSheetWrite(objExcel,outputXLSFile,true);</cfscript>上記のプログラムを実行すると、同じフォルダにoutput.xlsファイルが作成されます。オリジナルのsample.xlsとoutput.xlsとのファイルサイズに大きな違いが出ています。これは20000セルにスタイルを適用したことが影響していると思われます。開くと、下記のような「セルの書式が多すぎる」エラーや、「エラーが発生し、ブックの破損を回避するため、いくつかの書式情報を削除する必要がありました。書式情報を確認し直して下さい。そのあと開いたブックを確認すると、セットしたスタイルが途中までしか適用されていませんでした。.xlsファイルを開いた際のエラーメッセージの通り、以後の書式情報が削除された結果のようです。最初にスタイルをColdFusionでセットし、そのスタイルをPOIの処理で他のセルに反映させるまずはPOIの処理を最低限にするために、スタイルのセットまでをColdFusionの処理で行いました。この場合は、一旦ファイルを書き出す必要があるようです(もしかしたらExcelオブジェクトをそのままPOIの処理に継続できるかもしれませんが、現時点では分かりませんせんでした)。そのため、ColdFusionのTempDirectory(GetTempDirectory()関数でどこのディレクトリかを確認できます)に一時ファイルを書き出して保存。そのあと、POIを使ってファイルを読み込んで、最終的にpoi_output.xlsというファイルを出力する方法を試してみました。outputXLSFile));objXLS.Write(objFileOutputStream);objFileOutputStream.Close();objTempfile.Close();//一時的に保存したExcelファイルを削除FileDelete(tempXLSFile);</cfscript>上記のプログラムを実行すると、同じフォルダにpoi_output.xlsファイルが作成されます。オリジナルのsample.xlsとpoi_output.xlsとのファイルサイズにはほとんど違いがありません。これはセルにセットしたのは一つのスタイルだけで、あとは他のセルにそのスタイルを反映した結果だと思います。開いても、先ほどのような「セルの書式が多すぎる」エラーも出ずにスタイルを反映することができました。最初のスタイルのセットもPOIの処理で行う先ほどの実験�@でも目的はかなっているのですが、やはり中間ファイルを作成するのはちょっと、、、なので、やはりスタイルの定義もPOIでやってみたいと思って調べてみました。outputXLSFile));objXLS.Write(objFileOutputStream);objFileOutputStream.Close();objTempfile.Close();</cfscript>コードが複雑になって難しくなるかと思っていたら意外と簡単でした。違いはセルからスタイルを取りだす代わりに、ワークブックオブジェクトからスタイルを作成(createCellStyle)してそのスタイルを先ほどと同じようにセットするだけです。一つのセルにセットして、そのあとにそのセルからスタイルを取得して取り回さないといけないかな?と思っていましたが、その必要はなかったようです。POIを操作する事自体、難しい事だと思っていましたが、多くの方がWebサイトで情報を紹介されていたので、それを参考にしてなんとか形にできたかなと思います。私はJavaもExcelもそれほど詳しくないため、Webの情報をもとに使ってみる(試してみる)程度では不足している事項があるかもしれません。私が紹介したコードに誤っている箇所やもっと別の方法をご存知でしたら教えて頂けると幸いです。私も、より多くのColdFusionに関する情報をお届けできるよう、次のネタを考えてみます。資料・FAQ事例紹介ColdFusionユーザーグループ。