3

サーブレットで xlsx ファイルを作成し、ユーザーがファイルを保存またはダウンロードできるブラウザに送信しようとしています。現在、Excel ファイルではなく application/octet-stream を送信し続けています。

私は何を間違っていますか?

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        SXSSFWorkbook wb = new SXSSFWorkbook();
        Sheet sheet = wb.createSheet("Results");
        List<List<TableData>> results = (List<List<TableData>>) request.getSession().getAttribute("results");
        String tableName = (String) request.getSession().getAttribute("tableName");
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        String filename = tableName+"-"+df.format(date)+".xlsx";

        int rowCounter = 0;

        // Create the rows
        for(List<TableData> l : results) {

            int counter = 0;
            Row row = sheet.createRow(rowCounter);

            for(TableData td : l) {

                Cell cell = row.createCell(counter);

                // if we're on the first row, get the column description, else get the data
                if(rowCounter == 0) {
                    cell.setCellValue(td.getColumnDescription());
                } else {
                    cell.setCellValue(td.getData());
                }
                counter++;
            }
            rowCounter++;
        }

        try {
            OutputStream out = response.getOutputStream();
            wb.write(out);
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("Expires:", "0"); // eliminates browser caching
            response.setHeader("Content-Disposition", "attachment; filename="+filename);
            out.flush();
            out.close();

        } catch (Exception e) {
            LOG.debug(e.getStackTrace().toString());
        } 
    }
4

1 に答える 1

11

本文を送信する前に、コンテンツタイプとヘッダーを設定してください。それらは正当な理由でヘッダーと呼ばれています:-)

于 2013-01-21T22:12:50.077 に答える