Java POI导出Excel并使用输出流下载文件弹出打开保存框
/**
* 导出Excel
* @author Saffi
*/
@RequestMapping("exportExcel.action")
public void exportExcel(HttpServletResponse response) throws IOException {
try {
// 查询并赋给List集合
List<Entity> oddList = entityService.listExport();
// 在内存中创建一个Excel文件,通过输出流写到客户端提供下载
// 内存中保留 10000 条数据,以免内存溢出,其余写入 硬盘
SXSSFWorkbook workbook = new SXSSFWorkbook(10000);
// 创建一个sheet页
SXSSFSheet sheet = (SXSSFSheet) workbook.createSheet("这是sheet名");
// 分别设置Excel列的宽度
sheet.setColumnWidth(0, 100 * 40);
sheet.setColumnWidth(1, 100 * 50);
sheet.setColumnWidth(2, 100 * 50);
// 创建标题
SXSSFRow headRow = (SXSSFRow) sheet.createRow(0);
headRow.createCell(0).setCellValue("编号");
headRow.createCell(1).setCellValue("时间");
headRow.createCell(2).setCellValue("单号");
// 遍历oddList集合
for (OddNunber odd : oddList) {
// 创建行
SXSSFRow dataRow = (SXSSFRow) sheet.createRow(sheet.getLastRowNum() + 1);
// 创建下标为0的Cell,并将其值设为查询结果中的编号
dataRow.createCell(0).setCellValue(odd.getOnid());
// 创建下标为1的Cell,并将其值设为查询结果中的日期
dataRow.createCell(1).setCellValue(odd.getOrecorddate());
// 创建下标为2的Cell,并将其值设为查询结果中的单号
dataRow.createCell(2).setCellValue(odd.getCustomernumber());
}
// 设置生成的Excel的文件名,并以中文进行编码
String codedFileName = new String("Excel名".getBytes("gbk"), "iso-8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + codedFileName + ".xlsx");
// 响应类型,编码
response.setContentType("application/octet-stream;charset=UTF-8");
// 形成输出流
OutputStream osOut = response.getOutputStream();
// 将指定的字节写入此输出流
workbook.write(osOut);
// 刷新此输出流并强制将所有缓冲的输出字节被写出
osOut.flush();
// 关闭流
osOut.close();
/*
* dispose of temporary files backing this workbook on disk 处理在磁盘上备份此工作簿的临时文件
* SXSSF分配临时文件,您必须始终清除显式,通过调用dispose方法
*/
workbook.dispose();
} catch (Exception e) {
e.printStackTrace();
response.sendRedirect("error.action");
log.error("系统错误", e.fillInStackTrace());
}
}