0

我正在使用 Apache POI 并扩展 Springs AbstractExcelView 来创建 Excel 工作表。

public class ExcelSpreadsheetView extends AbstractExcelView {

protected void buildExcelDocument(Map<String, Object> model,
            HSSFWorkbook workbook, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

//GET POSITIONS TO LOOP THROUGH FROM MODEL
@SuppressWarnings("unchecked")
List<Position> positions = (List<Position>) model.get("positions");

int lastRow = 0;

mySheet = wb.createSheet("SHEET1");

myRow = mySheet.createRow(lastRow);
myCell = myRow.createCell(0);

//loop through positions
for (int p = 0; p < positions.size(); p++) {
     myRow = mySheet.createRow(lastRow);
     myCell = myRow.createCell(0);
     myCell.setCellValue(new HSSFRichTextString(positions.get(p).getPositionName()));
     lastRow++;
}

//response stuff goes here, but I shouldnt need it

}

在所有 POI 代码之后,当我有以下代码时,我可以成功创建工作表:

response.setHeader("Content-Disposition", "inline;filename=\"spreadsheet.xls\"");
response.setContentType("APPLICATION/OCTET-STREAM");
OutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
out.close();

问题是,在所有在线示例中,人们都没有包括写入 OutputStream 或设置 ContentType,看起来 AbstractExcelView 处理了这些。

当我注释掉上面的 6 行时,它会尝试创建文件(我可以在控制台日志中看到它正确解析了所有数据),但是当我打开文件时,Excel 无法打开它并显示以下内容:

“文件错误:数据可能已丢失。”

我知道我的代码按原样工作,我只是想以正确的方式去做,并遵循其他人在网上所做的事情。我认为我在 OutputStream 或 ContentType 中没有代码,但它只有在我这样做时才有效。

非常感谢任何帮助!

4

1 回答 1

1

请给我看更多代码。

你使用 HSSFSheet 吗?

public class ExcelReportView extends AbstractExcelView {
    @Override
    protected void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        // create a wordsheet
        HSSFSheet sheet = workbook.createSheet("Title");

        HSSFRow header = sheet.createRow(0);
        header.createCell(0).setCellValue("whatever");
        header.createCell(1).setCellValue("whatever");

        int rowNum = 1;
        for (...) {
            // create the row data
            HSSFRow row = sheet.createRow(rowNum++);
            row.createCell(0).setCellValue("whatever");
            row.createCell(1).setCellValue("whatever");
        }
    }
}
于 2013-05-08T15:33:50.353 回答