easyExcel實現分批導入,動態表頭分批導出,以及導出表格樣式設置

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

一,分批導入

1.首先配置表格頭映射類
@Getter
@Setter
@EqualsAndHashCode
public class IndexOrNameData {/*** 強制讀取第三個 這里不建議 index 和 name 同時用,要么一個對象只用index,要么一個對象只用name去匹配*/@ExcelProperty(index = 2)private Double doubleData;/*** 用名字去匹配,這里需要注意,如果名字重復,會導致只有一個字段讀取到數據*/@ExcelProperty("字符串標題")private String string;@ExcelProperty("日期標題")private Date date;
}
2.編寫excel數據讀監聽器
// 有個很重要的點 DemoDataListener 不能被spring管理,要每次讀取excel都要new,然后里面用到spring可以構造方法傳進去
@Slf4j
public class DemoDataListener implements ReadListener<IndexOrNameData > {/*** 每隔5條存儲數據庫,實際使用中可以100條,然后清理list ,方便內存回收*/private static final int BATCH_COUNT = 100;/*** 緩存的數據*/private List<IndexOrNameData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);/*** 假設這個是一個DAO,當然有業務邏輯這個也可以是一個service。當然如果不用存儲這個對象沒用。*/private DemoDAO demoDAO;public DemoDataListener() {// 這里是demo,所以隨便new一個。實際使用如果到了spring,請使用下面的有參構造函數demoDAO = new DemoDAO();}/*** 如果使用了spring,請使用這個構造方法。每次創建Listener的時候需要把spring管理的類傳進來** @param demoDAO*/public DemoDataListener(DemoDAO demoDAO) {this.demoDAO = demoDAO;}/*** 這個每一條數據解析都會來調用** @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/@Overridepublic void invoke(IndexOrNameData  data, AnalysisContext context) {log.info("解析到一條數據:{}", JSON.toJSONString(data));cachedDataList.add(data);// 達到BATCH_COUNT了,需要去存儲一次數據庫,防止數據幾萬條數據在內存,容易OOMif (cachedDataList.size() >= BATCH_COUNT) {saveData();// 存儲完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}/*** 所有數據解析完成了 都會來調用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 這里也要保存數據,確保最后遺留的數據也存儲到數據庫saveData();log.info("所有數據解析完成!");}/*** 加上存儲數據庫*/private void saveData() {log.info("{}條數據,開始存儲數據庫!", cachedDataList.size());demoDAO.save(cachedDataList);log.info("存儲數據庫成功!");}
}

分批插入的實現是在invoke方法中,當讀取緩存數達到我們預期的插入數量時就進行插入,然后重新更新list,原本的list就會被回收,達到方式內存溢出的效果,可以在這個方法中進行行參數校驗,有異常拋出即可

3.編寫讀入方法
 // 寫法1:fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";// 這里 需要指定讀用哪個class去讀,然后讀取第一個sheet 文件流會自動關閉EasyExcel.read(fileName, IndexOrNameData.class, new DemoDataListener()).sheet().doRead();// 寫法2fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";// 一個文件一個readertry (ExcelReader excelReader = EasyExcel.read(fileName, IndexOrNameData.class, new DemoDataListener()).build()) {// 構建一個sheet 這里可以指定名字或者noReadSheet readSheet = EasyExcel.readSheet(0).build();// 讀取一個sheetexcelReader.read(readSheet);}

二,動態表頭分批導出

