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

Java處理表格的實(shí)用工具庫(kù)

 更新時(shí)間:2021年11月25日 10:24:25   作者:程序員魚(yú)皮  
EasyExcel是一個(gè)基于Java的簡(jiǎn)單、省內(nèi)存的讀寫(xiě)Excel的開(kāi)源項(xiàng)目,在盡可能節(jié)約內(nèi)存的情況下支持讀寫(xiě)百M(fèi)的Excel,下面這篇文章主要給大家分享介紹了一個(gè)關(guān)于Java處理表格的實(shí)用工具庫(kù),需要的朋友可以參考下

前言

處理 Excel 表格是開(kāi)發(fā)中經(jīng)常遇到的需求,比如表格合并、篩選表格中的某些行列、修改單元格數(shù)據(jù)等。

今天給大家分享一個(gè) Java 處理表格的工具庫(kù),不需要任何專(zhuān)業(yè)知識(shí),拿來(lái)就能用,快速又輕松~

可能有同學(xué)說(shuō)了,用 Python 處理表格不是更方便么?為毛用 Java 啊?

當(dāng)然是因?yàn)槠髽I(yè)中大部分后臺(tái)開(kāi)發(fā)用的都是 Java!如果你要搞一個(gè)允許用戶(hù)自主上傳 Excel 進(jìn)行處理的服務(wù),那顯然直接用 Java 來(lái)實(shí)現(xiàn)最方便~

Easy Excel

要介紹的庫(kù)是阿里的 Easy Excel,簡(jiǎn)單、省內(nèi)存的讀寫(xiě) Excel 的開(kāi)源項(xiàng)目。

文檔地址:www.yuque.com/easyexcel/d

直接打開(kāi)官方文檔,就能看到項(xiàng)目的使用說(shuō)明了:

首先在項(xiàng)目中引入 Easy Excel(版本號(hào)以文檔中的最新版本號(hào)為主):

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version>
</dependency>

然后進(jìn)入文檔的 快速開(kāi)始 部分,就可以看到讀取和寫(xiě)入表格數(shù)據(jù)的方法了。

下面讓我們以一個(gè)實(shí)際需求為例,試著使用一下這個(gè)庫(kù)。

需求

假設(shè)我們有這樣一個(gè) Excel 表格:

如果想要調(diào)換 姓名列 和 年齡列 的順序,應(yīng)該怎么做呢?

讀取表格

首先要讀取原始表格中的數(shù)據(jù)。

Easy Excel 提供了兩種讀取表格的方式:創(chuàng)建對(duì)象的讀 和 不創(chuàng)建對(duì)象的讀 。

創(chuàng)建對(duì)象的讀

如果你已知整個(gè)表格的表頭信息,比如列名(比如 “姓名”)和列的數(shù)據(jù)類(lèi)型(比如字符串),那么可以創(chuàng)建一個(gè)對(duì)應(yīng)的類(lèi),用來(lái)在 Java 中表示表格的元信息。

比如為上述表格創(chuàng)建 YupiData 類(lèi),代碼如下:

@Data
public class YupiData {
  // 姓名
  private String name;
  // 年齡
  private Integer age;
  // 出生日期
  private Date bornDate;
}

默認(rèn)會(huì)根據(jù)屬性的順序來(lái)關(guān)聯(lián)表格列的順序,比如 name 對(duì)應(yīng)姓名(第 0 列)、age 對(duì)應(yīng)年齡(第 1 列)。

當(dāng)然,你也可以使用注解的方式來(lái)指定每個(gè)屬性對(duì)應(yīng)的表格列,支持指定下標(biāo)和列名,代碼如下:

@Data
public class YupiData {
  // 強(qiáng)制讀取下標(biāo)為 2 的列(第三列)
  @ExcelProperty(index = 2)
  // 指定接受日期的格式
  @DateTimeFormat("yyyy/MM/dd")
  private Date bornDate;
    
  // 用名字去匹配,不能和其他列重復(fù)
  @ExcelProperty("年齡")
  private Integer age;
    
  @ExcelProperty("姓名")
  private String name;
}

