设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间23 现在时间23 缓存数据 荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

查看: 726|回复: 1

SpringBoot2.x使用POI实现导入数据到Excel

[复制链接]

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:7
  • 最近打卡:2025-11-30 12:58:11
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
32
主题
28
精华
0
金钱
106
积分
62
注册时间
2023-10-3
最后登录
2025-11-30

发表于 2025-8-28 03:27:54 | 显示全部楼层 |阅读模式

一、前言

最近做一个推送服务将系统某些报表,通过邮件附件的形式推送给指定的人,首先我们需要在服务端生成报表的excel文档。生成excel文档采用的是POI的方式。

二、pom引入相应的jar包

引入三个poi相关的jar包

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi</artifactId>
  4. <version>4.1.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.poi</groupId>
  8. <artifactId>poi-ooxml</artifactId>
  9. <version>4.1.2</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.poi</groupId>
  13. <artifactId>poi-ooxml-schemas</artifactId>
  14. <version>4.1.2</version>
  15. </dependency>
复制代码

注意:这三个jar包的版本号一定要保持一致。否则的话会引起异常,无法创建XSSFWorkbook

三、导出方法封装类

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.apache.http.client.utils.DateUtils;
  3. import org.apache.poi.ss.usermodel.Cell;
  4. import org.apache.poi.ss.usermodel.Row;
  5. import org.apache.poi.ss.usermodel.Sheet;
  6. import org.apache.poi.ss.usermodel.Workbook;
  7. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  8. import java.io.FileOutputStream;
  9. import java.io.IOException;
  10. import java.sql.Timestamp;
  11. import java.util.*;
  12. /**
  13. * POI导出Excel封装
  14. * @author lenny
  15. * @date 20210715
  16. */
  17. @Slf4j
  18. public class ExcelUtil {
  19. /**
  20. * @param fileName excel文件名
  21. * @param headMap 表头map
  22. * @param dataList 表格数据
  23. */
  24. public static String exportExcel(String fileName,Map<String, String> headMap, List<Map<String, Object>> dataList) {
  25. String fullPath="";
  26. Workbook workbook = exportXlsx(fileName, headMap, dataList);
  27. FileOutputStream outputStream=null;
  28. try {
  29. //将生成的excel存储在系统根目录下excel文件夹中
  30. String path=CommonUtil.getRunningDirectory()+"\\excel\";
  31. fullPath=path+fileName;
  32. outputStream = new FileOutputStream(path+fileName);
  33. workbook.write(outputStream);
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. } finally {
  37. if (outputStream != null) {
  38. try {
  39. outputStream.close();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }
  45. //返回文件所在的目录
  46. return fullPath;
  47. }
  48. /**
  49. * 导出数据
  50. *
  51. * @param headMap 表头map
  52. * @param dataList 导出的数据
  53. */
  54. public static Workbook exportXlsx(String sheetName, Map<String, String> headMap, List<Map<String, Object>> dataList) {
  55. try {
  56. XSSFWorkbook workbook = new XSSFWorkbook();
  57. Sheet sheet = workbook.createSheet(sheetName);
  58. //初始化行列索引
  59. int rowIndex = 0, columnIndex = 0;
  60. Set<String> keys = headMap.keySet();
  61. //表头
  62. Row row = sheet.createRow(rowIndex++);
  63. for (String key : keys) {
  64. Cell cell = row.createCell(columnIndex++);
  65. cell.setCellValue(headMap.get(key));
  66. }
  67. //内容
  68. if (dataList != null && !dataList.isEmpty()) {
  69. for (Map<String, Object> map : dataList) {
  70. row = sheet.createRow(rowIndex++);
  71. columnIndex = 0;
  72. for (String key : keys) {
  73. Cell cell = row.createCell(columnIndex++);
  74. setCellValue(cell, map.get(key));
  75. }
  76. }
  77. }
  78. return workbook;
  79. }catch (Exception e){
  80. log.error(e.toString());
  81. return null;
  82. }
  83. }
  84. /**
  85. * 填充单元格内容
  86. * @param cell
  87. * @param obj
  88. */
  89. private static void setCellValue(Cell cell, Object obj) {
  90. if (obj == null) {
  91. return;
  92. }
  93. if (obj instanceof String) {
  94. cell.setCellValue((String) obj);
  95. } else if (obj instanceof Date) {
  96. Date date = (Date) obj;
  97. if (date != null) {
  98. cell.setCellValue(DateUtils.formatDate(date));
  99. }
  100. } else if (obj instanceof Calendar) {
  101. Calendar calendar = (Calendar) obj;
  102. if (calendar != null) {
  103. cell.setCellValue(DateUtils.formatDate(calendar.getTime()));
  104. }
  105. } else if (obj instanceof Timestamp) {
  106. Timestamp timestamp = (Timestamp) obj;
  107. if (timestamp != null) {
  108. cell.setCellValue(DateUtils.formatDate(new Date(timestamp.getTime())));
  109. }
  110. } else if (obj instanceof Double) {
  111. cell.setCellValue((Double) obj);
  112. } else {
  113. cell.setCellValue(obj.toString());
  114. }
  115. }
  116. }
复制代码

其中使用到了封装的获取系统根目录的方法,方法实现如下:

  1. /**
  2. * 得到程序运行的根目录
  3. * @return
  4. */
  5. public static String getRunningDirectory()
  6. {
  7. return System.getProperty("user.dir");
  8. }
复制代码

四、调用方法执行生成excel操作

  1. /**
  2. * 导出Adas报警
  3. * @param reportAdasList
  4. * @param language
  5. * @param timeDiff
  6. * @return
  7. */
  8. public static String exportAdasReport(List<ReportAdasList> reportAdasList, int language, int timeDiff) {
  9. //表头
  10. Map<String, String> headNameMap = new LinkedHashMap<String, String>();
  11. headNameMap.put("agentName", getHeadName("agentName",language));
  12. headNameMap.put("vehicleName", getHeadName("vehicleName",language));
  13. headNameMap.put("assetID", getHeadName("assetID",language));
  14. headNameMap.put("alarmType", getHeadName("alarmType",language));
  15. headNameMap.put("alarmLevel", getHeadName("alarmLevel",language));
  16. headNameMap.put("startTime", getHeadName("startTime",language));
  17. headNameMap.put("endTime", getHeadName("endTime",language));
  18. headNameMap.put("driverName", getHeadName("driverName",language));
  19. headNameMap.put("startAddress", getHeadName("startAddress",language));
  20. headNameMap.put("endAddress", getHeadName("endAddress",language));
  21. headNameMap.put("processStatus", getHeadName("processStatus",language));
  22. headNameMap.put("processContext", getHeadName("processContext",language));
  23. headNameMap.put("processTime", getHeadName("processTime",language));
  24. //表格数据
  25. List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
  26. for(ReportAdasList item : reportAdasList){
  27. Map<String, Object> map = new HashMap<String, Object>();
  28. map.put("agentName", item.getAgentName());
  29. map.put("vehicleName", item.getVehicleName());
  30. map.put("assetID", item.getAssetID());
  31. map.put("alarmType", language==1?item.getCnName():item.getEnName());
  32. map.put("alarmLevel", getAlarmLevel(item.getAlarmLevel(),language));
  33. map.put("startTime", CommonUtil.getLocalTime(item.getStartTime(),timeDiff));
  34. map.put("endTime", CommonUtil.getLocalTime(item.getEndTime(),timeDiff));
  35. map.put("driverName", item.getDriverName());
  36. map.put("startAddress", CommonUtil.geoCoding(String.valueOf(item.getStartLatitude()),String.valueOf(item.getStartLongitude()),language));
  37. map.put("endAddress", CommonUtil.geoCoding(String.valueOf(item.getEndLatitude()),String.valueOf(item.getEndLongitude()),language));
  38. map.put("processStatus", getProcessStatus(item.getProcessStatus(),language));
  39. map.put("processContext", item.getProcessContext());
  40. map.put("processTime", CommonUtil.getLocalTime(item.getProcessTime(),timeDiff));
  41. dataList.add(map);
  42. }
  43. String fileName = "";
  44. if(language==1) {
  45. fileName= CommonConstants.CN_REPORT_ADAS;
  46. }else {
  47. fileName=CommonConstants.EN_REPORT_ADAS;
  48. }
  49. fileName=fileName+".xlsx";
  50. String fullPath = ExcelUtil.exportExcel(fileName,headNameMap,dataList);
  51. return fullPath;
  52. }
复制代码

这里大家可以根据自己的系统自行调整,最后封装成headMap(表头字段)与List>(数据列表)即可。

到此这篇关于SpringBoot2.x使用POI实现导入数据到Excel的文章就介绍到这了,更多相关SpringBoot POI导入数据到Excel内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
22
积分
24
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2025-8-29 09:41:24 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表