2010年4月24日土曜日

ExCellaで帳票

最近ExCellaを触ってます。

実際はGoogleAppEngineでサービスを目標にしていて、
一部ExCella自体をいじりながらの開発です。
一応Excelが出力できたのでブログを起こしておきましょう。

やっぱりGAEでネックになるのは
ファイルシステムとの問題です。

まず、core側にあるExporterのTextExporterとWorkbookExporterを
削除しました。
単純にいうとまずはスモールスタートの為に
ExcelOutputStreamExporterのみをサポートする事にしました。

本来はXLS周りを使用してみたかったのですが
POI自体(ExCella内部で使っている)が、テンプレートの読み込み途中で
xmlファイルを保存している感じがあって、落ちてしまいます。

なので一旦はExcelに集中。


ExCella自体がファイルへの出力重視的な実装になっていて
親クラスで「出力ファイル名」等を持つことが多いみたいなので
ひとまずそのあたりを削除。
エラーになるところを潰していくような作業になりました。


・・・実際は根本の部分でOutputStreamの設定する仕組みに変えるべきだと
。。。ブログ書いてる途中に思いまして、ちょっと実装しなおそうかな?
って思っています。

現状だと


ByteArrayInputStream inStream = new ByteArrayInputStream(template.getBytes());

ReportBook outputBook = new ReportBook(inStream,ExcelOutputStreamExporter.FORMAT_TYPE);

ReportSheet outputSheet = new ReportSheet("テンプレート","請求書");

outputBook.addReportSheet(outputSheet);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
ReportProcessor reportProcessor = new ReportProcessor();
stream = reportProcessor.process(outputBook);

response.setHeader("Content-Disposition","attachment; filename=excel.xls");
response.setContentType("application/msexcel");
response.setContentLength(stream.toByteArray().length);

OutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(stream.toByteArray());
out.close();


こんな感じで動作します。

GAEでの動作なのでinputStreamは
テンプレート用のファイルをDataStore上に溜め込んでいます。

コードネームはdon-gabachoです。
あー。。。もういっかい書き直して
全部書き留めないとなぁ。。。

※2010/4/25 でリファクタリング完成
http://code.google.com/p/don-gabacho/wiki/ExCella?ts=1272171109&updated=ExCella
streamをBookから引き渡すように変更しています。