day21-Excel文件解析

目錄

1. 概述

2. Apache POI

3. XSSF解析Excel文件

3.1. 添加Jar包依賴

3.2. Workbook(Excel文件)?

?3.2.2. 加載(解析)Excel文件

?3.3. Sheet (工作簿)

3.3.1. 創建工作簿

3.3.2. 獲取工作簿

3.3.3. 獲取工作簿的數量

?3.4. Row(數據行)

3.4.1. 創建數據行

?3.4.2. 獲取首行下標

?3.4.3. 獲取尾行下標

?3.4.4. 根據下標獲取指定行

?3.4.5. 遍歷所有行

3.4.6. 遍歷指定區域行

?3.5. Cell(單元格)

3.5.1. 創建單元格

3.5.2. 設置單元格值

3.5.3. 根據下標獲取單元格

?3.5.4. 遍歷所有單元格

?3.5.5. 獲取單元格的類型

3.5.6. 設置單元格樣式

3.5.7設置單元格數據格式

3.5.8. 設置單元格對齊

?4. 超大Excel文件讀寫

4.1. 使用POI寫出

?4.2. 使用EasyExcel

4.2.1. 準備工作

?4.3. 寫入100w條數據

4.4. 讀取100w條數據


1. 概述

????????在應用程序的開發過程中,經常需要使用Excel文件來進行數據的導入或導出。所以,在通過Java語言實現此類需求的時候,往往會面臨著Excel文件的解析(導入)或生成(導出)。

????????在Java技術生態圈中,可以進行Excel文件處理的主流技術包括:Apache POIJXLAlibaba EasyExcel等。

??Apache POI基于DOM方式進行解析,將文件直接加載內存,所以速度較快,適合Excel文件數據量不大的應用場景。JXL只支持Excel 2003以下版本,所以不太常見。

??Alibaba EasyExcel采用逐行讀取的解析模式,將每一行的解析結果以觀察者的模式通知處理(AnalysisEventListener),所以比較適合數據體量較大的Excel文件解析。

2. Apache POI

????Apache POI是用Java編寫的免費開源的跨平臺的Java APIApache POI提供給Java程序對Microsoft Office格式檔案進行讀寫功能的API開源類庫。

它分別提供對不同格式文件的解析:

  • HSSF - 提供讀寫Microsoft Excel格式檔案的功能。
  • XSSF - 提供讀寫Microsoft Excel OOXML格式檔案的功能。
  • HWPF - 提供讀寫Microsoft Word格式檔案的功能。
  • HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能。
  • HDGF - 提供讀寫Microsoft Visio格式檔案的功能。

3. XSSF解析Excel文件

HSSF用于解析舊版本(*.xls)Excel文件,由于舊版本的Excel文件只能存在65535行數據,所以目前已經不常用。所以目前主要采用XSSF進行新版本(*.xlsx)Exce文件的解析。

3.1. 添加Jar包依賴

3.2. Workbook(Excel文件)?

????????Workbook接口代表一個Excel文件,用于創建或加載(解析)Excel文件。常見實現類是XSSFWorkbook

// 輸出流
FileOutputStream fos = new FileOutputStream("c:\\test\\temp.xlsx");// Excel文件對象
Workbook workbook = new XSSFWorkbook();// 通過輸出流進行寫入
workbook.write(fos);// 關閉資源
fos.close();
workbook.close();
?3.2.2. 加載(解析)Excel文件
// 輸入流
FileInputStream fis = new FileInputStream("c:\\test\\1627356554991.xlsx");// Excel文件對象
Workbook workbook = new XSSFWorkbook(fis);
?3.3. Sheet (工作簿)

通過Workbook來進行工作簿Sheet對象的獲取或創建

3.3.1. 創建工作簿
// 按照默認名稱創建工作簿
Sheet sheet1 = workbook.createSheet();// 按照自定義名稱創建工作簿
Sheet sheet2 = workbook.createSheet("自定義工作簿2");
3.3.2. 獲取工作簿

// 按照工作簿下標獲取Sheet
Sheet sheet01 = workbook.getSheetAt(0);// 按照工作簿名稱獲取Sheet
Sheet sheet02 = workbook.getSheet("Sheet0");
3.3.3. 獲取工作簿的數量
int n = workbook.getNumberOfSheets();
?3.4. Row(數據行)

通過Sheet來進行數據行Row對象的獲取或創建

