ExcelUtil.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package com.ruoyi.common.utils.poi;
  2. import cn.hutool.core.util.IdUtil;
  3. import com.alibaba.excel.EasyExcel;
  4. import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
  5. import com.ruoyi.common.convert.ExcelBigNumberConvert;
  6. import com.ruoyi.common.excel.DefaultExcelListener;
  7. import com.ruoyi.common.excel.ExcelListener;
  8. import com.ruoyi.common.excel.ExcelResult;
  9. import com.ruoyi.common.utils.StringUtils;
  10. import com.ruoyi.common.utils.file.FileUtils;
  11. import lombok.AccessLevel;
  12. import lombok.NoArgsConstructor;
  13. import javax.servlet.ServletOutputStream;
  14. import javax.servlet.http.HttpServletResponse;
  15. import java.io.IOException;
  16. import java.io.InputStream;
  17. import java.util.List;
  18. /**
  19. * Excel相关处理
  20. *
  21. * @author Lion Li
  22. */
  23. @NoArgsConstructor(access = AccessLevel.PRIVATE)
  24. public class ExcelUtil {
  25. /**
  26. * 同步导入(适用于小数据量)
  27. *
  28. * @param is 输入流
  29. * @return 转换后集合
  30. */
  31. public static <T> List<T> importExcel(InputStream is, Class<T> clazz) {
  32. return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync();
  33. }
  34. /**
  35. * 使用校验监听器 异步导入 同步返回
  36. *
  37. * @param is 输入流
  38. * @param clazz 对象类型
  39. * @param isValidate 是否 Validator 检验 默认为是
  40. * @return 转换后集合
  41. */
  42. public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, boolean isValidate) {
  43. DefaultExcelListener<T> listener = new DefaultExcelListener<>(isValidate);
  44. EasyExcel.read(is, clazz, listener).sheet().doRead();
  45. return listener.getExcelResult();
  46. }
  47. /**
  48. * 使用自定义监听器 异步导入 自定义返回
  49. *
  50. * @param is 输入流
  51. * @param clazz 对象类型
  52. * @param listener 自定义监听器
  53. * @return 转换后集合
  54. */
  55. public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, ExcelListener<T> listener) {
  56. EasyExcel.read(is, clazz, listener).sheet().doRead();
  57. return listener.getExcelResult();
  58. }
  59. /**
  60. * 导出excel
  61. *
  62. * @param list 导出数据集合
  63. * @param sheetName 工作表的名称
  64. * @return 结果
  65. */
  66. public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response) {
  67. try {
  68. String filename = encodingFilename(sheetName);
  69. response.reset();
  70. FileUtils.setAttachmentResponseHeader(response, filename);
  71. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
  72. ServletOutputStream os = response.getOutputStream();
  73. EasyExcel.write(os, clazz)
  74. .autoCloseStream(false)
  75. // 自动适配
  76. .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
  77. // 大数值自动转换 防止失真
  78. .registerConverter(new ExcelBigNumberConvert())
  79. .sheet(sheetName).doWrite(list);
  80. } catch (IOException e) {
  81. throw new RuntimeException("导出Excel异常");
  82. }
  83. }
  84. /**
  85. * 解析导出值 0=男,1=女,2=未知
  86. *
  87. * @param propertyValue 参数值
  88. * @param converterExp 翻译注解
  89. * @param separator 分隔符
  90. * @return 解析后值
  91. */
  92. public static String convertByExp(String propertyValue, String converterExp, String separator) {
  93. StringBuilder propertyString = new StringBuilder();
  94. String[] convertSource = converterExp.split(",");
  95. for (String item : convertSource) {
  96. String[] itemArray = item.split("=");
  97. if (StringUtils.containsAny(propertyValue, separator)) {
  98. for (String value : propertyValue.split(separator)) {
  99. if (itemArray[0].equals(value)) {
  100. propertyString.append(itemArray[1] + separator);
  101. break;
  102. }
  103. }
  104. } else {
  105. if (itemArray[0].equals(propertyValue)) {
  106. return itemArray[1];
  107. }
  108. }
  109. }
  110. return StringUtils.stripEnd(propertyString.toString(), separator);
  111. }
  112. /**
  113. * 反向解析值 男=0,女=1,未知=2
  114. *
  115. * @param propertyValue 参数值
  116. * @param converterExp 翻译注解
  117. * @param separator 分隔符
  118. * @return 解析后值
  119. */
  120. public static String reverseByExp(String propertyValue, String converterExp, String separator) {
  121. StringBuilder propertyString = new StringBuilder();
  122. String[] convertSource = converterExp.split(",");
  123. for (String item : convertSource) {
  124. String[] itemArray = item.split("=");
  125. if (StringUtils.containsAny(propertyValue, separator)) {
  126. for (String value : propertyValue.split(separator)) {
  127. if (itemArray[1].equals(value)) {
  128. propertyString.append(itemArray[0] + separator);
  129. break;
  130. }
  131. }
  132. } else {
  133. if (itemArray[1].equals(propertyValue)) {
  134. return itemArray[0];
  135. }
  136. }
  137. }
  138. return StringUtils.stripEnd(propertyString.toString(), separator);
  139. }
  140. /**
  141. * 编码文件名
  142. */
  143. public static String encodingFilename(String filename) {
  144. return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx";
  145. }
  146. }