EasyPoi Excel多Sheet导出(Java spring boot)

本文摘要

文中介绍了便捷Excel轮子easypoi,特点及使用方法,以及如何实现Excel多Sheet的导出功能

前言

Excel 作为开发中常用功能,经常需要用到,小老弟找了网上一些多Sheet导出的实现,都不太满意,因此根据EasyPoi的说明文档写了一个工具类,在这里和大家分享
EasyPoi和阿里的EasyExcel都有用过,是为便捷操作Excel的开源轮子,基于不重复造的原则,小老弟对使用较多的easyPoi进行本文所需功能的实现

EasyPoi支持如下

功能列表 详细
Excel导入 注解导入 && Map导入 && 大数据量导入sax模式 && 导入文件保存 && 文件校验 && 字段校验
Excel导出 注解导出 && 模板导出 && html导出,Excel自适应xls和xlsx两种格式
Excel转html
word导出 word只支持docx模式
pdf导出

准备工作

<dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.0.0</version> </dependency>

多sheet的Excel导出

生成workbook关键代码

/** * 创建workbook, * 通过maplist填充Excel内容 * 返回workbook * * 进一步使用可以写入流,e.g. * FileOutputStream fos = new FileOutputStream(file); * workbook.write(fos); * */ public static Workbook mutiSheet(List<Map<String, Object>> mapListList){ Workbook workbook = null; workbook = ExcelExportUtil.exportExcel(mapListList,ExcelType.XSSF); return workbook; }

多sheet工具类WorkBookUtils

import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import com.jdcloud.task.domain.vo.wenxian.IndustryStoreMomFungi; import org.apache.poi.ss.usermodel.Workbook; import java.util.HashMap; import java.util.List; import java.util.Map; public class WorkBookUtils { /** * 创建workbook, * 通过maplist填充Excel内容 * 返回workbook * * 进一步使用可以写入流,e.g. * FileOutputStream fos = new FileOutputStream(file); * workbook.write(fos); * */ public static Workbook mutiSheet(List<Map<String, Object>> mapListList){ Workbook workbook = null; workbook = ExcelExportUtil.exportExcel(mapListList,ExcelType.XSSF); return workbook; } public static Map<String, Object> createOneSheet(ExportParams exportParams,Class<?> clazz,List<?> data){ Map<String, Object> map = new HashMap<>(); map.put("title",exportParams);//new ExportParams("title"+i, "sheetName"+i, ExcelType.XSSF) map.put("entity", clazz); map.put("data",data); return map; } /* * 创建一个表格并填充内容 * 返回map供工作簿使用 * */ public static Map<String, Object> createOneSheet(String sheetName,String title,Class<?> clazz,List<?> data){ ExportParams exportParams = new ExportParams(title,sheetName, ExcelType.XSSF); return createOneSheet(exportParams,clazz,data); } }

service

/** * 将数据存储进response,调用接口就能下载文件 * */ public void exportData(HttpServletRequest request, HttpServletResponse response ) throws URISyntaxException, IOException { String fileName="data.xlsx"; File file = createDatafile(fileName); Object data=null; fillData(file,data); datatoResponse(request,response,file,fileName); } /** * 将数据存储进response,调用接口就能下载文件 * */ private void datatoResponse(HttpServletRequest request, HttpServletResponse response,File file,String fileName) throws IOException { OutputStream out = null; FileInputStream in = null; try { // 1.读取要下载的内容 in = new FileInputStream(file); // 2. 告诉浏览器下载的方式以及一些设置 // 解决文件名乱码问题,获取浏览器类型,转换对应文件名编码格式,IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码 String agent = request.getHeader("user-agent"); if (agent.contains("FireFox")) { fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1"); } else { fileName = URLEncoder.encode(fileName, "UTF-8"); } // 设置下载文件的mineType,告诉浏览器下载文件类型 String mineType = request.getServletContext().getMimeType(fileName); response.setContentType(mineType); // 设置一个响应头,无论是否被浏览器解析,都下载 response.setHeader("Content-disposition", "attachment; filename=" + fileName); // 将要下载的文件内容通过输出流写到浏览器 out = response.getOutputStream(); int len = 0; byte[] buffer = new byte[1024]; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { out.close(); } if (in != null) { in.close(); } } } /** * 设置文件路径 && 保证文件对象的正确打开 * */ private File createDatafile(String fileName) throws URISyntaxException, IOException { File file = null; String resource = this.getClass().getClassLoader().getResource("").getPath()+fileName; URI uri = new URI(resource); File myFile = new File(resource);//创建File对象,参数为String类型,表示目录名 //判断文件是否存在,如不存在则调用createNewFile()创建新目录,否则跳至异常处理代码 if(!myFile.exists()) myFile.createNewFile(); System.out.println("文件创建成功"); return myFile; } private File fillData(File savefile,Object data) throws IOException { List<Map<String, Object>> lists = new ArrayList<>(); //sheet1 List<Map<String, String>> datas1 = excelDao.queryTableColumns("whole_network_wenxian_region_trend_info"); Map<String, Object> temp1 = WorkBookUtils.createOneSheet("表1", "表头大标题", Map.class, datas1); lists.add(temp1); //sheet2 List<Map<String, String>> datas2 = excelDao.queryTableColumns("whole_network_wenxian_industry_trend"); Map<String, Object> temp2 = WorkBookUtils.createOneSheet("表2", "表头大标题", Map.class, datas2); lists.add(temp2); Workbook workbook = WorkBookUtils.mutiSheet(lists); FileOutputStream fos = new FileOutputStream(savefile); workbook.write(fos); fos.close(); return savefile; }

controller

@RequestMapping("/export") public void export(HttpServletRequest request, HttpServletResponse response) throws Exception { excelService.exportData(request,response); }

最终的效果图

QA

空表没数据的话,建议按如下步骤操作

  1. 断点调试验证要生成的数据datas2在写入时是存在的
  2. List<Map<String, String>> datas1 注意这里的value得是string类型的,有朋友使用其它类型后无法写入excel,估计是WorkBookUtils包的兼容性限制
  3. 尝试仅输入英文, 包括excel的列名、sheet名都改为英文,排除中文编码、其它编码问题
  4. 尝试仅生成空的表格,从而验证是否写入时写到了不存在的excel或sheet

__EOF__

本文作者钟子期
本文链接https://www.cnblogs.com/nishiliu/p/12674126.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   钟子期  阅读(8901)  评论(5编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示