日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

@excel 注解_7 行代码实现 Excel 文件导出

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @excel 注解_7 行代码实现 Excel 文件导出 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作 者:犬小哈

來 源:首發自「小哈學Java」

廣而告之:由于此訂閱號換了個皮膚,系統自動取消了讀者的公眾號置頂。導致用戶接受文章不及時。可以打開訂閱號,選擇置頂(標星)公眾號,重磅干貨,第一時間送達!

目錄

  • 一、前言

  • 二、Apache poi、jxl 的缺陷

  • 三、阿里出品的 EasyExcel,安利一波

  • 四、EasyExcel 解決了什么

  • 五、快速上手

  • 六、特殊場景支持

  • 七、Web 下載示例代碼

  • 八、需要注意的點

  • 九、總結

一、前言

關于導出 Excel 文件,可以說是大多數服務中都需要集成的功能。那么,要如何優雅快速地(偷懶地)去實現這個功能呢?

你可能第一想法是:這還不簡單?用 Apache 開源框架 poi, 或者 jxl 都可以實現啊。面向百度編程,把代碼模板 copy 下來,根據自己的業務再改改,能有多難?

嗯.. 的確不難,但是你的代碼可能是下面這個熊樣子的:

上面這段代碼看上去是不是又臭又長呢?今天,小哈將教您如何使用 7 行代碼搞定 Excel 文件生成功能!

二、Apache poi、jxl 的缺陷

在說如何實現之前,我們先來討論一下傳統 Excel 框架的不足!除了上面說的,Apache poi、jxl 都存在生成 excel 文件不夠簡單優雅快速外,它們都還存在一個嚴重的問題,那就是非常耗內存嚴重時會導致內存溢出

POI 雖然目前來說,是 excel 解析框架中被使用最廣泛的,但這個框架并不完美。

為什么這么說呢?

開發者們大部分使用 POI,都是使用其 userModel 模式。而 userModel 的好處是上手容易使用簡單,隨便拷貝個代碼跑一下,剩下就是寫業務轉換了,雖然轉換也要寫上百行代碼,但是還是可控的。

然而 userModel 模式最大的問題是在于,對內存消耗非常大,一個幾兆的文件解析甚至要用掉上百兆的內存。現實情況是,很多應用現在都在采用這種模式,之所以還正常在跑是因為并發不大,并發上來后,一定會OOM或者頻繁的 full gc。

三、阿里出品的 EasyExcel,安利一波

什么是 EasyExcel? 見名知意,就是讓你操作 Excel 異常的酸爽。先來看下 EasyExcel GitHub 官方截圖:

截止目前為止已有 5519 Star, 官方對其的簡介是:

快速、簡單避免OOM的java處理Excel工具!

以下是官方介紹:

四、EasyExcel 解決了什么

主要來說,有以下幾點:

  • 傳統 Excel 框架,如 Apache poi、jxl 都存在內存溢出的問題;

  • 傳統 excel 開源框架使用復雜、繁瑣;

  • EasyExcel 底層還是使用了 poi, 但是做了很多優化,如修復了并發情況下的一些 bug, 具體修復細節,可閱讀官方文檔https://github.com/alibaba/easyexcel;

五、快速上手

5.1 添加依賴

com.alibaba

easyexcel

1.1.2-beta5

5.2 七行代碼搞定 Excel 生成

上面這段示例代碼中,有兩個點很重要,小哈已經重點標注標:

  • ①:WriteModel 這個對象就是要寫入 Excel 的數據模型對象,等等,你這好像不行吧?表頭 head,以及每個單元格內的數據順序都沒指定,能達到想要的效果么?別急,后面會討論這塊!

  • :創建需要寫入的數據集,當然了,正常業務中,這塊都是從數據庫中查詢出來的。

PS: 如果說寫入的數據量很大,需要做分片查詢再寫入的處理,否則可能會 OOM(Out of Memory).

回過頭來,我們來看看 WriteModel 這個對象內部到底有什么幺蛾子!

ExayExcel 提供注解的方式, 來方便的定義 Excel 需要的數據模型:

  • :首先,定義的寫入模型必須要繼承自?BaseRowModel.java;

  • :通過?@ExcelProperty?注解來指定每個字段的列名稱,以及下標位置

同時,上面定義的 createModelList() 方法也很簡單,通過循環,創建一個寫入模型的 List 集合:

廢話不多說,這個快速接入的案例也介紹的差不多了,跑一跑單元測試看下實際效果:

怎么樣,效果還是挺棒棒的!

