疯狂的狮子li
2021-11-29 42295ef2ac0a5e78674cf24b62d6834138f0ffdc
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
@@ -4,7 +4,9 @@
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.ruoyi.common.convert.ExcelBigNumberConvert;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.excel.DefaultExcelListener;
import com.ruoyi.common.excel.ExcelListener;
import com.ruoyi.common.excel.ExcelResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUtils;
@@ -21,129 +23,133 @@
 */
public class ExcelUtil {
   /**
    * 对excel表单默认第一个索引名转换成list(EasyExcel)
    *
    * @param is 输入流
    * @return 转换后集合
    */
   public static <T> List<T> importExcel(InputStream is, Class<T> clazz) {
      return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync();
   }
    /**
     * 同步导入(适用于小数据量)
     *
     * @param is 输入流
     * @return 转换后集合
     */
    public static <T> List<T> importExcel(InputStream is, Class<T> clazz) {
        return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync();
    }
   /**
    * 对list数据源将其里面的数据导入到excel表单(EasyExcel)
    *
    * @param list      导出数据集合
    * @param sheetName 工作表的名称
    * @return 结果
    */
   public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response) {
      try {
         String filename = encodingFilename(sheetName);
         response.reset();
         FileUtils.setAttachmentResponseHeader(response, filename);
         response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
         ServletOutputStream os = response.getOutputStream();
         EasyExcel.write(os, clazz)
            .autoCloseStream(false)
            // 自动适配
            .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
            // 大数值自动转换 防止失真
            .registerConverter(new ExcelBigNumberConvert())
            .sheet(sheetName).doWrite(list);
      } catch (IOException e) {
         throw new RuntimeException("导出Excel异常");
      }
   }
   /**
    * 解析导出值 0=男,1=女,2=未知
    *
    * @param propertyValue 参数值
    * @param converterExp  翻译注解
    * @param separator     分隔符
    * @return 解析后值
    */
   public static String convertByExp(String propertyValue, String converterExp, String separator) {
      StringBuilder propertyString = new StringBuilder();
      String[] convertSource = converterExp.split(",");
      for (String item : convertSource) {
         String[] itemArray = item.split("=");
         if (StringUtils.containsAny(separator, propertyValue)) {
            for (String value : propertyValue.split(separator)) {
               if (itemArray[0].equals(value)) {
                  propertyString.append(itemArray[1] + separator);
                  break;
               }
            }
         } else {
            if (itemArray[0].equals(propertyValue)) {
               return itemArray[1];
            }
         }
      }
      return StringUtils.stripEnd(propertyString.toString(), separator);
   }
    /**
     * 使用校验监听器 异步导入 同步返回
     *
     * @param is         输入流
     * @param clazz      对象类型
     * @param isValidate 是否 Validator 检验 默认为是
     * @return 转换后集合
     */
    public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, boolean isValidate) {
        DefaultExcelListener<T> listener = new DefaultExcelListener<>(isValidate);
        EasyExcel.read(is, clazz, listener).sheet().doRead();
        return listener.getExcelResult();
    }
   /**
    * 反向解析值 男=0,女=1,未知=2
    *
    * @param propertyValue 参数值
    * @param converterExp  翻译注解
    * @param separator     分隔符
    * @return 解析后值
    */
   public static String reverseByExp(String propertyValue, String converterExp, String separator) {
      StringBuilder propertyString = new StringBuilder();
      String[] convertSource = converterExp.split(",");
      for (String item : convertSource) {
         String[] itemArray = item.split("=");
         if (StringUtils.containsAny(separator, propertyValue)) {
            for (String value : propertyValue.split(separator)) {
               if (itemArray[1].equals(value)) {
                  propertyString.append(itemArray[0] + separator);
                  break;
               }
            }
         } else {
            if (itemArray[1].equals(propertyValue)) {
               return itemArray[0];
            }
         }
      }
      return StringUtils.stripEnd(propertyString.toString(), separator);
   }
    /**
     * 使用自定义监听器 异步导入 自定义返回
     *
     * @param is       输入流
     * @param clazz    对象类型
     * @param listener 自定义监听器
     * @return 转换后集合
     */
    public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, ExcelListener<T> listener) {
        EasyExcel.read(is, clazz, listener).sheet().doRead();
        return listener.getExcelResult();
    }
   /**
    * 解析字典值
    *
    * @param dictValue 字典值
    * @param dictType  字典类型
    * @param separator 分隔符
    * @return 字典标签
    */
   public static String convertDictByExp(String dictValue, String dictType, String separator) {
      return DictUtils.getDictLabel(dictType, dictValue, separator);
   }
    /**
     * 导出excel
     *
     * @param list      导出数据集合
     * @param sheetName 工作表的名称
     * @return 结果
     */
    public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response) {
        try {
            String filename = encodingFilename(sheetName);
            response.reset();
            FileUtils.setAttachmentResponseHeader(response, filename);
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
            ServletOutputStream os = response.getOutputStream();
            EasyExcel.write(os, clazz)
                .autoCloseStream(false)
                // 自动适配
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                // 大数值自动转换 防止失真
                .registerConverter(new ExcelBigNumberConvert())
                .sheet(sheetName).doWrite(list);
        } catch (IOException e) {
            throw new RuntimeException("导出Excel异常");
        }
    }
   /**
    * 反向解析值字典值
    *
    * @param dictLabel 字典标签
    * @param dictType  字典类型
    * @param separator 分隔符
    * @return 字典值
    */
   public static String reverseDictByExp(String dictLabel, String dictType, String separator) {
      return DictUtils.getDictValue(dictType, dictLabel, separator);
   }
    /**
     * 解析导出值 0=男,1=女,2=未知
     *
     * @param propertyValue 参数值
     * @param converterExp  翻译注解
     * @param separator     分隔符
     * @return 解析后值
     */
    public static String convertByExp(String propertyValue, String converterExp, String separator) {
        StringBuilder propertyString = new StringBuilder();
        String[] convertSource = converterExp.split(",");
        for (String item : convertSource) {
            String[] itemArray = item.split("=");
            if (StringUtils.containsAny(separator, propertyValue)) {
                for (String value : propertyValue.split(separator)) {
                    if (itemArray[0].equals(value)) {
                        propertyString.append(itemArray[1] + separator);
                        break;
                    }
                }
            } else {
                if (itemArray[0].equals(propertyValue)) {
                    return itemArray[1];
                }
            }
        }
        return StringUtils.stripEnd(propertyString.toString(), separator);
    }
   /**
    * 编码文件名
    */
   public static String encodingFilename(String filename) {
      return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx";
   }
    /**
     * 反向解析值 男=0,女=1,未知=2
     *
     * @param propertyValue 参数值
     * @param converterExp  翻译注解
     * @param separator     分隔符
     * @return 解析后值
     */
    public static String reverseByExp(String propertyValue, String converterExp, String separator) {
        StringBuilder propertyString = new StringBuilder();
        String[] convertSource = converterExp.split(",");
        for (String item : convertSource) {
            String[] itemArray = item.split("=");
            if (StringUtils.containsAny(separator, propertyValue)) {
                for (String value : propertyValue.split(separator)) {
                    if (itemArray[1].equals(value)) {
                        propertyString.append(itemArray[0] + separator);
                        break;
                    }
                }
            } else {
                if (itemArray[1].equals(propertyValue)) {
                    return itemArray[0];
                }
            }
        }
        return StringUtils.stripEnd(propertyString.toString(), separator);
    }
    /**
     * 编码文件名
     */
    public static String encodingFilename(String filename) {
        return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx";
    }
}