SiNBLOG

140文字に入らないことを、極稀に書くBlog

Slim3でApachePoiを使ってExcelファイルを操作する

Slim3Excelを操作してみようと思ったので、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.