自分で作ったり提供したりするものは、まず自分自身で使ってみろろということです。自分じゃ使わないものなら人はいくらでも無責任にも無思考にもなれる。そういう投げやりな「サービス」やら「プロダクツ」なんて、だれだってイヤだ。自分が作り手と同時に利用者の立場になれば、ちゃんと使えるレベルのものを提供しようとします。

2010年6月21日月曜日

Google App EngineでExcel出力する

Google App Engine(以下はGAEと称する)でjexcelapiを利用して、Excelを作成してダウンロードする処理を実装しました。

GAEにはホワイトリストがありますの、このリスト以外のクラスがサポートされていません、例えばApache POIはExcel作成によく使われるんですが、GAE環境にはなかなか使えません。(多分Apache POIがJava低レベルAPIを使っているかもしれません)いろいろ調べると、jexcelapiが見つかりました、これを利用して問題なくExcelファイルが作成でき、ダウンロードすることもできるようになりました。このサンプルを作成しましたので、ご覧ください。


public class GaesampleServlet extends HttpServlet
{
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException
    {
        try
        {
            // Get Excel Data
            ByteArrayOutputStream bytes = generateExcelReport();

            // Initialize Http Response Headers
            resp.setHeader("Content-disposition", "attachment; filename=exportUsers.xls");
            resp.setContentType("application/vnd.ms-excel");

            // Write data on response output stream
            if (bytes != null)
            {
                resp.getOutputStream().write(bytes.toByteArray());
            }
        }
        catch (WriteException e)
        {
            resp.setContentType("text/plain");
            resp.getWriter().print("An error as occured");
        }
    }

    public ByteArrayOutputStream generateExcelReport() throws IOException, WriteException
    {
        // Stream containing excel data
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        // Create Excel WorkBook and Sheet
        WritableWorkbook workBook = Workbook.createWorkbook(outputStream);
        WritableSheet sheet = workBook.createSheet("User List", 0);

        // Generates Headers Cells
        WritableFont headerFont = new WritableFont(WritableFont.TAHOMA, 12, WritableFont.BOLD);
        WritableCellFormat headerCellFormat = new WritableCellFormat(headerFont);
        headerCellFormat.setBackground(Colour.PALE_BLUE);
        sheet.addCell(new Label(1, 1, "LastName", headerCellFormat));
        sheet.addCell(new Label(2, 1, "FirstName", headerCellFormat));

        // Generates Data Cells
        WritableFont dataFont = new WritableFont(WritableFont.TAHOMA, 12);
        WritableCellFormat dataCellFormat = new WritableCellFormat(dataFont);
        int currentRow = 2;
        sheet.addCell(new Label(1, currentRow, "aaaaa", dataCellFormat));
        sheet.addCell(new Label(2, currentRow, "bbbbb", dataCellFormat));

        // Write & Close Excel WorkBook
        workBook.write();
        workBook.close();

        return outputStream;
    }
}

0 件のコメント:

コメントを投稿

ホームページ