六、特殊場景支持

在實際的業務中,我們還會有一些特需的需求,比如說下面這些。

6.1 動態生成 Excel 內容

上面的例子是基于注解的,也就是說表頭 head, 以及內容都是寫死的,換句話說,我定義好了一個數據模型,那么,生成的 Excel 文件也就是只能遵循這種模型來了,但是,實際業務中可能會存在動態變化的需求,要怎么做呢?

  • :無注解模式,動態添加表頭,也可自由組合復雜表頭,代碼如下:

  • :創建動態數據,注意這里的數據類型是?Object:

跑一下單元測試,看下效果:

6.2 自定義表頭以及內容樣式

我想自定義表頭,內容樣式,咋辦?

我們復用了上面的示例代碼,并額外添加了設置自定義表格樣式的代碼, createTableStytle()具體內容如下:

我們可以通過 TableStyle 這個類來設置表頭、表格主題的樣式。

6.3 合并單元格

我們可以通過 merge() 方法來合并單元格:

注意下標是從 0 開始的,也就是說合并了第六行到第七行,其中的第一列到第五列,跑下代碼,看下效果:

6.4 自定義處理

對于更復雜的處理,EasyExcel 預留了 WriterHandler 接口來,允許你自定義處理代碼:

接口中定義了三個方法:

  • sheet(): 在創建每個 sheet 后自定義業務邏輯處理;

  • row(): 在創建每個 row 后自定義業務邏輯處理;

  • cell(): 在創建每個 cell 后自定義業務邏輯處理;

我們實現了該接口后,編寫自定義邏輯處理代碼,然后調用 getWriterWithTempAndHandler()靜態方法獲取 ExcelWriter 對象時,傳入 WriterHandler 的實現類即可。

比如下面的示例代碼:

ExcelWriter writer = EasyExcelFactory.getWriterWithTempAndHandler(null, out, ExcelTypeEnum.XLSX, true, new MyWriterHandler());

七、Web 下載示例代碼

public class Down {

@GetMapping("/a.htm")

public void cooperation(HttpServletRequest request, HttpServletResponse response) {

ServletOutputStream out = response.getOutputStream();

ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);

String fileName = new String(("UserInfo " + new SimpleDateFormat("yyyy-MM-dd").format(new Date()))

.getBytes(), "UTF-8");

Sheet sheet1 = new Sheet(1, 0);

sheet1.setSheetName("第一個sheet");

writer.write0(getListString(), sheet1);

writer.finish();

response.setContentType("multipart/form-data");

response.setCharacterEncoding("utf-8");

response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx");

out.flush();

}

}

八、需要注意的點

8.1 寫入大數據時,需分片

比如說,我們需要從數據庫中查詢出數據量較大時,我們需要在業務層做分片處理,也就是,我們需要分多次查詢,再寫入,防止內存溢出 OOM.

8.2 Excel 最大行數問題

Excel 03, 07 版本均有行數、列數的限制:

版本最大行最大列
Excel 200365536256
Excel 2007104857616384

csv 由于是文本文件,實際上沒有最大行數的限制,但是用 Excel 客戶端打開還是多了不顯示。

也就是說,如果你想寫入更多的行數是不行的,強行這么做,程序會報類似如下異常

Invalid row number (1048576) outside allowable range (0..1048575)

如何解決呢?

  • 分多個 Excel 文件寫入;

  • 同一個 Excel 文件,分多個 Sheet 寫入;

  • 九、總結

    小哈今天主要給小伙伴介紹了 EasyExcel, 為什么要使用它,以及演示了相關示例代碼。當然了,EasyExcel 除了寫 Excel 文件外,它還有快速讀取 Excel 的功能,由于本文主要介紹的是:如何優雅地實現 Excel 文件生成,所以就沒有介紹了,有興趣的小伙伴們,也可以去 GitHub 官網去去查看相關文檔。

    最后,祝您看完本文后有所收獲,下期見!

    十、GitHub 源碼地址

    https://github.com/weiwosuoai/spring-boot-tutorial/tree/master/spring-boot-excel

    十一、參考文獻

    https://github.com/alibaba/easyexcel

    1.??前端高級工程師,需要掌握哪些技術?

    2.??IEEE下令清理華為系審稿人!

    3.?分庫分表就能無限擴容嗎?

    4.?我在 GitHub 上見過哪些奇葩的 Chrome 插件?

    總結

    以上是生活随笔為你收集整理的@excel 注解_7 行代码实现 Excel 文件导出的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。