最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 中EasyExcel的使用方式

 更新時(shí)間:2022年08月01日 09:09:12   作者:程序新視界  
這篇文章主要介紹了Java 中EasyExcel的使用方式,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

背景

系統(tǒng)中經(jīng)常要導(dǎo)出大量的數(shù)據(jù),格式基本上都是Excel,然而每次導(dǎo)表都是對系統(tǒng)內(nèi)存的一次挑戰(zhàn)。

在Java領(lǐng)域,生成或解析Excel的框架比較有名的當(dāng)屬Apache的poi和jxl了。但使用它們,會(huì)面臨著嚴(yán)重的內(nèi)存損耗問題。如果系統(tǒng)的并發(fā)量還不行,一旦導(dǎo)出大量數(shù)據(jù),便會(huì)出現(xiàn)JVM頻繁full gc,甚至導(dǎo)致OOM。

EasyExcel是阿里巴巴開源的一個(gè)Excel處理框架,使用簡單、節(jié)省內(nèi)存。節(jié)省內(nèi)存的原理也很簡單,在解析Excel時(shí)沒有將文件數(shù)據(jù)全部加載到內(nèi)存當(dāng)中,而是從磁盤文件中一行行讀取。

今天這篇文章就帶大家來了解一下EasyExcel的使用,個(gè)人使用后的感慨是:太簡單易用了。

項(xiàng)目構(gòu)建及依賴

首先創(chuàng)建一個(gè)Maven項(xiàng)目,在pom文件中添加如下依賴:

<dependency>
 ? ? <groupId>com.alibaba</groupId>
 ? ? <artifactId>easyexcel</artifactId>
 ? ? <version>2.2.8</version>
</dependency>

當(dāng)引入該依賴之后,會(huì)發(fā)現(xiàn)在項(xiàng)目的依賴文件中同時(shí)多出了poi的類庫。也就是說,EasyExcel是基于poi來進(jìn)行實(shí)現(xiàn)的,間接地引入了如下依賴:

<dependency>
 ? ? <groupId>org.apache.poi</groupId>
 ? ? <artifactId>poi</artifactId>
 ? ? <version>3.17</version>
</dependency>
<dependency>
 ? ? <groupId>org.apache.poi</groupId>
 ? ? <artifactId>poi-ooxml</artifactId>
 ? ? <version>3.17</version>
</dependency>

所以,當(dāng)你的項(xiàng)目中已經(jīng)引入了poi的依賴,要考慮一下版本的兼容問題。

創(chuàng)建實(shí)體類

EasyExcel易用性的體現(xiàn)之一就是可以通過在實(shí)體類中使用注解的形式,來與Excel中的表頭進(jìn)行綁定。

現(xiàn)在直接上實(shí)體類:

@Data
public class UserData {
?
  @ExcelProperty(index = 0, value = "姓名")
  private String username;
?
  @ExcelProperty(index = 1, value = "年齡")
  private int age;
?
  @DateTimeFormat("yyyy-MM-dd")
  @ExcelProperty(index = 2, value = "生日")
  private Date birthday;
}

在上面的實(shí)體類中@Data為Lombok的注解,當(dāng)然你可以自行生成getter/setter方法,其他的注解均為EasyExcel提供的:

  • @ExcelProperty:用于設(shè)置Excel表頭,其中index用戶表頭的編號(hào),從0開始;value為表頭對應(yīng)的內(nèi)容。
  • @DateTimeFormat:用于日期的格式化。

完成上述功能準(zhǔn)備工作之后,我們先來生成一個(gè)Excel。

生成Excel

下面直接展示生成Excel的示例代碼:

public class EasyExcelDemo {
  public static void main(String[] args) {
    // 實(shí)現(xiàn)excel寫操作
    //1.設(shè)置寫入文件夾地址和excel文件名稱
    String fileName = "/Users/zzs/temp/excel/write.xlsx";
    //調(diào)用easyExcel里面的方法實(shí)現(xiàn)寫操作
    //2個(gè)參數(shù),第一個(gè)參數(shù)是文件名稱,第二個(gè)參數(shù)是實(shí)體類
    EasyExcel.write(fileName, UserData.class).sheet("學(xué)生信息表").doWrite(getData());
  }
?
  //創(chuàng)建方法返回list集合
  public static List<UserData> getData() {
    List<UserData> list = new ArrayList<>();
?
    UserData userData1 = new UserData();
    userData1.setUsername("張三");
    userData1.setAge(22);
    userData1.setBirthday(formatDate("2000-10-11"));
    list.add(userData1);
?
    UserData userData2 = new UserData();
    userData2.setUsername("李四");
    userData2.setAge(23);
    userData2.setBirthday(formatDate("1999-5-3"));
    list.add(userData2);
    return list;
  }
  public static Date formatDate(String birthday) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");
    try {
      return sdf.parse(birthday);
    } catch (ParseException e) {
      e.printStackTrace();
    }
    return null;
  }
}

