ExcelUtils.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package cn.com.lzt.common.util;
  2. import cn.hutool.core.io.IoUtil;
  3. import cn.hutool.json.JSONArray;
  4. import cn.hutool.poi.excel.ExcelUtil;
  5. import cn.hutool.poi.excel.ExcelWriter;
  6. import cn.hutool.poi.excel.sax.handler.RowHandler;
  7. import org.apache.commons.lang3.StringUtils;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.web.multipart.MultipartFile;
  11. import javax.servlet.ServletOutputStream;
  12. import javax.servlet.http.HttpServletResponse;
  13. import java.io.IOException;
  14. import java.util.ArrayList;
  15. import java.util.HashMap;
  16. import java.util.List;
  17. import java.util.Map;
  18. /**
  19. * 导入导出工具类
  20. */
  21. public class ExcelUtils {
  22. private static final Logger logger = LoggerFactory.getLogger(ExcelUtils.class);
  23. private static List<List<Object>> lineList = new ArrayList<>();
  24. /**
  25. * excel 导出工具类
  26. *
  27. * @param response
  28. * @param fileName 文件名
  29. * @param projects 对象集合
  30. * @param columnNames 导出的excel中的列名
  31. * @param keys 对应的是对象中的字段名字
  32. * @throws IOException
  33. */
  34. public static void export(HttpServletResponse response, String fileName, List<?> projects, String[] columnNames, String[] keys) throws IOException {
  35. ExcelWriter bigWriter = ExcelUtil.getBigWriter();
  36. for (int i = 0; i < columnNames.length; i++) {
  37. bigWriter.addHeaderAlias(columnNames[i], keys[i]);
  38. bigWriter.setColumnWidth(i, 20);
  39. }
  40. // 一次性写出内容,使用默认样式,强制输出标题
  41. bigWriter.write(projects, true);
  42. //response为HttpServletResponse对象
  43. response.setContentType("application/vnd.ms-excel;charset=utf-8");
  44. //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
  45. response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".xlsx").getBytes(), "iso-8859-1"));
  46. ServletOutputStream out = response.getOutputStream();
  47. bigWriter.flush(out, true);
  48. // 关闭writer,释放内存
  49. bigWriter.close();
  50. //此处记得关闭输出Servlet流
  51. IoUtil.close(out);
  52. }
  53. /**
  54. * excel导入工具类
  55. *
  56. * @param file 文件
  57. * @param columNames 列对应的字段名
  58. * @return 返回数据集合
  59. * @throws OperationException
  60. * @throws IOException
  61. */
  62. public static List<Map<String, Object>> leading(MultipartFile file, String[] columNames) throws IOException {
  63. String fileName = file.getOriginalFilename();
  64. // 上传文件为空
  65. if (StringUtils.isEmpty(fileName)) {
  66. throw new IOException("没有导入文件");
  67. }
  68. //上传文件大小为1000条数据
  69. if (file.getSize() > 1024 * 1024 * 10) {
  70. logger.error("upload | 上传失败: 文件大小超过10M,文件大小为:{}", file.getSize());
  71. }
  72. // 上传文件名格式不正确
  73. if (fileName.lastIndexOf(".") != -1 && !".xlsx".equals(fileName.substring(fileName.lastIndexOf(".")))) {
  74. throw new IOException("文件名格式不正确, 请使用后缀名为.XLSX的文件");
  75. }
  76. //读取数据
  77. ExcelUtil.read07BySax(file.getInputStream(), 0, createRowHandler());
  78. //去除excel中的第一行数据
  79. lineList.remove(0);
  80. //将数据封装到list<Map>中
  81. List<Map<String, Object>> dataList = new ArrayList<>();
  82. for (int i = 0; i < lineList.size(); i++) {
  83. if (null != lineList.get(i)) {
  84. Map<String, Object> hashMap = new HashMap<>();
  85. for (int j = 0; j < columNames.length; j++) {
  86. Object property = lineList.get(i).get(j);
  87. hashMap.put(columNames[j], property);
  88. }
  89. dataList.add(hashMap);
  90. } else {
  91. break;
  92. }
  93. }
  94. return dataList;
  95. }
  96. /**
  97. * 通过实现handle方法编写我们要对每行数据的操作方式
  98. */
  99. private static RowHandler createRowHandler() {
  100. //清空一下集合中的数据
  101. lineList.removeAll(lineList);
  102. return new RowHandler() {
  103. @Override
  104. public void handle(int sheetIndex, int rowIndex, List rowlist) {
  105. //将读取到的每一行数据放入到list集合中
  106. JSONArray jsonObject = new JSONArray(rowlist);
  107. lineList.add(jsonObject.toList(Object.class));
  108. }
  109. };
  110. }
  111. }