最近开发中遇到复杂多表头多sheet页多图片excel导出的问题。
本文使用操作Excel的框架是EasyPoi
EasyPoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法
官方主页: www.wupaas.com/easypoi.htm…
API文档: doc.wupaas.com/docs/easypo…
模板是处理复杂Excel的简单方法,复杂的Excel样式,可以用Excel直接编辑,完美的避开了代码编写样式的雷区,同时指令的支持,也提了模板的有效性
下面列举下EasyPoi支持的指令以及作用, 最主要的就是各种fe的用法
1.根据easypoi模板指令,设计导出数据结构,并填充进入Excel模板中.
2.查询数据,对需要遍历的列表设计到的sheet页和单元格,进行预处理:
将模板表中对应单元格下移,并合并需要合并的单元格
//下移单元格 sheet.shiftRows(startRow, endRow, n); 复制代码
//合并单元格 sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol)); 复制代码
3.创建模板导出参数
//创建模板导出参数 TemplateExportParams params = new TemplateExportParams(dealTemplatePath, true, sheetNames); 复制代码
4.生成导出 workbook
//生成导出 workbook Workbook workbook = templateExcelExportHelper.createExcelByTemplate(getMinioInputStream(BUCKET_NAME, dealTemplatePath), params, sheetMap); 复制代码
5.处理easypoi生成的workbook
/** * 设置外边框 * @param workbook 工作表 * @param i sheet下标 */ public static void setSheetBorder(Workbook workbook, int i) { CellRangeAddress cellRangeAddress = new CellRangeAddress(0, workbook.getSheetAt(i).getLastRowNum(),0, workbook.getSheetAt(i).getRow(0).getPhysicalNumberOfCells() -1); RegionUtil.setBorderBottom(BorderStyle.MEDIUM,cellRangeAddress, workbook.getSheetAt(i)); RegionUtil.setBorderLeft(BorderStyle.MEDIUM,cellRangeAddress, workbook.getSheetAt(i)); RegionUtil.setBorderRight(BorderStyle.MEDIUM,cellRangeAddress, workbook.getSheetAt(i)); RegionUtil.setBorderTop(BorderStyle.MEDIUM,cellRangeAddress, workbook.getSheetAt(i)); } 复制代码
6.输出文件并删除预处理产生的模板文件
//输出文件流至 Servlet setExportExcelFormat(response, workbook, exportExcelName); //删除生成的预处理模板 deleteTemplate(dealTemplatePath); 复制代码
/** * 输出文件流 * * @param response * @param workbook * @param fileName * @throws Exception */ public void setExportExcelFormat(HttpServletResponse response, Workbook workbook, String fileName) throws Exception { ServletOutputStream outStream = null; String fileNameURL = URLEncoder.encode(fileName, "UTF-8"); response.setContentType("octets/stream"); response.setHeader("Content-disposition", "attachment;filename=" + fileNameURL + ";" + "filename*=utf-8''" + fileNameURL); response.addHeader("Pargam", "no-cache"); response.addHeader("Cache-Control", "no-cache"); try { outStream = response.getOutputStream(); workbook.write(outStream); } finally { outStream.close(); } } 复制代码