Java通过xlsx模板实现导出excel并处理有合并单元格的问题

本文介绍了JXLS库在Java中用于简化和高效地导出带有复杂格式和布局的Excel报表的方法。相较于其他如POI的工具,JXLS通过模板标记简化了代码,但要注意模板中合并单元格与循环list的配合问题。文章提供了关键代码示例,展示了如何读取模板、处理数据并生成Excel文件,同时提醒了合并单元格时的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:

       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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值