Spring Boot使用EasyExecl導出Execl

2021-01-10 網易

  在做後臺管理系統的時候,很多場景都會遇到Execl的導入和導出,如果在以前的話,我們基本都是用POI這個組件,不得不說,這個組件的功能確實強大,但是也有有一些弊端,比如內存佔用高、文件過大會導致OOM。後來,阿里開源的EasyExecl就能很好解決這些問題。


  在開始之前,我們需要對EasyEexcl有個初步的了解,這裡,我只有去Github或者是語雀查看相關的資料。

  這裡,我們先引入EasyExecl所以的組件

   com.alibabagroupId> easyexcelartifactId> 2.2.7version>dependency>

  EasyExecl常用註解

  EasyExecl提供了很多註解,使得我們在導出Execl的時候更加的方便

  ExcelProperty

  

指定當前欄位對應excel中的哪一列。可以根據名字或者Index去匹配。當然也可以不寫,默認第一個欄位就是index=0,以此類推。千萬注意,要麼全部不寫,要麼全部用index,要麼全部用名字去匹配。千萬別三個混著用,除非你非常了解原始碼中三個混著用怎麼去排序的。

  @Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface ExcelProperty { String[] value() default {""}; int index() default -1; #指定當前欄位對應excel中的那一列 int order() default Integer.MAX_VALUE; #用於排序 Class converter() default AutoConverter.class; @Deprecated String format() default "";}

  ExcelIgnore

  

默認所有欄位都會和excel去匹配,加了這個註解會忽略該欄位

  DateTimeFormat

  

日期轉換,用String去接收excel日期格式的數據會調用這個註解。裡面的value參照java.text.SimpleDateFormat

  @Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface DateTimeFormat { String value() default ""; boolean use1904windowing() default false;}

  NumberFormat

  

數字轉換,用String去接收excel數字格式的數據會調用這個註解。裡面的value參照java.text.DecimalFormat

  @Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface NumberFormat { String value() default ""; RoundingMode roundingMode() default RoundingMode.HALF_UP;}

  @ExcelIgnore

  

這個註解的作用就是我們導出 Excel 的時候有些屬性可以忽略,那麼我們就在屬性上面加上此註解即可。

  @Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface ExcelIgnore {}

  ExcelIgnoreUnannotated

  

這個註解的作用是忽略未註解的,我們如果一個實體類有太多想忽略的欄位的話可以在實體類上加上該註解,這樣就不用每個屬性上去每個添加 @ExcelIgnore 註解了。

  @Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface ExcelIgnoreUnannotated {}

  ColumnWidth

  

表格列寬度

  @Target({ElementType.FIELD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface ColumnWidth { int value() default -1; # 表格寬度,默認-1}

  ContentRowHeight

  

表格行高

  @Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface ContentRowHeight { short value() default -1;}

  HeadRowHeight

  

表頭行高

  @Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface HeadRowHeight { short value() default -1;}

  ContentLoopMerge

  

合併單元格。

  @Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface ContentLoopMerge { int eachRow() default -1; int columnExtend() default 1;}

  除了上面這些註解,還有一些關於表格樣式的註解,如HeadStyle、HeadFontStyle、ContentFontStyle等。下面,我就用註解來實現我們的Execl導出,首先需要一個類

  @Getter@Setter@ContentRowHeight(15)public class PercentageExeclExportVo { @ColumnWidth(20) @ExcelProperty(value = "工號",index = 0) private String jobCode; @ExcelProperty(value = "姓名",index = 1) private String name; @ExcelProperty(value = "月份",index = 2) private String month; @ExcelProperty(value = "收入",index = 3) @NumberFormat(value ="#.##" ,roundingMode= RoundingMode.HALF_UP) private BigDecimal income;}

  然後取出對應的數據,直接調用EasyExecl提供的API接口下載

   @ApiOperation(value = "導出數據") @PostMapping(value = "/execl-export") public void execlExport(@RequestBody PercentageCalcResultInVo inVo, HttpServletResponse response) throws DefaultException { try { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 這裡URLEncoder.encode可以防止中文亂碼 當然和easyexcel沒有關係 String fileName = URLEncoder.encode("人員提成收入", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); // 這裡需要設置不關閉流 EasyExcel.write(response.getOutputStream(), PercentageExeclExportVo.class).sheet("提成") .doWrite(percentageService.queryPercentageData(inVo)); } catch (Exception e) { throw new DefaultException(e.getMessage()); } }


  這裡只是做一個簡單的示例,在語雀也有更多示例,朋友們就自己去借鑑一番。這裡我只提一點,由於我們基於kubesphere將應用部署到Docker中會報錯

  Error: java.lang.reflect.InvocationTargetException com.alibaba.excel.exception.ExcelGenerateException: java.lang.InternalError: java.lang.reflect.InvocationTargetExceptionjava.lang.NullPointerException: null at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262)

  我們最開始是Dockerfile是這樣的

  FROM java:openjdk-8-jre-alpineWORKDIR /homeCOPY *.jar /homeENV JAVA_OPTS="-server -Xmx2g -Xms2g"ENTRYPOINT java -jar *.jar ${JAVA_OPTS}

  其實主要是因為openjdk的鏡像中缺少字體包。所以,要解決這個問題,要麼就是在docker加入字體,要麼就更換鏡像。我這邊是用的後者,將Dockerfile改為

  FROM java:8WORKDIR /homeCOPY *.jar /homeENV JAVA_OPTS="-server -Xmx2g -Xms2g"ENTRYPOINT java -jar *.jar ${JAVA_OPTS}

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關焦點

  • execl中INDEX函數的詳細舉例介紹
    execl中INDEX函數的詳細舉例介紹一個簡單的操作,一份真誠的分享,現在在execl中INDEX函數的詳細舉例介紹的操作過程和技巧分享給大家,過程簡單看圖就會做,教程是自己原創的,其他分享平臺估計也能看到
  • 精心分享execl中COUNTIF函數學習及運用的第一個環節
    分享execl中COUNTIF函數學習及運用發這個圖片是為了,提醒自己和屏幕前面的你們,不論學execl和健身都需要堅持,東西就那麼多,但是你要學到自己心裡,就跟健身一樣,光看別人的健身成果你自己身上的肉沒有減掉那怎麼能行呢,所以要堅持。
  • execl中sumproduct函數的介紹和使用說明
    一個簡單的操作,一份真誠的分享,現在把execl中sumproduct函數的介紹和使用說明的操作過程和技巧分享給大家,過程簡單看圖就會做,教程是自己原創的,其他分享平臺估計也能看第一步:sumproduct函數的意思說明:在給定的幾組數組中,
  • Springboot整合easyExcel導入導出Excel
    excel,因此在此記錄學習一下如何使用Springboot整合easyExcel;需求:資料庫中有張user表,有個業務要求可以導入、導出「用戶名單.xls」表一、準備:創建項目:關於springboot項目如何創建這裡不再贅述,放一張項目結構圖:1、導入easyexcel、mybatis、mysql依賴
  • execl中rank函數怎麼用,我來告訴你
    execl中rank函數怎麼用第一步:rank函數它能夠將數字的排名單獨顯示在另一列,而且可以去除重名次第五步:我們用降序在測試下,=RANK(A12,$A$12:$A$19,0)和=RANK(A13,$A$12:$A$19),這兩個公式都可以正常使用
  • Spring Boot中Tomcat、Jetty、Undertow的使用
    Tomcat在我們使用SpringBoot開發WebApi時,會引入spring-boot-starter-web這個starter組件,其自帶了Tomcat容器,所以我們平時新建項目啟動起來,會看見Tomcat相關的一些信息。
  • SpringBoot整合EasyPoi實現Excel的導入和導出(帶圖片)
    ,Java操作Excel的方式有很多種,這裡簡單介紹一下如何使用EasyPoi來操作Excel。EasyPoi文檔:http://easypoi.mydoc.io/項目地址:https://gitee.com/lihongmin5211/springboot_easypoi準備工作環境:SpringBoot2.4.0、jdk8、Mysql5.7表結構:
  • 如何在execl表格裡面去除空白單元格,看我的介紹
    在execl表格裡面去除空白單元格一個簡單的操作,一份真誠的分享,現在把在EXECL中如何去掉空白單元格的操作過程和技巧分享給大家,過程簡單看圖就會做,教程是自己原創的,其他分享平臺估計也能看到。
  • Spring Boot 2.4 手工和 SDKMAN! 安裝 Spring Boot 命令行
    可用的下載地址,請參考下面的連結:spring-boot-cli-2.4.2-SNAPSHOT-bin.zipspring-boot-cli-2.4.2-SNAPSHOT-bin.tar.gzSapshot 版本下載,snapshot 版本的意思是從最新的原始碼庫中進行編譯構建的,通常這個版本具有更多的 Bug 修復,下載地址請訪問下面的連結: snapshot 構建版本
  • 使用IntelliJ IDEA創建一個Maven的Spring Boot項目
    </groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent>
  • Spring Boot 和 Spring 到底有啥區別?
    Spring Boot 理論+實戰系列教程大家看這個:https://github.com/javastacks/spring-boot-best-practice首先,讓我們看一下使用Spring創建Web應用程式所需的最小依賴項<dependency> <groupId>
  • spring boot 整合shiro 錯誤
    最近在弄spring boot 整合shiro的。凱哥現在用的是spring boot。web.xml沒有。但是凱哥配置了shiro的核心攔截器啊。如下圖:並且使用了@Configuration這個註解了。
  • Spring Boot Admin 2.2.4 發布,兼容最新版本 Spring Boot
    spring boot admin 2.2.4 版本發布,本版本為 bug 修復版本 主要兼容 spring boot 2.3.x。
  • Spring SPI和Spring Boot SPI - 第345篇
    那麼同樣的道理,spring-boot-autoconfigure模塊也能動態加載了。org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\org.springframework.boot.autoconfigure.condition.OnBeanCondition,\org.springframework.boot.autoconfigure.condition.OnClassCondition
  • Spring Boot集成JDBCTemplate
    使用JDBC時的實例代碼如下:public class DbUtil { private static final String URL = "jdbc:mysql://127.0.0.1:3306/spring"; private static final String USER
  • Spring 和 Spring Boot 之間到底有啥區別?
    ><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.0.6.RELEASE</version></dependency
  • Spring Boot 常見錯誤及解決方法
    Spring Boot 作為 Java 生態中最流行的開發框架,意味著被數以萬計的開發者所使用。下面根據我們自身遇到的問題,加上用戶提供的一些反饋,來大致梳理下 Spring Boot 的常見錯誤及解決方法。找不到配置?配置不對?配置被覆蓋?
  • 使用IntelliJ IDEA創建Spring Boot項目
    在上一篇使用Spring Initializer創建Spring Boot項目 文章中,介紹了使用Spring Initializr創建Spring Boot項目,在本篇文章中,將一步一步介紹使用IntelliJ IDEA創建Spring Boot項目。
  • EXECL中COUNT和COUNTA實例進階之一COUNT函數的精心講解
    注意:execl中TRUE和FALSE代表1和0,這個要牢記第三步:我們要先算下核心的東西,到底有幾個張無忌呢?看公式:=A5:C8="張無忌",這個時候我們全選整個公式,然後按下F9鍵,可以看到好多的TRUE和FALSE,這個時候你就明白了吧。
  • Spring Boot中使用Mockito進行Web測試 - 第339篇
    好了進入正題,我們添加web依賴:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId><