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

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

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


前言

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


一、模板导出的关键词

下图是来自官方文档的指令图片,附带官网链接,可以直接去官网看
在这里插入图片描述
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 是一款用于简化 POI 操作的工具库。它提供了一种使用注解的方式来定义表的属性,从而简化了 Excel 的导入导出操作。下面我将通过一个实例来帮助你理解 easypoi 的使用。 假设我们有一个简单的实体类 User,包含了用户的姓名、年龄、性别和地址四个属性,如下所示: ``` public class User { @Excel(name = "姓名") private String name; @Excel(name = "年龄") private Integer age; @Excel(name = "性别") private String gender; @Excel(name = "地址") private String address; // 省略 getter 和 setter 方法 } ``` 我们要将一组 User 对象导出Excel 文件中,可以通过 easypoi 的注解来定义表的属性。首先,我们需要创建一个 Excel 实体类,用于描述表的结构,如下所示: ``` public class UserExcel { @Excel(name = "序号") private Integer no; @Excel(name = "姓名") private String name; @Excel(name = "年龄") private Integer age; @Excel(name = "性别", replace = {"男_1", "女_2"}) private String gender; @Excel(name = "地址") private String address; // 省略 getter 和 setter 方法 } ``` 在这个实体类中,我们使用 @Excel 注解来定义表的各列,可以指定列名、列宽、列高、列的式等属性。其中 replace 属性用于将指定的字符串替换为数字,用于将性别从字符串类型转换为数字类型。 接下来,我们需要编写导出方法,用于将 User 对象导出Excel 文件中。代码如下所示: ``` public void exportExcel(List<User> userList) { List<UserExcel> list = new ArrayList<>(); for (int i = 0; i < userList.size(); i++) { User user = userList.get(i); UserExcel userExcel = new UserExcel(); userExcel.setNo(i + 1); userExcel.setName(user.getName()); userExcel.setAge(user.getAge()); userExcel.setGender(user.getGender()); userExcel.setAddress(user.getAddress()); list.add(userExcel); } // 导出 Excel 文件 String fileName = "用户列表.xls"; ExportParams params = new ExportParams("用户列表", "Sheet1"); Workbook workbook = ExcelExportUtil.exportExcel(params, UserExcel.class, list); try { HttpServletResponse response = ServletActionContext.getResponse(); response.reset(); response.setContentType("application/octet-stream; charset=utf-8"); response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes(), "iso-8859-1")); OutputStream os = response.getOutputStream(); workbook.write(os); os.flush(); os.close(); } catch (IOException e) { e.printStackTrace(); } } ``` 在这个方法中,我们首先将 User 对象转换为 UserExcel 对象,然后使用 easypoiExcelExportUtil 类将数据导出Excel 文件中。为了将 Excel 文件作为附件下载,我们还需要设置响应头信息,将文件的式设置为 octet-stream,同将文件名进行编码。 通过上述的代码,我们就可以将 User 对象导出Excel 文件中了。需要注意的是,我们只需要关注数据的转换和式化,而无需关注 Excel 的底层实现,从而实现了一种简单、易用的 Excel 导出方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值