1.構建表頭和數據
//獲取表頭    
private static List<String> makeHeads() {List<String> heads = new ArrayList<>(); //表頭信息heads.add("唯一標識");heads.add("名稱");heads.add("類型");return heads;}//獲取數據private static List<Map<String, Object>> makeData() {List<Map<String, Object>> list = new ArrayList<>();//Map<String,Object> test1 = new LinkedHashMap<>(); //手動添加測試數據(可根據需要從數據庫查詢)test1.put("id", 1);test1.put("name", 2);test1.put("str", 3);list.add(test1);//Map<String,Object> test2 = new LinkedHashMap<>();test2.put("id", 11);test2.put("name", 22);test2.put("str", 33);list.add(test2);return list;}
2.寫出代碼
    public void exportExcel(HttpServletResponse httpServletResponse,@RequestParam(required = false) String fileName,@RequestParam(required = false) List<String> heads, @RequestParam(required = false) List<Map<String, Object>> list) throws IOException {if (StringUtils.isEmpty(fileName)){ //文件名稱也可以動態獲取fileName = System.currentTimeMillis() + ".xlsx";} else {fileName = fileName + ".xlsx";}if(heads == null || heads.size() == 0){heads = makeHeads();}if(list == null || list.size() == 0){list = makeData();}OutputStream os= responseInfo(httpServletResponse, fileName); // 調用responseInfo方法List<List<String>> hs = new ArrayList<>();for (String s : heads) {hs.add(Arrays.asList(s));}List<List<Object>> list2 = new ArrayList<>();for (int i = 0; i < list.size(); i++) {List<Object> objects = new ArrayList<>();Collection<Object> values = list.get(i).values();for (Object value : values) {objects.add(value.toString());}list2.add(objects);}// 頭的策略WriteCellStyle headWriteCellStyle = new WriteCellStyle();// 背景設置為紅色headWriteCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());WriteFont headWriteFont = new WriteFont();headWriteFont.setFontHeightInPoints((short)20);headWriteCellStyle.setWriteFont(headWriteFont);// 內容的策略WriteCellStyle contentWriteCellStyle = new WriteCellStyle();// 這里需要指定 FillPatternType 為FillPatternType.SOLID_FOREGROUND 不然無法顯示背景顏色.頭默認了 FillPatternType所以可以不指定contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);// 背景綠色contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());WriteFont contentWriteFont = new WriteFont();// 字體大小contentWriteFont.setFontHeightInPoints((short)20);contentWriteCellStyle.setWriteFont(contentWriteFont);// 這個策略是 頭是頭的樣式 內容是內容的樣式 其他的策略可以自己實現HorizontalCellStyleStrategy horizontalCellStyleStrategy =new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);//創建一個行高設置處理器,我這里直接用匿名內部類類了AbstractRowHeightStyleStrategy abstractRowHeightStyleStrategy = new AbstractRowHeightStyleStrategy() {@Overrideprotected void setHeadColumnHeight(Row row, int relativeRowIndex) {if (relativeRowIndex==0){row.setHeightInPoints(50);}else {row.setHeightInPoints(10);}}@Overrideprotected void setContentColumnHeight(Row row, int relativeRowIndex) {//默認主體的高度row.setHeightInPoints(10);}};//創建列寬設置處理器AbstractHeadColumnWidthStyleStrategy abstractHeadColumnWidthStyleStrategy = new AbstractHeadColumnWidthStyleStrategy() {@Overrideprotected Integer columnWidth(Head head, Integer columnIndex) {switch (columnIndex) {case 0:return 6;case 1:return 20;case 2:return 20;default:return 13;}}};WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();//開始寫出ExcelWriter build = EasyExcel.write(os).head(hs)//注冊內容以及表頭處理器.registerWriteHandler(new HorizontalCellStyleStrategy(headWriteCellStyle ,contentWriteCellStyle))//注冊行高處理器.registerWriteHandler(abstractRowHeightStyleStrategy)//注冊列寬處理器.registerWriteHandler(abstractHeadColumnWidthStyleStrategy).build();//然后就可以用上邊的buid對象往指定的sheet中寫入數據了,當數據量大的時候,我們就可以分批寫入,偽代碼如下for(a a:list){build.write(list2,writeSheet);}}/*** 功能:公用方法,寫回瀏覽器* [response, fileName]* @return {@link OutputStream}* @throws*/public static OutputStream responseInfo(HttpServletResponse response, String fileName) throws IOException {// 這里注意有同學反應使用swagger 會導致各種問題,請直接用瀏覽器或者用postmanresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment; filename*=utf-8''" + fileName);OutputStream os=response.getOutputStream();return os;}/*** 如果要兼容swagger用這個,上面的注釋掉* 功能:公用方法* 參數:fileName 文件名稱, 如:123.xlsxpublic static OutputStream responseInfo(HttpServletResponse response, String fileName) throws IOException {response.setCharacterEncoding("utf-8");response.setContentType("APPLICATION/OCTET-STREAM");response.addHeader("Content-Disposition", "attachment;filename=" + fileName);OutputStream os=response.getOutputStream();return os;}*/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162261.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162261.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLOV5標注訓練自己的數據全流程教程

概述 yolo在目標檢測領域是非常有代表性的模型&#xff0c;它速度快識別效果也很精準&#xff0c;是實時檢測模型中應用最廣泛的。yolo的原理和代碼是很容易獲得的&#xff0c;且有各式各樣的教程&#xff0c;但是模型怎么使用的教程相對比較少。本文講解如何使用yolov5模型訓…

Linux運行jmeter報錯java.sql.SQLException:Cannot create PoolableConnectionFactory

在性能測試過程中遇見1個問題&#xff0c;終于解決了&#xff0c;具體問題如下。 問題 在windows電腦寫jmeter腳本連接數據庫連接成功 然后把該腳本放到Linux服務器上面&#xff0c;并把jmeter mysql驅動放到服務器上面&#xff0c;修改jmeter的mysql驅動路徑信息 注意&…

第十三章 : Spring Boot 日志記錄脫敏

第十三章 : Spring Boot 日志記錄脫敏 前言 本章重點:介紹secure-ext-spring-boot-starter 如何引入以及敏感數據脫敏,打印日志過程中自動脫敏,且支持手機號、郵箱、身份證號、住址、中文名、座機號、銀行卡、自定義等多種類型的脫敏。 基于Spring boot 2.3.2.RELEASE 背景…

【快速解決】實驗一:模擬實現進程的創建《操作系統上機》實驗報告

目錄 實驗要求 正文開始 ?編輯 難點講解 結語 實驗要求 實驗一&#xff1a;進程的創建 一、實驗項目類型&#xff1a;設計型 二、實驗目的和要求 加深對進程概念的理解&#xff0c;熟悉PCB的組織&#xff0c;深入了解創建進程的一般過程&#xff0c;掌握用隊列組織進程的…

數據庫系統之常用數據庫你用過幾個?

MySQL 開發廠商&#xff1a;AB公司——>Sun公司——>甲骨文公司 最新版本&#xff1a;5.7.43、8.0.34 發行方式: 社區版&#xff08;MySQL Community Server&#xff09; 免費&#xff0c;MySQL不提供任何技術支持 商業版&#xff08;MySQL Enterprise Edition&#xff0…

LLVM學習筆記(62)

4.4.3.3.2. 指令處理的設置 4.4.3.3.2.1. 目標機器相關設置 除了基類以外&#xff0c;X86TargetLowering構造函數本身也是一個龐然大物&#xff0c;我們必須要分段來看。V7.0做了不小的改動&#xff0c;改進了代碼的結構&#xff0c;修改了一些指令的設置。 100 X86Targ…

加班做報表被嘲低效!快用大數據分析工具

做數據分析報表很耗時間&#xff0c;因為不僅要解決多業務系統數據質量標準不一問題&#xff0c;還需要進行大量的公式計算、報表設計與制作。但那是以前&#xff0c;在大數據分析工具強勢崛起的當下&#xff0c;這些工作都能交給大數據分析工具來做了。以前是花90%的時間做報表…

9.Docker的虛懸鏡像-Dangling Image

1.虛懸鏡像的概念 虛懸鏡像 (Dangling Image) 指的是倉庫名 (鏡像名) 和標簽 TAG 都是 的鏡像。 2.構建本地虛懸鏡像 這里我以unbuntu為例來說明。 2.1 編寫Dockerfile文件 FROM ubuntu:22.042.2 根據Dockerfile文件構建虛懸鏡像 docker build .上面這段命令&#xff0c…

選擇ERP系統的關鍵指標

在制造業工廠中&#xff0c;選擇一個合適的ERP系統能夠顯著提升生產效率、優化資源管理、增強決策支持。然而&#xff0c;如何從眾多ERP系統中選擇一個適合自己企業的系統&#xff0c;是許多負責人在面臨的問題。本文將詳細介紹選擇ERP系統的關鍵指標&#xff0c;幫助制造業工廠…

python查看目錄屬性

os.chown(path, uid, gid)

[MySQL-基礎]SQL語句

目錄 hello! 這里是歐_aita的頻道。 今日語錄: 只有放棄才是真正的失敗。 祝福語&#xff1a;愿你的代碼生活充滿注釋&#xff0c;邏輯清晰&#xff0c;debug之路暢通無阻。 大家可以在評論區暢所欲言&#xff0c;可以指出我的錯誤&#xff0c;在交流中共同進步。 歡迎關注我的…

基于51單片機的病床呼叫系統設計

**單片機設計介紹&#xff0c; 基于51單片機的病床呼叫系統設計 文章目錄 一 概要二、功能設計設計思路 三、 軟件設計原理圖 五、 程序六、 文章目錄 一 概要 基于51單片機的病床呼叫系統是一種用于醫療機構的設備&#xff0c;旨在提供快速、可靠的病人呼叫和監控功能。以下是…

HDFS元數據管理/磁盤清理維護

元數據管理 1.元數據管理概述 > HDFS分類-類型分包括以下幾部分 文件、目錄自身的屬性信息&#xff0c;例如文件名&#xff0c;目錄名&#xff0c;修改信息等 文件記錄的信息的存儲相關的信息&#xff0c;例如存儲塊信息&#xff0c;分塊情況&#xff0c;副本個數等 記錄…

03_使用API_系統與數學工具

數學工具 Math 代表數學&#xff0c;是一個工具類&#xff0c;里面提供的都是對數據進行操作的一些靜態方法 public class Test {public static void main(String[] args) {// 1. Math.abs() : 取絕對值System.out.println(Math.abs(-3.14)); // >>> 3.14// 2. Ma…

Centos7使用rpm安裝mysql 5.7.43

Centos7使用rpm安裝mysql 5.7.43 1、下載rpm包 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar2、解壓并安裝 tar xf mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar yum -y install mysql-*3、按需修改mysql配置 #注意&a…

Django框架環境的搭建(圖文詳解)

目錄 day01 Web框架和Django基礎 1.web框架底層 1.1 網絡通信?編輯 1.2 常見軟件架構 1.3 手擼web框架 2.web框架 2.1 wsgiref 2.2 werkzeug 2.3 各框架的區別 3.快速上手django框架 3.1 安裝 3.2 命令行 3.3 Pycharm 4.虛擬環境 4.1 創建虛擬環境 - 命令行 4…

7.華為OD技術面手撕代碼實錄:判斷ip地址

判斷ip地址 編寫一個函數來驗證輸入的字符串是否是有效的 Pv4Q 或IPv6 地址。IPv4 地址由十進制數和點來表示,每個地址包含4個十進制數,其范圍為 0-255,用(“.”)分割。比如,172.16.254.1: 同時,IPv4 地址內的數不會以 0 開頭。比如,地址 172.16.254.01 是不合法的。IPv6…

頁面添加水印效果實現

頁面效果&#xff1a; 源代碼&#xff1a; <div id"water-wrapper"></div> <div><div>111111111111111111111111111111111111111111111111111111111111111111111111111111111111</div><div>1111111111111111111111111111111111…

電線電纜行業生產管理怎么數字化?

行業介紹 隨著市場環境的變化和現代生產管理理念的不斷更新&#xff0c;電纜的生產模式也在發生轉變&#xff0c;批量小&#xff0c;規格多&#xff0c;交期短的新型制造需求逐年上升&#xff0c;所以企業車間管理的重要性越發凸顯&#xff0c;作為企業良性運營的關鍵&#xf…

Python學習:常用數據結構

Python DataStructure 一、數組(array)二、雙向鏈表(linkedlist)三、棧(stack)四、隊列(queue)五、Python中的可變與不可變類型 一、數組(array) class array:def __init__(self, capacity: int):self._data []self._capacity capacitydef __getitem__(self, position: int)…