原创 springboot葵花宝典 springboot葵花宝典 2024-01-25 12:03 发表于广东
EasyExcel导出万用模板
在实际的应用中,我们经常需要将数据导出到Excel文件中。EasyExcel 是一个基于 Java 的简单、方便、快速的 Excel 处理工具,它可以帮助我们轻松实现 Excel 的导入导出功能。本文将介绍如何使用 EasyExcel,实现导出多个子页签的数据,并支持合并功能
今日内容介绍,大约花费11分钟
##项目地址
https://github.com/bangbangzhou/springboot-learn/tree/main/spring-boot-export-excel
1.项目准备
完整项目结果如下:
1.1. 添加相关依赖
首先,确保你的项目中已经引入了 EasyExcel 库。可以通过 Maven在项目中添加以下依赖:
springboot葵花宝典
主要分享JAVA技术,主要包含SpringBoot、SpingCloud、Docker、中间件等技术,以及Github开源项目
247篇原创内容
公众号
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- easyexcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>com.xiaoleilu</groupId>
<artifactId>hutool</artifactId>
<version>2.16.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.32</version>
</dependency>
</dependencies>
2. 编写 ExcelExportUtil 类
编写一个通用的导出文件类ExcelExportUtil类,**ExcelExportUtil 类是一个通用的 Excel 导出工具类,支持导出多个子页签,并且可以进行合并操作。以下是两个主要方法:
-
exportMultipleSheetData: 导出多个子页签的数据。
-
exportMergeMultipleSheetData: 导出并合并多个子页签的数据。
@Slf4j
@Component
public class ExcelExportUtil<T, E> {
/**
* 多个子页签导出功能
*
* @param response 响应流
* @param fileName 导出的文件名
* @param data 导出的数据
* @param classArgs 导出的页签EXCEL类
* @throws Exception
*/
public void exportMultipleSheetData(HttpServletResponse response, String fileName, Map<Class, List<? extends Object>> data, Class<E>... classArgs) throws IOException {
this.exportMergeMultipleSheetData(response, fileName, null, 0, data, classArgs);
}
/**
* 多个子页签导出并且合并功能
*
* @param response 响应流
* @param fileName 导出的文件名
* @param mergeColumnIndex 需要合并的列
* @param mergeRowIndex 设置第几行开始合并
* @param data 导出的数据
* @param classArgs 导出的页签EXCEL类
* @throws Exception
*/
public void exportMergeMultipleSheetData(HttpServletResponse response, String fileName, int[] mergeColumnIndex, int mergeRowIndex,
Map<Class, List<? extends Object>> data, Class<E>... classArgs) throws IOException {
try {
fileName = new String(fileName.getBytes(), "UTF-8");
log.info("导出的文件名为:" + fileName);
response.addHeader("Content-Disposition", "filename=" + fileName);
//设置类型,扩展名为.xls
response.setContentType("application/vnd.ms-excel");
//将数据写入sheet页中
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
// 遍历每个页签实体
for (int i = 0; i < classArgs.length; i++) {
// 判断数据中是否存在实体类,如果存在则做导出
if (data.containsKey(classArgs[i])) {
String name = classArgs[i].getName().replace(classArgs[i].getPackageName()+".","");
WriteSheet writeSheet = EasyExcel.writerSheet(i, name).head(classArgs[i]).build();
excelWriter.write(data.get(classArgs[i]), writeSheet);
}
}
excelWriter.finish();
log.info("导出文件《" + fileName + "》成功");
response.flushBuffer();
} catch (Exception e) {
// 重置response
response.reset();
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
Map<String, String> map = new HashMap<String, String>();
map.put("status", "failure");
map.put("message", "下载文件失败" + e.getMessage());
response.getWriter().println(JSON.toJSONString(map));
}
}
}
3. 使用 EasyExcel 导出多个子页签数据
创建一个TutorialController,演示如何使用 ExcelExportUtil 类导出多个子页签的数据:
将导出的数据,按照子页签的类别放入一个 Map 中。然后使用 exportMultipleSheetData 方法进行导出。
@RestController
@RequestMapping("/tutorial")
public class TutorialController {
@Autowired
private TutorialService tutorialService;
@Autowired
private RoleService roleService;
@Autowired
private ExcelExportUtil excelExportUtil;
@PostMapping("/export")
public void packageItemsExportNew( HttpServletResponse response) throws IOException {
// 导出文件名
String fileName = "test";
List<Tutorial> list = tutorialService.list();
List<Role> list1 = roleService.list();
// 填充数据到每个子页签
Map<Class, List<? extends Object>> dataMap = new HashMap<>();
dataMap.put(Tutorial.class, list);
dataMap.put(Role.class, list1);
// 导出多个子页签的数据,不进行合并
excelExportUtil.exportMultipleSheetData(response, fileName, dataMap, Tutorial.class,Role.class);
}
}
4. 测试
使用Postman发送POST请求到http://localhost:8899/tutorial/export
注意:点击send and download进行下载
结果如下:每一个类名对应一个Sheet
总结:通过 EasyExcel我们可以轻松实现多个子页签数据的导出,为我们在项目中处理复杂的 Excel 导出需求提供了一种简单而有效的解决方案
##项目地址
https://github.com/bangbangzhou/springboot-learn/tree/main/spring-boot-export-excel
如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!
springboot葵花宝典
主要分享JAVA技术,主要包含SpringBoot、SpingCloud、Docker、中间件等技术,以及Github开源项目
247篇原创内容
公众号
原创不易,转载请注明出处,感谢支持!如果本文对您有用,欢迎转发分享!