简介:
jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。java中成熟的excel导出工具有pol、jxl,但他们都是使用java代码的方式来导出excel,编码效率很低且不方便维护。
还可以使用一些工具很轻松的实现模板导出。这些工具现在还在维护,而且做得比较好的国内的有easyPOI,国外的就是这个JXLS了。
比较:
项目中有很多复杂的报表(大量单元格合并和单元格样式),easyPOI处理合并单元格时候容易出现残损的情况,poi代码维护成本高。
导出效果:
xlsx模板位置:
xlsx模板写法:
注意:模板中有循环list不要有合并单元格,不然导出的excel错误。反之可以这样写
<jx:forEach items="${projectList}" var="projectList">
{projectList.name} | {projectList.payment} | ${projectList.bonus}
</jx:forEach>
下面直接上代码:
一、需要在pom.xml引入包
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-core</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-reader</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-jexcel</artifactId>
<version>1.0.9</version>
</dependency>
二、关键代码
Map<String, Object> beans = new HashMap<String, Object>();
Map<String, Object> map = null;
List<Map<String,Object>> baseList = expAssessFormService.exportBaseById(bean);
//这里后面要做批量导出,单个下载可以不用写循环
for (int k = 0; k < baseList.size(); k++){
map = baseList.get(k);
beans.put("base",map);
//数据
List<Map<String,Object>> projectList = expAssessFormService.expertProjectById(map);
beans.put("projectList", projectList);
String fileName = "附件1:测试文件【" + MapUtils.getString(map,"NAME") + "】.xlsx";
//获取模板路径
String templateFile = request.getSession().getServletContext().getRealPath("/") + "WEB-INF/template/assessMentForm.xlsx";
templateFile = templateFile.replace("\\", "/");
//实例化 XLSTransformer 对象
XLSTransformer transformer = new XLSTransformer();
XSSFWorkbook workbook = (XSSFWorkbook) transformer.transformXLS(new FileInputStream(templateFile),beans);
//如果模板里是填空题,也就是没有合并单元格的情况,这样写即可
//生成Excel文件
transformer.transformXLS(srcFilePath, map, destFilePath);
//其他操作--合并单元格
sheet.addMergedRegion(new CellRangeAddress(2,5,9,10));
//设置文件名
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName,"UTF-8"));
//写出文件
OutputStream os = new BufferedOutputStream(response.getOutputStream());
//输出
workbook.write(os);
os.flush();
os.close();
}
三、模板读取数据有合并单元格的情况,需要根据下标定位写入一个合并单元格
//如果xlsx模板需要合并单元格添加以下代码
XSSFSheet sheet = workbook.getSheetAt(0);
//添加合并单元格
sheet.addMergedRegion(new CellRangeAddress(1,1,1,1));
CellRangeAddress(int, int, int, int)
参数:起始行号,终止行号, 起始列号,终止列号
官方文档:http://jxls.sourceforge.net/reference/excel_markup.html