当前位置:   article > 正文

Java(SpringBoot2.x)使用POI导入数据到Excel_poi4.1.2 和 springboot2.x

poi4.1.2 和 springboot2.x

一、前言

最近做一个推送服务将系统某些报表,通过邮件附件的形式推送给指定的人,首先我们需要在服务端生成报表的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<Map<String, Object>>(数据列表)即可。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号