如何使用EasyExcel基于模板excel多sheet填充
在EasyExcel中,虽然fill
方法通常用于基于模板填充单个sheet的数据,但你可以通过一些技巧来实现基于模板填充多sheet的数据。以下是一个基本的步骤指南,展示了如何使用EasyExcel基于模板文件填充多个sheet:
- 准备模板文件:
- 创建一个Excel模板文件,该文件包含多个sheet,每个sheet都有预设的格式和样式。
- 在需要填充数据的单元格中,可以使用EasyExcel支持的占位符(例如
{name}
、{age}
等)来标记数据位置。
- 定义数据模型:
- 为每个sheet定义一个Java数据模型类,这些类应该与模板文件中对应sheet的列结构相匹配。
- 准备数据:
- 为每个sheet准备要填充的数据,这些数据可以是List集合、Map集合或其他数据结构。
- 使用ExcelWriter和fill方法:
- 创建一个
ExcelWriter
对象,并使用withTemplate
方法加载模板文件。 - 对于每个需要填充数据的sheet,创建一个
WriteSheet
对象(尽管在填充场景中通常不使用WriteSheet
的完整功能,但你可以用它来指定sheet名)。 - 注意:EasyExcel没有直接支持多sheet填充的API,因此你需要对每个sheet分别调用
fill
方法。但是,由于fill
方法通常需要一个模板和数据源(通常是Map或JavaBean),并且是基于占位符来替换数据的,你需要确保模板中的占位符与数据源中的键相匹配。 - 为了实现这一点,你可以为每个sheet创建一个单独的数据源(例如,一个Map或JavaBean实例),其中包含该sheet所需的所有数据,并且占位符与数据源中的键相匹配。
- 然后,对每个sheet调用
fill
方法,并传入相应的数据源和sheet名(或WriteSheet
对象,尽管在这个场景中它可能主要用于指定sheet名)。
- 创建一个
- 完成写入:
- 在所有数据都填充完毕后,调用
ExcelWriter
的finish
方法来完成写入操作。这将确保所有更改都被保存到文件中。
- 在所有数据都填充完毕后,调用
然而,由于EasyExcel的fill
方法主要是为单个sheet设计的,并且是基于占位符来替换数据的,因此在实际操作中可能会遇到一些限制。特别是当模板文件中的sheet结构复杂或需要填充的数据类型多样时,这种方法可能会变得不太实用。
在这种情况下,你可以考虑以下替代方案:
-
使用Apache POI:Apache POI是一个功能强大的Java库,可以用来读取和写入Microsoft Office文件,包括Excel文件。你可以使用Apache POI来加载模板文件,然后遍历每个sheet,并根据需要填充数据。虽然这种方法比使用EasyExcel的
fill
方法更复杂,但它提供了更高的灵活性和控制力。 -
拆分模板和合并结果:如果模板文件中的sheet数量有限,并且每个sheet的数据填充逻辑相对独立,你可以考虑为每个sheet创建一个单独的模板文件,并使用EasyExcel的
fill
方法分别填充每个模板文件。然后,你可以使用Apache POI或其他工具将这些填充后的文件合并成一个单独的Excel文件。 -
自定义实现:如果以上方法都不适合你的需求,你可以考虑自定义实现一个基于EasyExcel或Apache POI的解决方案,以满足你的特定要求。这可能涉及到编写额外的代码来解析模板文件、遍历sheet、填充数据以及保存结果。
请注意,以上建议和方法可能需要根据你的具体需求和模板文件的复杂性进行调整和修改。在选择最佳方案时,请权衡利弊并根据你的实际情况做出决策。
public static <T, P, Q> void writeToJs(FileTmplTypeEnum templType,
List<T> data1,
List<P> data2,
List<Q> data3,
List<String> sheetNames,
String fileName,
HttpServletRequest req,
HttpServletResponse resp) {
try (
ServletOutputStream os = resp.getOutputStream();
InputStream fis = new ClassPathResource("doc/" + templType.getPath()).getInputStream();
) {
setResponseHeaderLoge(fileName, req, resp);
ExcelWriter excelWriter = EasyExcel.write(os).withTemplate(fis).build();
WriteSheet sheet1 = EasyExcel.writerSheet(sheetNames.get(0)).build();
excelWriter.fill(data1, sheet1);
WriteSheet sheet2 = EasyExcel.writerSheet(sheetNames.get(1)).build();
excelWriter.fill(data2, sheet2);
WriteSheet sheet3 = EasyExcel.writerSheet(sheetNames.get(2)).build();
excelWriter.fill(data3, sheet3);
// 完成写入
excelWriter.finish();
} catch (Exception e) {
log.error("the write has a exception:{} ", e);
}
}
原文地址:https://blog.csdn.net/FlyingJiang/article/details/144093653
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!