2010年4月24日土曜日

ExCellaで帳票

最近ExCellaを触ってます。

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

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

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

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

なので一旦はExcelに集中。


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


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

現状だと

  1. ByteArrayInputStream inStream = new ByteArrayInputStream(template.getBytes());  
  2.   
  3. ReportBook outputBook = new ReportBook(inStream,ExcelOutputStreamExporter.FORMAT_TYPE);  
  4.   
  5. ReportSheet outputSheet = new ReportSheet("テンプレート","請求書");  
  6.   
  7. outputBook.addReportSheet(outputSheet);  
  8.   
  9. ByteArrayOutputStream stream = new ByteArrayOutputStream();  
  10. ReportProcessor reportProcessor = new ReportProcessor();  
  11. stream = reportProcessor.process(outputBook);  
  12.   
  13. response.setHeader("Content-Disposition","attachment; filename=excel.xls");  
  14. response.setContentType("application/msexcel");  
  15. response.setContentLength(stream.toByteArray().length);  
  16.   
  17. OutputStream out = new BufferedOutputStream(response.getOutputStream());  
  18. out.write(stream.toByteArray());  
  19. 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から引き渡すように変更しています。