ExcelUtil.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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.utils.DictUtils;
  7. import com.ruoyi.common.utils.StringUtils;
  8. import com.ruoyi.common.utils.file.FileUtils;
  9. import javax.servlet.ServletOutputStream;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.IOException;
  12. import java.io.InputStream;
  13. import java.net.URLEncoder;
  14. import java.nio.charset.StandardCharsets;
  15. import java.util.List;
  16. /**
  17. * Excel相关处理
  18. *
  19. * @author ruoyi
  20. */
  21. public class ExcelUtil {
  22. /**
  23. * 对excel表单默认第一个索引名转换成list(EasyExcel)
  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. * 对list数据源将其里面的数据导入到excel表单(EasyExcel)
  33. *
  34. * @param list 导出数据集合
  35. * @param sheetName 工作表的名称
  36. * @return 结果
  37. */
  38. public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response) {
  39. try {
  40. String filename = encodingFilename(sheetName);
  41. response.reset();
  42. response.addHeader("Access-Control-Allow-Origin", "*");
  43. response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
  44. FileUtils.setAttachmentResponseHeader(response, URLEncoder.encode(filename, StandardCharsets.UTF_8.toString()));
  45. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
  46. ServletOutputStream os = response.getOutputStream();
  47. EasyExcel.write(os, clazz)
  48. .autoCloseStream(false)
  49. // 自动适配
  50. .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
  51. // 大数值自动转换 防止失真
  52. .registerConverter(new ExcelBigNumberConvert())
  53. .sheet(sheetName).doWrite(list);
  54. } catch (IOException e) {
  55. throw new RuntimeException("导出Excel异常");
  56. }
  57. }
  58. /**
  59. * 解析导出值 0=男,1=女,2=未知
  60. *
  61. * @param propertyValue 参数值
  62. * @param converterExp 翻译注解
  63. * @param separator 分隔符
  64. * @return 解析后值
  65. */
  66. public static String convertByExp(String propertyValue, String converterExp, String separator) {
  67. StringBuilder propertyString = new StringBuilder();
  68. String[] convertSource = converterExp.split(",");
  69. for (String item : convertSource) {
  70. String[] itemArray = item.split("=");
  71. if (StringUtils.containsAny(separator, propertyValue)) {
  72. for (String value : propertyValue.split(separator)) {
  73. if (itemArray[0].equals(value)) {
  74. propertyString.append(itemArray[1] + separator);
  75. break;
  76. }
  77. }
  78. } else {
  79. if (itemArray[0].equals(propertyValue)) {
  80. return itemArray[1];
  81. }
  82. }
  83. }
  84. return StringUtils.stripEnd(propertyString.toString(), separator);
  85. }
  86. /**
  87. * 反向解析值 男=0,女=1,未知=2
  88. *
  89. * @param propertyValue 参数值
  90. * @param converterExp 翻译注解
  91. * @param separator 分隔符
  92. * @return 解析后值
  93. */
  94. public static String reverseByExp(String propertyValue, String converterExp, String separator) {
  95. StringBuilder propertyString = new StringBuilder();
  96. String[] convertSource = converterExp.split(",");
  97. for (String item : convertSource) {
  98. String[] itemArray = item.split("=");
  99. if (StringUtils.containsAny(separator, propertyValue)) {
  100. for (String value : propertyValue.split(separator)) {
  101. if (itemArray[1].equals(value)) {
  102. propertyString.append(itemArray[0] + separator);
  103. break;
  104. }
  105. }
  106. } else {
  107. if (itemArray[1].equals(propertyValue)) {
  108. return itemArray[0];
  109. }
  110. }
  111. }
  112. return StringUtils.stripEnd(propertyString.toString(), separator);
  113. }
  114. /**
  115. * 解析字典值
  116. *
  117. * @param dictValue 字典值
  118. * @param dictType 字典类型
  119. * @param separator 分隔符
  120. * @return 字典标签
  121. */
  122. public static String convertDictByExp(String dictValue, String dictType, String separator) {
  123. return DictUtils.getDictLabel(dictType, dictValue, separator);
  124. }
  125. /**
  126. * 反向解析值字典值
  127. *
  128. * @param dictLabel 字典标签
  129. * @param dictType 字典类型
  130. * @param separator 分隔符
  131. * @return 字典值
  132. */
  133. public static String reverseDictByExp(String dictLabel, String dictType, String separator) {
  134. return DictUtils.getDictValue(dictType, dictLabel, separator);
  135. }
  136. /**
  137. * 编码文件名
  138. */
  139. public static String encodingFilename(String filename) {
  140. return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx";
  141. }
  142. }