除了準(zhǔn)備數(shù)據(jù)的代碼,核心代碼只有main方法中調(diào)用的EasyExcel.write方法,就是如此的簡單。EasyExcel的write方法會(huì)根據(jù)傳入的數(shù)據(jù)和實(shí)體類UserData進(jìn)行綁定,生成Excel文件。

我們來看一下Excel的效果:

生成效果還不錯(cuò),而且使用起來是不是非常簡單?

解析Excel

再來看看解析Excel的操作,直接用上面生成的Excel文件。

首先創(chuàng)建一個(gè)監(jiān)聽器ExcelListener,集成EasyExcel提供AnalysisEventListener類:

public class ExcelListener extends AnalysisEventListener<UserData> {
  /**
   * 一行一行的讀取excel內(nèi)容
   */
  @Override
  public void invoke(UserData data, AnalysisContext analysisContext) {
    System.out.println("****" + data);
  }

  /**
   * 讀取表頭內(nèi)容
   */
  @Override
  public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    System.out.println("表頭" + headMap);
  }
  /**
   * 讀取完成操作
   */
  @Override
  public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    System.out.println("讀取Excel完畢");
  }
}

在該監(jiān)聽器中,通過重寫AnalysisEventListener的方法來獲得解析的數(shù)據(jù)、表頭信息,以及解析完畢之后執(zhí)行的操作信息。

同樣寫Excel一樣,通過EasyExcel類的靜態(tài)方法來執(zhí)行讀操作:

public class EasyExcelReadDemo {

  public static void main(String[] args) {
    // 實(shí)現(xiàn)excel寫操作
    //1.設(shè)置寫入文件夾地址和excel文件名稱
    String fileName = "/Users/zzs/temp/excel/write.xlsx";
    //調(diào)用easyExcel里面的方法實(shí)現(xiàn)寫操作
    //2個(gè)參數(shù),第一個(gè)參數(shù)是文件名稱,第二個(gè)參數(shù)是實(shí)體類
    EasyExcel.read(fileName, UserData.class, new ExcelListener()).sheet().doRead();
  }
}

執(zhí)行上述方法,打印信息如下:

表頭{0=姓名, 1=年齡, 2=生日}
****UserData(username=張三, age=22, birthday=Wed Oct 11 00:00:00 CST 2000)
****UserData(username=李四, age=23, birthday=Mon May 03 00:00:00 CST 1999)
讀取Excel完畢

最先是打印了表頭信息,這里也可以看到表頭的排序是從0開始的。然后,讀取并打印了對應(yīng)的Excel內(nèi)容,兩條數(shù)據(jù);最后,執(zhí)行讀取完的方法中的日志打印。

看完了上面的整個(gè)操作,解析Excel是不是變得非常簡單了?再也不為解析Excel犯愁了。

其他相關(guān)特殊用法

上面提到的@DateTimeFormat注解可轉(zhuǎn)換日期格式,還有其他類似功能的注解和自定義轉(zhuǎn)換器。

自定義轉(zhuǎn)換器

通過自定義轉(zhuǎn)換器,比如將1、0轉(zhuǎn)換成男、女的實(shí)例:

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;

public class SexConverter implements Converter<Integer> {

 ?  @Override
 ?  public Class<Integer> supportJavaTypeKey() {
 ? ? ?  return Integer.class;
 ?  }

 ?  @Override
 ?  public CellDataTypeEnum supportExcelTypeKey() {
 ? ? ?  return CellDataTypeEnum.STRING;
 ?  }

 ?  @Override
 ?  public Integer convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
 ? ? ?  return "男".equals(cellData.getStringValue()) ? 1 : 0;
 ?  }

 ?  @Override
 ?  public CellData<String> convertToExcelData(Integer integer, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
 ? ? ?  return new CellData<>(integer.equals(1) ? "男" : "女");
 ?  }
}

性別屬性注入SexConverter轉(zhuǎn)換器:

@ExcelProperty(value = "性別", converter = SexConverter.class)
private Integer sex;

再次生成Excel,性別字段內(nèi)容便顯示為:男、女字樣。

保留兩位小數(shù)

比如體重需要保留兩位小數(shù),可通過@NumberFormat 注解實(shí)現(xiàn):

@ExcelProperty(value = "體重KG")
@NumberFormat("0.##") // 會(huì)以字符串形式生成單元格,要計(jì)算的列不推薦
private BigDecimal weight;

另外一種方法是使用@ContentStyle注解:

@ContentStyle(dataFormat = 2)
private BigDecimal weight2;

這樣也能達(dá)到保留兩位小數(shù)的效果。

當(dāng)然,也可以使用實(shí)現(xiàn)Converter接口的方式實(shí)現(xiàn)(同性別實(shí)現(xiàn))。

排除指定Excel列

在很多場景下,Excel的列與實(shí)體類可能并不完全一致,這時(shí)就需要排除一些實(shí)體類的字段。

方式一:類上加注解 @ExcelIgnoreUnannotated,過濾屬性沒有@ExcelProperty注解的字段

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor  // 一定要有無參構(gòu)造方法
@ExcelIgnoreUnannotated
public class UserData {
 ?  .....
}