3.4.1. 創建數據行
Row row = sheet.createRow(0);
?3.4.2. 獲取首行下標
int first = sheet.getFirstRowNum();
?3.4.3. 獲取尾行下標
int last = sheet.getLastRowNum();
?3.4.4. 根據下標獲取指定行
Row row = sheet.getRow(0);
?3.4.5. 遍歷所有行
for(Row row : sheet) {System.out.println(row);
}
3.4.6. 遍歷指定區域行
for (int i = 1; i <= sheet.getLastRowNum(); i++) {Row row = sheet.getRow(i);System.out.println(row);
}
?3.5. Cell(單元格)

通過Row來進行單元格Cell對象的獲取或創建

3.5.1. 創建單元格
Cell cell0 = row.createCell(0);
3.5.2. 設置單元格值
cell0.setCellValue(UUID.randomUUID().toString());
3.5.3. 根據下標獲取單元格
Cell cell = row.getCell(1);
?3.5.4. 遍歷所有單元格
for(Cell cell : row) {}
?3.5.5. 獲取單元格的類型
CellType type = cell.getCellType();
3.5.6. 設置單元格樣式
// 創建單元格樣式
CellStyle headerCellStyle = workbook.createCellStyle();//設置單元格的水平對齊類型, 此時水平居中
headerCellStyle.setAlignment(HorizontalAlignment.CENTER);// 設置單元格的垂直對齊類型,此時垂直靠底邊
headerCellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM);// 創建并設置字體
Font font = workbook.createFont();
font.setBold(true);
font.setColor(Font.COLOR_RED);
headerCellStyle.setFont(font);

3.5.7設置單元格數據格式
// 創建單元格樣式
DataFormat dataFormat = workbook.createDataFormat();
Short formatCode = dataFormat.getFormat("yyyy-MM-dd HH:mm:ss");
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(formatCode);// ...// 為當前行創建單元格
Cell cell1 = row.createCell(1);
cell1.setCellStyle(cellStyle); // 設置單元格樣式
cell1.setCellValue(new Date()); // 保存當前日期時間至本單元格
3.5.8. 設置單元格對齊
// 創建單元格樣式
CellStyle cellStyle = workbook.createCellStyle();//設置單元格的水平對齊類型。 此時水平居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);// 設置單元格的垂直對齊類型。 此時垂直靠底邊
cellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM);

?4. 超大Excel文件讀寫

4.1. 使用POI寫出

使用SXSSFWorkbook進行寫入,通過設置SXXFWorkbook的構造參數,可以設置每次在內存中保持的行數,當達到這個值的時候,那么會把這些數據flush到磁盤上,這樣就不會出現內存不夠的情況。

try (Workbook workbook = new SXSSFWorkbook(100);FileOutputStream fos = new FileOutputStream("c:\\test\\temp.xlsx")) {Sheet sheet1 = workbook.createSheet();for (int i = 0; i <= 1000000; i++) {Row row = sheet1.createRow(i);Cell cell0 = row.createCell(0);cell0.setCellValue(UUID.randomUUID().toString());Cell cell1 = row.createCell(1);cell1.setCellValue(new Date());}workbook.write(fos);
} catch (IOException e) {e.printStackTrace();
}
?4.2. 使用EasyExcel
4.2.1. 準備工作
  1. 下載相關alibabaeasyexcel相關jar
  2. 準備實體類
  3. public class Order {@ExcelProperty("訂單編號")private String orderId; // 訂單編號@ExcelProperty("支付金額")@NumberFormat("¥#,###")private Double payment; // 支付金額@ExcelProperty(value = "創建日期",converter = LocalDateTimeConverter.class)private LocalDateTime creationTime; // 創建時間public Order() {this.orderId = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddhhmmss"))+ UUID.randomUUID().toString().substring(0, 5);this.payment = Math.random() * 10000;this.creationTime = LocalDateTime.now();}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}public Double getPayment() {return payment;}public void setPayment(Double payment) {this.payment = payment;}public LocalDateTime getCreationTime() {return creationTime;}public void setCreationTime(LocalDateTime creationTime) {this.creationTime = creationTime;}@Overridepublic String toString() {return "Order [orderId=" + orderId + ", payment=" + payment + ", creationTime=" + creationTime + "]";}
    }
  4. 準備Converter轉換類(兼容LocalDateTime日期時間類)
