ExcelUtil.java 5.4 KB

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