方式二:指定字段加@ExcelIgnore注解

@ExcelIgnore // 該字段不生成excel
private String remark;

方式三:代碼指定過濾字段,通過excludeColumnFiledNames方法:

    EasyExcel.write(fileName, UserData.class).sheet("學(xué)生信息表").excludeColumnFiledNames(Arrays.asList("remark")).doWrite(getData());

這種方法的好處是:同一Excel可以在調(diào)用方法時(shí)排除不同的數(shù)據(jù)列。

小結(jié)

本文介紹了EasyExcel的使用,整體而言操作簡單、使用方便,提供了不少注解,方便與實(shí)體對象之間的關(guān)系綁定。而且官網(wǎng)也提供了相關(guān)的性能數(shù)據(jù),更多的API使用大家還可以繼續(xù)探索。

無論從性能或易用性上來說,都值得你嘗試。特別是臨時(shí)寫一個(gè)Excel的解析或生成的工具,再也不用惆悵一行行的解析了,趕緊收藏用起來吧。

到此這篇關(guān)于Java 中EasyExcel的使用方式的文章就介紹到這了,更多相關(guān)Java 中EasyExcel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot?去掉netflix?禁用Eureka的解決方法

    springboot?去掉netflix?禁用Eureka的解決方法

    這篇文章主要介紹了springboot?去掉netflix?禁用Eureka的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • 關(guān)于Mysql的四種存儲(chǔ)引擎

    關(guān)于Mysql的四種存儲(chǔ)引擎

    這篇文章主要介紹了關(guān)于Mysql的四種存儲(chǔ)引擎,MySql的核心就是存儲(chǔ)引擎,不同的存儲(chǔ)引擎提供不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平等功能,使用不同的存儲(chǔ)引擎,還可以 獲得特定的功能,需要的朋友可以參考下
    2023-05-05
  • java安全?ysoserial?CommonsCollections1示例解析

    java安全?ysoserial?CommonsCollections1示例解析

    這篇文章主要介紹了java安全?ysoserial?CommonsCollections1示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 學(xué)習(xí)Java之自定義異常與NullPointerException的處理

    學(xué)習(xí)Java之自定義異常與NullPointerException的處理

    有時(shí)候Java自身提供的異常類并不能很好地表達(dá)我們的需求,所以這時(shí)候我們就可以自定義異常,也就是說,我們可以制造出一個(gè)自己的異常類,這樣就可以拋出或捕獲自己的異常了,本文就給大家詳細(xì)講講Java自定義異常與NullPointerException的處理
    2023-08-08
  • 新手了解java 反射基礎(chǔ)知識(shí)

    新手了解java 反射基礎(chǔ)知識(shí)

    這篇文章主要介紹了Java反射機(jī)制的相關(guān)內(nèi)容,涉及了class類的動(dòng)態(tài)加載,獲取成員變量、構(gòu)造函數(shù)信息等信息,需要的朋友可以參考下,希望對你有所幫助
    2021-07-07
  • 解決java 查看JDK中底層源碼的實(shí)現(xiàn)方法

    解決java 查看JDK中底層源碼的實(shí)現(xiàn)方法

    本篇文章是對在java中查看JDK中底層源碼的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 關(guān)于ResponseEntity類和HttpEntity及跨平臺(tái)路徑問題

    關(guān)于ResponseEntity類和HttpEntity及跨平臺(tái)路徑問題

    這篇文章主要介紹了關(guān)于ResponseEntity類和HttpEntity及跨平臺(tái)路徑問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring RestTemplate具體使用詳解

    Spring RestTemplate具體使用詳解

    這篇文章主要介紹了Spring RestTemplate具體使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • Spring注解@Autowired和@Resource的區(qū)別詳解

    Spring注解@Autowired和@Resource的區(qū)別詳解

    這篇文章主要介紹了Spring注解@Autowired和@Resource的區(qū)別詳解,@Autowired與@Resource都可以用來裝配bean,都可以寫在字段或setter方法上,@Resource是JDK提供的注解,默認(rèn)按照名稱進(jìn)行裝配,名稱可通過name屬性進(jìn)行指定,需要的朋友可以參考下
    2023-12-12
  • Spring之異步任務(wù)@Async解讀

    Spring之異步任務(wù)@Async解讀

    這篇文章主要介紹了Spring之異步任務(wù)@Async,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論

松溪县| 绍兴市| 吴旗县| 阳江市| 固安县| 江永县| 体育| 绥阳县| 吉林省| 嫩江县| 桂东县| 伽师县| 密云县| 涡阳县| 邵阳县| 万盛区| 张掖市| 香河县| 武威市| 林州市| 隆回县| 诸暨市| 香港| 平陆县| 元阳县| 布拖县| 大悟县| 公安县| 新乡县| 奇台县| 固原市| 江都市| 嵩明县| 婺源县| 库伦旗| 醴陵市| 连山| 九龙县| 泽州县| 长沙市| 吴堡县|