我正在使用 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 中没有代码,但它只有在我这样做时才有效。
非常感谢任何帮助!