public class LocalDateTimeConverter implements Converter<LocalDateTime> {@Overridepublic Class<LocalDateTime> supportJavaTypeKey() {return LocalDateTime.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}@Overridepublic CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));}}
?4.3. 寫入100w條數據
public class Demo {public static void main(String[] args) {// 寫入100w條數據EasyExcel.write("c:\\test\\run\\easy.xlsx", Order.class).sheet("訂單列表").doWrite(data());}// 創建100w條訂單數據private static List<Order> data() {List<Order> list = new ArrayList<Order>();for (int i = 0; i < 1000000; i++) {list.add(new Order());}return list;}
}
4.4. 讀取100w條數據
// 讀取100w條數據
EasyExcel.read("c:\\test\\run\\easy.xlsx", Order.class,new AnalysisEventListener<Order>() {@Overridepublic void invoke(Order order, AnalysisContext arg1) {// 讀取每條數據orderList.add(order);}@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {// 讀取到列頭System.out.println(headMap);}@Overridepublic void doAfterAllAnalysed(AnalysisContext arg0) {// 讀取完畢System.out.println("END");}
}).sheet().doRead();

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

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

相關文章

與 TRON (波場) 區塊鏈進行交互的命令行工具 (CLI): tstroncli

源碼倉庫 一個基于 Node.js 和 TypeScript 構建的&#xff0c;用于與 TRON (波場) 區塊鏈進行交互的命令行工具 (CLI)。 本項目旨在提供一個簡單、可擴展的框架&#xff0c;讓開發者可以輕松地通過命令行調用 TRON 的 HTTP API&#xff0c;實現查詢鏈上信息、發送交易等操作。…

rabbitmq--默認模式(點對點)

導入包&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>application.yml springrabbitmq:host: localhostport: 5672username: guestpassword: gue…

外網訪問文檔編輯器Docsify(Windows版本),內網穿透技術應用簡便方法

如果你正在為項目寫文檔&#xff0c;但又不想折騰復雜的構建流程&#xff0c;也不想維護一堆靜態 HTML 文件&#xff0c;那你一定要試試 docsify。docsify 是一個基于 JavaScript 的開源文檔生成工具&#xff0c;它最大的特點就是“無構建”&#xff1a;你只需要寫 Markdown 文…

第4章唯一ID生成器——4.5 美團點評開源方案Leaf

Leaf是美團點評公司基礎研發平臺推出的一個唯一ID生成器服務&#xff0c;其具備高可靠性、低延遲、全局唯一等特點&#xff0c;目前已經被廣泛應用于美團金融、美團外賣、美團酒旅等多個部門。Leaf根據不同業務的需求分別實現了Leaf-segment和Leaf-snowflake兩種方案&#xff0…

分布式搜索和分析引擎Elasticsearch實戰指南

ES 介紹與安裝 Elasticsearch&#xff0c; 簡稱 ES&#xff0c;它是個開源分布式搜索引擎&#xff0c;它的特點有&#xff1a;分布式&#xff0c;零配置&#xff0c;自動發現&#xff0c;索引自動分片&#xff0c;索引副本機制&#xff0c;restful 風格接口&#xff0c;多數據源…

【13】C# 窗體應用WinForm——.NET Framework、WinForm、工程創建、工具箱簡介、窗體屬性及創建

文章目錄1. WinForm工程創建 及 界面介紹1.1 WinForm工程創建1.2 窗體 Form1.cs “查看代碼”1.3 打開窗體設計器2. 工具箱3. 窗體屬性及創建3.1 窗體屬性3.2 實例&#xff1a;創建一個新窗體3.2.1 添加新Windows窗體3.2.2 窗體屬性配置3.2.3 設置該窗體為啟動窗體WinForm 是 W…

論文閱讀-IGEV

文章目錄1 概述2 模塊2.1 總體說明2.2 特征抽取器2.3 CGEV2.4 基于Conv-GRU的更新算子2.5 空間上采樣2.6 損失函數3 效果參考文獻1 概述 在雙目深度估計中&#xff0c;有一類是基于3D卷積的方法&#xff0c;代表就是PSMNet&#xff0c;它應用 3D 卷積編碼器-解碼器來聚合和正則…

[2025CVPR-圖象分類方向]SPARC:用于視覺語言模型中零樣本多標簽識別的分數提示和自適應融合

1. ?背景與問題定義? 視覺語言模型&#xff08;如CLIP&#xff09;在單標簽識別中表現出色&#xff0c;但在零樣本多標簽識別&#xff08;MLR&#xff09;任務中表現不佳。MLR要求模型識別圖像中多個對象&#xff08;例如&#xff0c;圖像包含“貓”和“沙發”&#xff09;&…

2025創始人IP如何破局?

內容持續更新卻無人點贊&#xff0c;課程精心打磨卻無人報名&#xff0c;直播賣力講解卻無人停留 —— 明明有內容、有經驗、有成果&#xff0c;卻始終難以打動用戶。問題的核心&#xff0c;或許在于你尚未打造出真正的 “創始人IP”。?一、創始人IP&#xff1a;不止標簽&…

告別配置混亂!Spring Boot 中 Properties 與 YAML 的深度解析與最佳實踐

一、Spring配置文件 1.1、什么是Spring配置 Spring配置指的是在Spring框架中定義和管理應用程序組件&#xff08;如Bean&#xff09;及其依賴關系的過程 作用&#xff1a; 配置文件主要用于解決硬編碼問題&#xff0c;它將可能變更的信息集中存放。程序啟動時&#xff0c;會從…

無人機噴灑系統技術要點與難點解析

一、 模塊運行方式1. 任務規劃與加載模塊&#xff1a;輸入&#xff1a;農田邊界、障礙物信息、作物類型、病蟲害信息、所需噴灑量、天氣條件。運行&#xff1a;利用地面站軟件或移動APP&#xff0c;規劃最優飛行路徑&#xff0c;設定飛行高度、速度、噴灑參數、作業區域。將規…

mongodb源代碼分析createCollection命令創建Collection流程分析

MongoDB 提供兩種方式創建集合&#xff1a;隱式創建 和 顯式創建。方式 1&#xff1a;隱式創建&#xff08;推薦&#xff09;當你向不存在的集合中插入文檔時&#xff0c;MongoDB 會自動創建該集合。示例在 db中隱式創建 users 集合&#xff1a;javascriptdb.users.insertOne({…

c++注意點(13)----設計模式(抽象工廠)

創建型模式抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09;是一種創建型設計模式&#xff0c;它提供一個接口&#xff0c;用于創建一系列相關或相互依賴的對象&#xff0c;而無需指定它們具體的類。簡單說&#xff0c;它就像一個 "超級工廠"&#xff…

【大語言模型入門】—— Transformer 如何工作:Transformer 架構的詳細探索

Transformer 如何工作&#xff1a;Transformer 架構的詳細探索Transformer 如何工作&#xff1a;Transformer 架構的詳細探索什么是 Transformer&#xff1f;什么是 Transformer 模型&#xff1f;歷史背景從 RNN 模型&#xff08;如 LSTM&#xff09;到 Transformer 模型在 NLP…

iOS安全和逆向系列教程 第20篇:Objective-C運行時機制深度解析與Hook技術

iOS安全和逆向系列教程 第20篇:Objective-C運行時機制深度解析與Hook技術 引言 在上一篇文章中,我們深入學習了ARM64匯編語言的基礎知識,掌握了從寄存器操作到指令分析的完整技能體系。現在,我們將把這些底層知識與iOS應用的高層邏輯聯系起來,深入探討Objective-C運行時…

IDEA中全局搜索快捷鍵Ctrl+Shift+F為何失靈?探尋原因與修復指南

在軟件開發中&#xff0c;高效地查找和管理代碼是提升生產力的關鍵。IntelliJ IDEA&#xff0c;作為一款功能強大的集成開發環境&#xff08;IDE&#xff09;&#xff0c;提供了豐富的搜索功能&#xff0c;幫助開發者迅速定位代碼、資源、甚至是IDE功能本身。 在 IntelliJ IDE…

【學習筆記】Lean4 定理證明 ing

文章目錄概述Lean4 定理證明初探示例&#xff1a;證明 1 1 2示例&#xff1a;證明 2 * (x y) 2 * x 2 * yLean4 定理證明基礎命題與定理命題&#xff08;Proposition&#xff09;定理&#xff08;Theorem&#xff09;量詞策略概述 Lean證明是指在Lean環境中&#xff0c;通…

墨者:SQL注入漏洞測試(HTTP頭注入)

墨者學院&#xff1a;SQL注入漏洞測試(HTTP頭注入)&#x1f680; 1. 什么是HTTP頭注入&#xff1f;&#x1f50d; HTTP頭注入是指攻擊者通過篡改HTTP請求頭部的字段&#xff08;如User-Agent、Referer、Cookie、Host等&#xff09;&#xff0c;將惡意SQL代碼插入到后端數據庫查…

linux_前臺,后臺進程

*在用戶訪問端口時&#xff0c;操作系統會形成對應的session,在其的內部進一步形成bash等進程 *一個會話只有一個前臺進程&#xff0c;可以有多個后臺進程&#xff0c;前臺與后臺進程的區別在于誰擁有鍵盤的使用權*前臺與后臺進程都可以訪問顯示器但是后臺無法訪問標準輸入獲取…

spring data mongodb 入門使用手冊

<!--pom.xml引入依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>文檔映射類Student.java import lombok.Data; import lombok.NoArgsCons…