easypoi模板导出excel以及遇到的合并问题

甲方需导出样式复杂的周报,采用模板导出。本文记录了模板导出遇到的问题及解决办法,包括模板导出关键词、模板填写注意事项(如链表为空列的填写、不同格式的变量使用),还解决了导出多行时合并单元格的问题,最后表示对模板导入的列合并及指令存在疑惑。


前言

背景是甲方要导出周报,但是导出的周报的样式比较复杂,只能选用模板导出,但是第一次使用模板导出遇到了一些问题的记录


一、模板导出的关键词

下图是来自官方文档的指令图片,附带官网链接,可以直接去官网看
在这里插入图片描述
easypoi官网链接

二、模板填写

下图就是我的模板,在测试的时候我感觉&NULL&和&NULL没有太大的区别,另外链表部分如果有为空的列必须要填
在这里插入图片描述
在固定文字,即存在于表头或者结尾只需要输入一次的地方可以使用 {{变量名}}
而在下面的列表填写值用的{{ $fe:变量名 t.变量名}},作用是横向遍历并新增,尾端总结这里一样(图片没有是因为我还没加上),这里的t.在官网有介绍,看图,另外}}必须和变量名紧挨着,不能有空格

在这里插入图片描述

另外代码中的模板后缀问题,xls和xlsx有一定区别,一般最好使用xlsx
对应程序部分

//获取模板路径,路径后面那个true是开启全sheet页的扫描,只有一个sheet的情况可以不写
		TemplateExportParams params = new TemplateExportParams("temp/week.xlsx", true);
		//开启横向遍历
		params.setColForEach(true);
		//用map是为了键对
		Map<String, Object> data = new HashMap<>();
		//获取要导入的链表信息(为了更方便理解这里代码不是源代码)
		List<类名> list = "获取导入值的方法,可以从数据库或者手动添加";
		//获取表格结尾的人员汇总信息
		String sumPeople = (String) meoiipProcedureFileMapper.getProjectPeopleDepart(ProjectContext.getPojectId());
		//根据在表格中的变量名称放入数据
		data.put("duringDate", "我这里下了一个方法来获取时间");
		data.put("loginer", "导出人姓名,比如admin或者方法获取");
		//链表导入要根据easypoi的官网的指令,此处使用{{$fe}},遍历并新增行,如你所见直接填写链表名称就可以
		data.put("report",list);
		data.put("peoplePlan"," 本周派遣人员:"+sumPeople+";下周计划派遣人员:"+sumPeople+"。");

三、导出模板合并问题

在导出时遇到一个问题就是导出多行的时候,由于后面几个实际上是多列合并为一列,除去开头和结尾的行,其余行都没有合并单元格,这是easypoi本身的bug,看这个方法MergedRegionHelper.class,这是在另一个大佬那里看到的,解决方法是在方法里合并单元格
在这里插入图片描述

//这是easypoi的bug,在4.4.0版本也没有解决所以手动合并
Workbook book = new FsscExcelUtil().createExcelByTemplate(params, null, null, data);
//这里的参数从左右到右分别是,第一sheet页,初始行,最终行,初始列,最终列
PoiMergeCellUtil.addMergedRegion(book.getSheetAt(0),5,list.size()+4,8,24);

四 结尾部分

//设置语言
		response.setCharacterEncoding("UTF-8");
		response.setHeader("content-Type", "application/vnd.ms-excel");
		response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("现场施工周报" + ".xlsx", "UTF-8"));
		book.write(response.getOutputStream());

以上代码拼起来就是完整的方法啦


总结

以上就是我在模板导出部分遇到的问题以及解决方法啦,希望对你有所帮助。
另外我对模板导入也不是很理解,还不会在模板导入的时候搞列合并,以及对于指令]]也不是很理解

使用easypoi按照模板导出excel,可按以下步骤操作: ### 1. 引入依赖 在项目中引入easypoi相关依赖: ```xml <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.4.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>4.4.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>4.4.0</version> </dependency> ``` 上述代码可以确保使用easypoi的功能,为后续操作提供基础 [^2]。 ### 2. 模板处理 创建Excel模板文件,在模板文件中使用特定的标签来标记需要填充数据的位置。如果遍历的数据下面没有内容,使用`{{fe: maplist t.id }}`,而不是`{{$fe: maplist t.id }}` [^1]。 ### 3. 数据填充与导出 以下是一个示例代码片段,展示了如何根据模板导出Excel并处理可能出现的样式问题,如单元合并: ```java // 假设wb是通过模板创建的Workbook对象 // 发票sheet Sheet fpSheet = wb.getSheetAt(1); int size = ...; // 数据的数量,根据实际情况赋值 for (int i = 15; i < 15 + size; i++) { if(!isMergedRegion(fpSheet, i, 1)) { CellRangeAddress nsTwelveFpSpmc = new CellRangeAddress(i, i, 0, 1); // 合并商品名称单元 fpSheet.addMergedRegion(nsTwelveFpSpmc); } } /** * 判断指定的单元是否是合并单元 * @param sheet * @param row 行下标 * @param column 列下标 * @return */ private boolean isMergedRegion(Sheet sheet, int row, int column) { int sheetMergeCount = sheet.getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress range = sheet.getMergedRegion(i); int firstColumn = range.getFirstColumn(); int lastColumn = range.getLastColumn(); int firstRow = range.getFirstRow(); int lastRow = range.getLastRow(); if(row >= firstRow && row <= lastRow){ if(column >= firstColumn && column <= lastColumn){ return true; } } } return false; } ``` 该代码通过遍历数据行,判断单元是否已合并,若未合并则进行合并操作,确保导出Excel样式符合预期 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值