定義好了表格數(shù)據(jù)類(lèi),就可以開(kāi)始讀取了,該庫(kù)非常貼心,提供了 同步 和 異步 兩種讀取方式。

同步是指一次性讀取表格中的所有行,以列表的方式完整返回,再整體去處理。由于這種方式會(huì)將數(shù)據(jù)完整加載到內(nèi)存中,因此只 適用于表格行數(shù)比較少 的情況。代碼如下:

/**
 * 同步讀取
 */
public void synchronousRead() {
  String fileName = "魚(yú)皮的表格.xlsx";
  // 讀取到的數(shù)據(jù)
  List<YupiData> list = EasyExcel.read(fileName)
  	.head(YupiData.class)
    .sheet()
    .doReadSync();
}

異步方式需要定義一個(gè) 監(jiān)聽(tīng)器 ,每讀取一行,就要立即去處理該行數(shù)據(jù)。這樣就不需要將所有數(shù)據(jù)都加載到內(nèi)存中,算一行讀一行,理論上算完了也可以丟棄。代碼如下:

/**
 * 定義監(jiān)聽(tīng)器
 */ 
public class YupiDataListener 
    implements ReadListener<YupiData> {
  /**
   * 每讀一行數(shù)據(jù),都會(huì)調(diào)用一次
   *
   * @param data 一行數(shù)據(jù)
   * @param context 上下文
   */
  @Override
  public void invoke(YupiData data, AnalysisContext context) {
    // 輸出姓名
    System.out.println(data.getName());
  }
}

/**
 * 開(kāi)始讀取
 */
void assynchronousRead() {
  String fileName = "魚(yú)皮的表格.xlsx";
  EasyExcel.read(fileName, YupiData.class,
      new YupiDataListener())
      .sheet()
      .doRead();
}

不創(chuàng)建對(duì)象的讀

如果事先不清楚表格會(huì)有哪些列、類(lèi)型如何(比如讓用戶(hù)自主上傳表格),那么可以使用 不創(chuàng)建對(duì)象讀 的方式,直接用 Map<Integer, String> 泛型類(lèi)來(lái)接收:

List<Map<Integer, String>> list = EasyExcel
    .read(fileName)
    .sheet()
    .doReadSync();
// Map 的 key 為列下標(biāo),value 為單元格的值
for (Map<Integer, String> data : list) {
	... 
}

當(dāng)然,這種讀取方式也同時(shí)支持同步和異步,可以根據(jù)需求選擇方式,靈活的一批!

寫(xiě)入表格

學(xué)會(huì)讀取后,寫(xiě)入表格就更簡(jiǎn)單了,依然是先定義一個(gè)類(lèi),用來(lái)表示要寫(xiě)入表格的元信息(列名、列數(shù)據(jù)類(lèi)型等)。

比如要完成表格列順序調(diào)換的需求,定義表格數(shù)據(jù)類(lèi)的時(shí)候,把 age 和 name 屬性的順序換一下就好了:

@Data
public class YupiWriteData {
  // 年齡 ↑
  private Integer age;
  // 姓名 ↓
  private String name;
  // 出生日期
  private Date bornDate;
}

然后執(zhí)行 Easy Excel 的 write 方法,就完事了,代碼如下:

void doWrite() {
  // 已讀取和處理后的數(shù)據(jù)列表
  List<YupiWriteData> dataList = xxx;
  String fileName = "result.xlsx";
  EasyExcel.write(fileName, YupiWriteData.class)
      .sheet("工作表1")
      .doWrite(dataList);
}

搞定,是不是賊簡(jiǎn)單!

除了這個(gè)庫(kù)外,Java 處理 Excel 的庫(kù)還有很多,比如 Apache POI、Hutool 等,大家可以去試試。但我個(gè)人感覺(jué)還是 Easy Excel 更對(duì)我的胃口。

EasyExcel特點(diǎn)

Java領(lǐng)域解析、生成Excel比較有名的框架有Apache poi、jxl等。但他們都存在一個(gè)嚴(yán)重的問(wèn)題就是非常的耗內(nèi)存。如果你的系統(tǒng)并發(fā)量不大的話(huà)可能還行,但是一旦并發(fā)上來(lái)后一定會(huì)OOM或者JVM頻繁的full gc。

