一文教你如何使用Java靈活讀取Excel內(nèi)容
前言
在日常工作和學(xué)習(xí)中,我們經(jīng)常需要從 Excel 文件中讀取數(shù)據(jù)。對于少量數(shù)據(jù),手動復(fù)制和粘貼可能是可行的,但是對于大量的數(shù)據(jù),這種方法會變得非常低效。在這種情況下,使用 Java 程序自動讀取 Excel 文件中的數(shù)據(jù)將是更好的選擇。
本教程將介紹如何使用 Java 程序讀取 Excel 文件中的數(shù)據(jù),包括以下幾個方面:
- 了解 Excel 文件格式
- 選擇 Java 的 Excel 文件讀取庫
- 讀取 Excel 文件中的數(shù)據(jù)
- 處理 Excel 文件中的不同數(shù)據(jù)類型
- 使用 Java 程序?qū)С?Excel 文件
讓我們開始吧!
1、了解 Excel 文件格式
在開始編寫 Java 程序讀取 Excel 文件之前,我們需要了解 Excel 文件格式。Excel 文件是基于 Microsoft 的 OLE2 格式的,這個格式將文件組織成一系列的 "容器" 和 "對象"。Excel 文件的主要容器是 Workbook,它包含一個或多個 Sheet。每個 Sheet 包含一組行和列,這些行和列組成了一個二維的單元格數(shù)組。每個單元格可以包含文本、數(shù)字、日期、布爾值等不同的數(shù)據(jù)類型。
2、選擇 Java 的 Excel 文件讀取庫
在 Java 中,有多個庫可以用于讀取 Excel 文件。這些庫包括 Apache POI、JExcelApi、EasyXLS、JXL 等。在本教程中,我們將使用 Apache POI 庫。
Apache POI 是一個 Java API,用于操作 Microsoft 文檔格式,包括 Word、Excel 和 PowerPoint。它提供了一組 Java 類,可以用于創(chuàng)建、讀取和修改 Microsoft 文檔。
3、讀取 Excel 文件中的數(shù)據(jù)
在本節(jié)中,我們將演示如何使用 Apache POI 庫讀取 Excel 文件中的數(shù)據(jù)。
在開始之前,我們需要將 Apache POI 庫添加到項(xiàng)目的依賴中。您可以通過 Maven 或 Gradle 等構(gòu)建工具將它們添加到項(xiàng)目中。
以下是 Maven 項(xiàng)目的 pom.xml 文件中添加 Apache POI 庫的示例代碼:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency>
以下是 Gradle 項(xiàng)目的 build.gradle 文件中添加 Apache POI 庫的示例代碼:
dependencies { implementation 'org.apache.poi:poi:4.1.2' }
接下來,我們將演示如何使用 Apache POI 庫讀取 Excel 文件中的數(shù)據(jù)。
首先,我們需要創(chuàng)建一個 Workbook 對象,該對象表示整個 Excel 文件。在 Apache POI 中,Workbook 對象有三種不同的類型:HSSFWorkbook 表示一個 .xls 文件,XSSFWorkbook 表示一個 .xlsx 文件,SXSSFWorkbook 表示一個大型 .xlsx 文件。我們可以使用 WorkbookFactory.create() 方法根據(jù)文件的類型創(chuàng)建一個 Workbook 對象。以下是創(chuàng)建一個 XSSFWorkbook 對象的示例代碼:
FileInputStream file = new FileInputStream(new File("path/to/excel/file.xlsx")); Workbook workbook = WorkbookFactory.create(file);
接下來,我們可以獲取一個 Sheet 對象,該對象表示 Excel 文件中的一個工作表。在 Apache POI 中,Sheet 對象由 Workbook 對象的 getSheet() 方法返回。以下是獲取名為 "Sheet1" 的 Sheet 對象的示例代碼:
Sheet sheet = workbook.getSheet("Sheet1");
一旦我們獲取了 Sheet 對象,我們就可以遍歷其中的每一行和每一列,以讀取其中的單元格數(shù)據(jù)。以下是遍歷 Sheet 對象中的所有單元格并輸出單元格值的示例代碼:
Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); switch (cell.getCellType()) { case STRING: System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; default: System.out.print("\t"); } } System.out.println(); }
上述代碼中,我們使用了一個嵌套的迭代器來遍歷每一行和每一列。在每個單元格中,我們使用 switch 語句根據(jù)不同的數(shù)據(jù)類型執(zhí)行不同的操作。
4、處理 Excel 文件中的不同數(shù)據(jù)類型
在 Excel 文件中,單元格可以包含不同的數(shù)據(jù)類型,包括字符串、數(shù)字、日期和布爾值等。當(dāng)我們讀取單元格中的數(shù)據(jù)時,我們需要知道單元格中的數(shù)據(jù)類型,以正確地處理它們。
在 Apache POI 中,我們可以使用 Cell.getCellType() 方法獲取單元格的數(shù)據(jù)類型。該方法返回 CellType 枚舉類型的值,可以使用 switch 語句根據(jù)不同的枚舉值執(zhí)行不同的操作。
以下是使用 switch 語句處理不同數(shù)據(jù)類型的示例代碼:
switch (cell.getCellType()) { case STRING: System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { System.out.print(cell.getDateCellValue() + "\t"); } else { System.out.print(cell.getNumericCellValue() + "\t"); } break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; default: System.out.print("\t"); }
在上述示例代碼中,我們首先檢查單元格的數(shù)據(jù)類型是否為字符串。如果是字符串,我們使用 getStringCellValue() 方法獲取字符串值。如果單元格的數(shù)據(jù)類型為數(shù)字,我們還需要檢查單元格是否包含日期。如果是日期,我們使用 getDateCellValue() 方法獲取日期值,否則我們使用 getNumericCellValue() 方法獲取數(shù)字值。
5、使用 Java 程序?qū)С?Excel 文件
除了讀取 Excel 文件中的數(shù)據(jù)外,我們還可以使用 Java 程序創(chuàng)建和導(dǎo)出 Excel 文件。Apache POI 提供了 HSSFWorkbook 和 XSSFWorkbook 兩個類,用于創(chuàng)建和操作 Excel 文件。
HSSFWorkbook 類用于操作舊版的 .xls 格式的 Excel 文件,而 XSSFWorkbook 類用于操作新版的 .xlsx 格式的 Excel 文件。我們可以根據(jù)需要選擇合適的類來創(chuàng)建和導(dǎo)出 Excel 文件。
以下是創(chuàng)建和導(dǎo)出 Excel 文件的一般步驟:
- 創(chuàng)建一個 Workbook 對象,表示整個 Excel 文件。
- 創(chuàng)建一個 Sheet 對象,表示 Excel 文件中的一個工作表。
- 創(chuàng)建 Row 和 Cell 對象,表示 Excel 文件中的行和列。
- 為每個單元格設(shè)置數(shù)據(jù)和樣式。
- 將 Workbook 對象寫入文件或輸出流中。
下面,讓我們來看一些示例代碼,演示如何使用 Java 程序創(chuàng)建和導(dǎo)出 Excel 文件。
- 創(chuàng)建一個 XSSFWorkbook 對象
以下是創(chuàng)建一個 XSSFWorkbook 對象的示例代碼:
Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1");
- 創(chuàng)建行和單元格
以下是創(chuàng)建行和單元格的示例代碼:
Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("Hello, World!");
- 設(shè)置單元格樣式
在 Excel 文件中,我們可以為單元格設(shè)置不同的樣式,包括字體、顏色、對齊方式等。以下是設(shè)置單元格樣式的示例代碼:
CellStyle style = workbook.createCellStyle(); Font font = workbook.createFont(); font.setBold(true); style.setFont(font); cell.setCellStyle(style);
在上述示例代碼中,我們首先使用 createCellStyle() 方法創(chuàng)建一個單元格樣式對象。然后,我們使用 createFont() 方法創(chuàng)建一個字體對象,并設(shè)置其屬性。最后,我們將樣式應(yīng)用于單元格。
- 導(dǎo)出 Excel 文件
導(dǎo)出 Excel 文件時,我們可以將 Workbook 對象寫入文件或輸出流中。以下是將 Workbook 對象寫入文件的示例代碼:
FileOutputStream fileOut = new FileOutputStream("path/to/excel/file.xlsx"); workbook.write(fileOut); fileOut.close();
在上述示例代碼中,我們首先使用 FileOutputStream 類創(chuàng)建一個文件輸出流對象。然后,我們使用 write() 方法將 Workbook 對象寫入文件中。最后,我們關(guān)閉文件輸出流。
除了寫入文件,我們還可以將 Workbook 對象輸出到網(wǎng)絡(luò)流中,以便在瀏覽器中下載 Excel 文件。以下是將 Workbook 對象輸出到網(wǎng)絡(luò)流中的示例代碼:
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-Disposition", "attachment; filename=\"excel_file.xlsx\""); OutputStream outputStream = response.getOutputStream(); workbook.write(outputStream); outputStream.close();
在上述示例代碼中,我們首先設(shè)置 HTTP 響應(yīng)的內(nèi)容類型和文件名。然后,我們使用 getOutputStream() 方法獲取網(wǎng)絡(luò)輸出流對象。最后,我們使用 write() 方法將 Workbook 對象寫入網(wǎng)絡(luò)流中,并關(guān)閉輸出流。
完整示例代碼
下面是一個完整的示例代碼,演示如何使用 Java 程序讀取和導(dǎo)出 Excel 文件:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelUtils { public static void readExcel(String fileName) throws IOException { // 創(chuàng)建文件輸入流 FileInputStream fileInputStream = new FileInputStream(new File(fileName)); // 創(chuàng)建工作簿對象 Workbook workbook = WorkbookFactory.create(fileInputStream); // 獲取第一個工作表 Sheet sheet = workbook.getSheetAt(0); // 遍歷工作表中的所有行和單元格 for (Row row : sheet) { for (Cell cell : row) { // 根據(jù)單元格的類型讀取數(shù)據(jù) switch (cell.getCellType()) { case STRING: System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; case FORMULA: System.out.print(cell.getCellFormula() + "\t"); break; case BLANK: System.out.print("\t"); break; default: System.out.print("\t"); } } System.out.println(); } // 關(guān)閉文件輸入流 fileInputStream.close(); } public static void writeExcel(String fileName) throws IOException { // 創(chuàng)建工作簿對象 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 創(chuàng)建行和單元格 Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("Hello, World!"); // 設(shè)置單元格樣式 CellStyle style = workbook.createCellStyle(); Font font = workbook.createFont(); font.setBold(true); style.setFont(font); cell.setCellStyle(style); // 導(dǎo)出 Excel 文件 FileOutputStream fileOut = new FileOutputStream(fileName); workbook.write(fileOut); fileOut.close(); } }
使用該類,我們可以方便地讀取和導(dǎo)出 Excel 文件,如下所示:
public static void main(String[] args) throws IOException { String fileName = "path/to/excel/file.xlsx"; // 讀取 Excel 文件 ExcelUtils.readExcel(fileName); // 導(dǎo)出 Excel 文件 ExcelUtils.writeExcel(fileName); }
6、結(jié)論
本文介紹了如何使用 Java 程序靈活讀取和導(dǎo)出 Excel 文件。我們首先介紹了 Apache POI 庫,它是 Java 操作 Office 文檔的一個強(qiáng)大的工具。然后,我們演示了如何使用 POI 庫讀取 Excel 文件,并解釋了如何根據(jù)單元如何設(shè)置單元格樣式。最后,我們提供了一個完整的示例代碼,演示了如何使用 ExcelUtils 類來讀取和導(dǎo)出 Excel 文件。
Java 程序讀取和導(dǎo)出 Excel 文件是一項(xiàng)非常實(shí)用的技能,尤其是在需要處理大量數(shù)據(jù)的項(xiàng)目中。使用 Apache POI 庫,我們可以方便地讀取和寫入 Excel 文件,這可以大大提高我們的工作效率。
在實(shí)際應(yīng)用中,我們需要根據(jù)具體的需求來選擇讀取和寫入 Excel 文件的方法,以達(dá)到最好的效果。
參考文獻(xiàn)
- Apache POI 官方文檔. (??https://poi.apache.org/??)
總結(jié)
到此這篇關(guān)于使用Java靈活讀取Excel內(nèi)容的文章就介紹到這了,更多相關(guān)Java讀取Excel內(nèi)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring的UnexpectedRollbackException事務(wù)嵌套示例解析
這篇文章主要為大家介紹了spring的UnexpectedRollbackException事務(wù)嵌套示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Java實(shí)現(xiàn)AES/CBC/PKCS7Padding加解密的方法
這篇文章主要介紹了Java實(shí)現(xiàn)AES/CBC/PKCS7Padding加解密的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08MyBatis解決Update動態(tài)SQL逗號的問題
這篇文章主要介紹了MyBatis解決Update動態(tài)SQL逗號的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(8)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07java普通項(xiàng)目讀取不到resources目錄下資源文件的解決辦法
這篇文章主要給大家介紹了關(guān)于java普通項(xiàng)目讀取不到resources目錄下資源文件的解決辦法,Web項(xiàng)目中應(yīng)該經(jīng)常有這樣的需求,在maven項(xiàng)目的resources目錄下放一些文件,比如一些配置文件,資源文件等,需要的朋友可以參考下2023-09-09Quarkus集成Dubbo服務(wù)Rpc遠(yuǎn)程通訊框架整合
這篇文章主要為大家介紹了Quarkus集成Dubbo服務(wù)Rpc遠(yuǎn)程通訊框架的整合,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-02-02MyBatis-Plus與PageHelper依賴的jsqlparser庫沖突
在升級SpringBoot到3.x版本的同時,升級MyBatis-Plus后發(fā)現(xiàn)PageHelper無法使用,原因是MyBatis-Plus和PageHelper都依賴jsqlparser庫,且PageHelper要求特定版本的jsqlparser,解決方法是在項(xiàng)目中排除這兩個庫的jsqlparser依賴,直接引用jsqlparser4.7版本2024-10-10