Slim3でApachePoiを使ってExcelファイルを操作する
Slim3でExcelを操作してみようと思ったので、ApachePoiが使えるのか試してみた。
ついでに、ファイルの出力先として、GoogleCloudStorageを使ってみた。
やる前にちょっとGoogle先生に聞いてたら、以下の記事を見つけました。
How to generate excel files on Google App Engine (GAE) using GWT ? | z80.fr
ApachePoiはGAEのWhiteListにないJREクラスの依存関係が多いのでいまいちという話のよう。
2010年の記事らしいですが、ちょっとドキドキしながらもチャレンジ!
public Navigation run() throws Exception {
response.setContentType("text/plain");
response.getWriter().println("Hello, world from java");
//ファイルの情報 (ExcelファイルのMimeTypeが以下で合っているのかは、ちょっと怪しい・・・
GSFileOptionsBuilder optionsBuilder =
new GSFileOptionsBuilder()
.setBucket(BUCKETNAME)
.setKey(FILENAME)
.setMimeType("application/excel")
.setAcl("public_read");
try {
//Google Cloud Storage用のファイルを作成
AppEngineFile file = fileService.createNewGSFile(optionsBuilder.build());
//ファイルに対する書き込み用チャンネルを開く。第2引数はロックをするかどうか
FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
//Poiの書き込みがOutputStreamで行われるので、チャンネルからOutputStreamを作成
OutputStream outputStream = Channels.newOutputStream(writeChannel);
//PoiでExcelファイルを作成
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("hogeSheetName");
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
cell.setCellValue("testValue");
workbook.write(outputStream);
//outputStream.flush();
outputStream.close();
writeChannel.closeFinally();
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (FinalizationException e) {
throw new RuntimeException(e);
} catch (LockException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
response.getWriter().println("finish");
return null;
}
ふぅ、例外処理は適当だけど、とりあえず動いた。
そんなに長いコードでもないし、やっていることは、コメントに書いてあるままだ。
実際にGAE上で動かすには、GoogleCloudStorage側で、GAEからのアクセスを許可するよう設定する必要がある。
そのやり方は、Google Developer Group 中国のマネージャーの横山さんのBlogに書いてあります。
T.Yokoyamaのブログ: GAE/GでGoogle Cloud Storageを利用するには(1)
GAE/Gで作られていますが、Google API Consoleでの設定方法は同じです。
ただ、Google Cloud Storage は Billing設定が登録されていないと使えませんので、そこはご注意ください。
Localで実行した場合は、Google Cloud Storageに登録したファイルの情報がDatastoreに保存されます。
___GsFileInfo___というKindがそれです。
Fileの中身などは見れませんが、ファイル名やサイズは見れるので、何となく保存されている雰囲気が分かりますw
実際のファイルは war/WEB-INF/appengine-generated以下に保存されます。
この辺りは、Blobstoreと同じような感じですね。
以上で、終わりです。
Poiに関しては、新規ファイルを作成して、Cellに文字列を書き込んだだけなので、全部の機能が使えるかは未知数です。
何か分かった方は、是非Blogに書いてくださいね!
実際のソースは以下
Google Code Archive - Long-term storage for Google Code Project Hosting.