EasyExcel是阿里巴巴開(kāi)源的一個(gè)excel處理框架,以使用簡(jiǎn)單、節(jié)省內(nèi)存著稱(chēng)。EasyExcel能大大減少占用內(nèi)存的主要原因是在解析Excel時(shí)沒(méi)有將文件數(shù)據(jù)一次性全部加載到內(nèi)存中,而是從磁盤(pán)上一行行讀取數(shù)據(jù),逐個(gè)解析。

EasyExcel采用一行一行的解析模式,并將一行的解析結(jié)果以觀察者的模式通知處理(AnalysisEventListener)。

總結(jié)

到此這篇關(guān)于Java處理表格實(shí)用工具庫(kù)的文章就介紹到這了,更多相關(guān)Java處理表格工具庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析Java方法傳值和傳引用問(wèn)題

    淺析Java方法傳值和傳引用問(wèn)題

    這篇文章主要是對(duì)Java方法傳值和傳引用問(wèn)題進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • Spring中BeanFactoryPostProcessors是如何執(zhí)行的

    Spring中BeanFactoryPostProcessors是如何執(zhí)行的

    BeanFactoryPostProcessor是Spring容器提供的一個(gè)擴(kuò)展機(jī)制,它允許開(kāi)發(fā)者在Bean的實(shí)例化和初始化之前對(duì)BeanDefinition進(jìn)行修改和處理,這篇文章主要介紹了你知道Spring中BeanFactoryPostProcessors是如何執(zhí)行的嗎,需要的朋友可以參考下
    2023-11-11
  • Java基礎(chǔ)之Filter的實(shí)例詳解

    Java基礎(chǔ)之Filter的實(shí)例詳解

    這篇文章主要介紹了Java基礎(chǔ)之Filter的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java基礎(chǔ)題新手練習(xí)(一)

    Java基礎(chǔ)題新手練習(xí)(一)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • java 枚舉類(lèi)中的valueOf用法說(shuō)明

    java 枚舉類(lèi)中的valueOf用法說(shuō)明

    這篇文章主要介紹了java 枚舉類(lèi)中的valueOf用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Mybatis-plus出現(xiàn)數(shù)據(jù)庫(kù)id很大或者為負(fù)數(shù)的解決

    Mybatis-plus出現(xiàn)數(shù)據(jù)庫(kù)id很大或者為負(fù)數(shù)的解決

    本文主要介紹了Mybatis-plus出現(xiàn)數(shù)據(jù)庫(kù)id很大或者為負(fù)數(shù)的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Java項(xiàng)目實(shí)現(xiàn)模擬ATM機(jī)

    Java項(xiàng)目實(shí)現(xiàn)模擬ATM機(jī)

    這篇文章主要為大家詳細(xì)介紹了Java項(xiàng)目實(shí)現(xiàn)模擬ATM機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • ehcache開(kāi)源緩存框架_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    ehcache開(kāi)源緩存框架_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Ehcache是現(xiàn)在最流行的純Java開(kāi)源緩存框架,這篇文章主要介紹了ehcache框架的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java歸并排序算法代碼實(shí)現(xiàn)

    Java歸并排序算法代碼實(shí)現(xiàn)

    歸并(Merge)排序法是將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)新的有序表,即把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的,下面這篇文章主要給大家介紹了關(guān)于Java歸并排序算法的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Java設(shè)計(jì)模式之模板方法模式詳解

    Java設(shè)計(jì)模式之模板方法模式詳解

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之模板方法模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03

最新評(píng)論

河西区| 昌吉市| 铅山县| 淮安市| 巢湖市| 连云港市| 德化县| 南陵县| 二连浩特市| 巴林右旗| 松原市| 灵寿县| 普安县| 当雄县| 潮安县| 进贤县| 台南县| 云浮市| 忻州市| 保靖县| 武义县| 繁昌县| 普格县| 方正县| 黔江区| 呼和浩特市| 裕民县| 临江市| 珠海市| 长武县| 芜湖市| 贵港市| 贺兰县| 通辽市| 兴安县| 乌苏市| 通河县| 临泉县| 广州市| 石门县| 綦江县|