1. 程式人生 > 實用技巧 >hutool工具包實現的匯出實體到excel功能

hutool工具包實現的匯出實體到excel功能

說明

在此工具類中使用了hutool工具包,具體依賴介紹參考官方https://www.hutool.cn/docs/#/poi/概述
以及 lombok,在實體屬性中需加入@ApiModelProperty註解,程式碼中也有說明,有不明白的或者更好的方法歡迎留言。

/**
 * @author: yang
 * @Date: Create in 2020/7/16
 * @Explain: 封裝hutool工具類實現的匯出excel功能
 */
public class ExportExcelUtil {
  static final Log logger = LogFactory.get(ExportExcelUtil.class);
  public static void
  export(HttpServletResponse response, Class clazz, List <? > list) throws Exception {
    if(!list.isEmpty()) {
      if(!list.get(0).getClass().equals(clazz)) {
        logger.error("資料型別與傳入的集合資料型別不一致!資料型別:{}; 集合資料型別:{}", clazz, list.get(0).getClass());
        throw new Exception("資料型別與傳入的集合資料型別不一致!");
      } else {
        ExcelWriter writer = ExcelUtil.getWriter();
        // 獲取當前類欄位
        Field[] fields = clazz.getDeclaredFields();
        // 欄位名稱集合
        List < String > fieldNames = new ArrayList < > ();
        // 欄位中文名稱集合(獲取實體中@ApiModelProperty註解value的值)
        List < String > cnNames = new ArrayList < > ();
        for(Field field: fields) {
          if(!field.isAccessible()) {
            // 關閉反射訪問安全檢查,為了提高速度
            field.setAccessible(true);
          }
          String fieldName = field.getName();
          // 排除ID和序號
          if(!"sid".equals(fieldName) && !"serialVersionUID".equals(fieldName) && !"ordernum".equals(fieldName)) {
            fieldNames.add(fieldName);
          }
          // 判斷是否有@ApiModelProperty註解
          boolean annotationPresent = field.isAnnotationPresent(ApiModelProperty.class);
          if(annotationPresent && !"sid".equals(fieldName)) {
            ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
            String name = annotation.value();
            cnNames.add(name);
          }
        }
        String[] fs = fieldNames.toArray(new String[0]);
        String[] ns = cnNames.toArray(new String[0]);
        for(int i = 0; i < ns.length; i++) {
          // 設定表頭及欄位名
          writer.addHeaderAlias(fs[i], ns[i]);
        }
        // 自動換行
        Workbook workbook = writer.getWorkbook();
        StyleSet styleSet = new StyleSet(workbook);
        styleSet.setWrapText();
        writer.setStyleSet(styleSet);
        writer.write(list, true);
        ServletOutputStream out = response.getOutputStream();;
        try {
          for(int i = 0; i < fieldNames.size(); i++) {
            writer.setColumnWidth(i, 23);
          }
          response.setContentType("application/x-msdownload;charset=utf-8");
          String ecodeFileName = URLEncoder.encode("excel", "UTF-8");
          response.setHeader("Content-Disposition", "attachment;filename=" + ecodeFileName + ".xls");
          writer.flush(out, true);
          writer.close();
          IoUtil.close(out);
        } catch(IOException e) {
          logger.error(e.getMessage());
          e.printStackTrace();
        }
      }
    } else {
      logger.error("資料集合為空");
      throw new Exception("資料集合為空");
    }
  }
}