跳過到頁腳內容
EXCEL 工具

在 Java 中讀取 Excel 文件(教程)

什麼是 Excel?

微軟 Excel 工作簿是一款基於電子表格的軟體,允許使用者有效地組織和儲存數據。 它以表格形式存儲和組織數據,即使用行和列。 Excel 電子表格中的單元格是存放數據的方框,可以使用不同的樣式、格式和公式進行操作。

如何在 Java 中讀取 Excel 文件?

有時候讀取 Excel 文件可能會比較複雜。 在 Java 中讀取 Excel 文件與在 Java 中讀取 Word 文件略有不同,因為 Excel 的單元格特性。 JDK不提供直接的 API 來讀寫 Microsoft Excel 文件。 相反,我們必須依賴第三方庫 Apache POI

Apache POI 庫

POI 代表 "Poor Obfuscation Implementation"。 Apache POI 是一個開源 Java 庫,專為讀寫 Microsoft 文件而設計。 它提供了一種基於 Microsoft Office 的文件格式創建和操作的方法。使用 Apache POI,應能創建、修改以及顯示/讀取 Microsoft Office 文件格式的操作。

下載並安裝 Apache POI 庫

首先,我們會下載最新版本的 POI JAR 文件。 前往http://poi.apache.org/download.html,下載最新的 ZIP 文件,其中將包含 Java API 以在 Java 中讀取 Excel 文件。

class="content-img-align-center">
class="center-image-wrapper"> 如何在 Java 中讀取 Excel 文件,圖1: 下載二進制分佈文件

class="content__image-caption">下載 Apache POI JAR 文件

當你下載 ZIP 文件後,你需要解壓它,並將以下 JAR 文件添加到你的項目類路徑中。 這在下面的 從 Excel 文件讀取 中解釋。

class="content-img-align-center">
class="center-image-wrapper"> 如何在 Java 中讀取 Excel 文件,圖2: JAR 文件

class="content__image-caption">將 Apache POI Jar 文件添加到 Java 類路徑

注意:同時複製 libooxml-lib 中的檔案以及其他文件。

POI 中的類和接口

以下是支援的 XLS 和 XLSX 文件格式的類,這些類可以使用:

class="content-img-align-center">
class="center-image-wrapper"> 如何在 Java 中讀取 Excel 文件,圖3: Apache POI 類

class="content__image-caption">Apache POI 類

以下是在 POI 中用於在 Java 中讀取 XLSXLSX 文件的不同 Java 接口和類的清單:

Workbook 接口由 HSSFWorkbookXSSFWorkbook 類實現:

  • HSSFWorkbook:這是一個對 XLS 文件的類表示。
  • XSSFWorkbook:這是一個對 XLSX 文件的類表示。

Sheet 接口由 HSSFSheetXSSFSheet 類實現:

  • HSSFSheet:這是一個表示 XLS 文件中的工作表的類。
  • XSSFSheet:這是一個表示 XLSX 文件中的工作表的類。

Row 接口由 HSSFRowXSSFRow 類實現:

  • HSSFRow:這是一個表示 XLS 文件工作表中行的類。
  • XSSFRow:這是一個表示 XLSX 文件工作表中行的類。

Cell 接口由 HSSFCellXSSFCell 類實現:

  • HSSFCell:這是一個表示 XLS 文件行中的單元格的類。
  • XSSFCell:這是一個表示 XLSX 文件行中的單元格的類。

從 Excel 文件中讀取

在我們的示例中,我們將在 Java 中讀取以下 Excel 文件:

class="content-img-align-center">
class="center-image-wrapper"> 如何在 Java 中讀取 Excel 文件,圖4: 將要讀取的 Excel 文件

class="content__image-caption">將要讀取的 Excel 文件

在 Java 中讀取 Excel 文件的步驟

  1. 使用任何 Java IDE 創建一個 Java 項目。我們將使用 Netbeans 來完成此項目。
  2. 接下來,在項目中創建一個 lib 資料夾。
  3. 然後將下載的 JAR 文件添加到在上一步創建的 lib 資料夾中。
  4. 設置 Class-Path:右鍵點擊項目文件夾 > 構建路徑 > 添加外部 JAR 文件 > 選擇以上所有 JAR 文件 > 應用並關閉。
  5. 現在,我們來創建一個名為 ReadExcelFileDemo 的類文件。
  6. 創建一個名為 "studentdata.xls" 的 Excel 文件,並將上述數據或任何數據寫入其中。

以下是用 Java 讀取 Excel 文件的代碼範例:

import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import org.apache.poi.hssf.usermodel.HSSFSheet;  
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.ss.usermodel.Cell;  
import org.apache.poi.ss.usermodel.FormulaEvaluator;  
import org.apache.poi.ss.usermodel.Row;  

public class ReadExcelFileDemo  {  
    public static void main(String[] args) throws IOException {  
        // Obtain input bytes from a file  
        FileInputStream fis = new FileInputStream(new File("C:\\demo\\studentdata.xls"));  

        // Creating workbook instance that refers to .xls file  
        HSSFWorkbook wb = new HSSFWorkbook(fis);   

        // Creating a Sheet object to retrieve the object  
        HSSFSheet sheet = wb.getSheetAt(0);  

        // Evaluating cell type   
        FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();  
        for (Row row : sheet) {  
            for (Cell cell : row) {
                switch (formulaEvaluator.evaluateInCell(cell).getCellType()) {  
                    case NUMERIC: // Field that represents numeric cell type  
                        // Getting the value of the cell as a number  
                        System.out.print(cell.getNumericCellValue() + "\t\t");   
                        break;  
                    case STRING: // Field that represents string cell type  
                        // Getting the value of the cell as a string  
                        System.out.print(cell.getStringCellValue() + "\t\t");  
                        break;
                }
            }
            System.out.println();  
        }

        // Closing the workbook to free resources
        wb.close();
    }
}
import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import org.apache.poi.hssf.usermodel.HSSFSheet;  
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.ss.usermodel.Cell;  
import org.apache.poi.ss.usermodel.FormulaEvaluator;  
import org.apache.poi.ss.usermodel.Row;  

public class ReadExcelFileDemo  {  
    public static void main(String[] args) throws IOException {  
        // Obtain input bytes from a file  
        FileInputStream fis = new FileInputStream(new File("C:\\demo\\studentdata.xls"));  

        // Creating workbook instance that refers to .xls file  
        HSSFWorkbook wb = new HSSFWorkbook(fis);   

        // Creating a Sheet object to retrieve the object  
        HSSFSheet sheet = wb.getSheetAt(0);  

        // Evaluating cell type   
        FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();  
        for (Row row : sheet) {  
            for (Cell cell : row) {
                switch (formulaEvaluator.evaluateInCell(cell).getCellType()) {  
                    case NUMERIC: // Field that represents numeric cell type  
                        // Getting the value of the cell as a number  
                        System.out.print(cell.getNumericCellValue() + "\t\t");   
                        break;  
                    case STRING: // Field that represents string cell type  
                        // Getting the value of the cell as a string  
                        System.out.print(cell.getStringCellValue() + "\t\t");  
                        break;
                }
            }
            System.out.println();  
        }

        // Closing the workbook to free resources
        wb.close();
    }
}
JAVA

輸出:

Id    Names
1     Zeeshan
2     Shoaib
3     Umar
4     Rizwan
5     Ahsan
Id    Names
1     Zeeshan
2     Shoaib
3     Umar
4     Rizwan
5     Ahsan
SHELL

讀取 XLSX 文件的步驟與讀取 XLS 文件相同,除了以下兩個主要問題:

  • 首先,將文件格式更改為 .xlsx。 可以使用相同的 "studentdata" 文件,但要以 .xlsx 擴展名。
  • 其次,在我們導入 Java Apache POI 時存在差異。 代碼如下:
import java.io.File;  
import java.io.FileInputStream;  
import java.util.Iterator;  
import org.apache.poi.ss.usermodel.Cell;  
import org.apache.poi.ss.usermodel.Row;  
import org.apache.poi.xssf.usermodel.XSSFSheet;  
import org.apache.poi.xssf.usermodel.XSSFWorkbook;  

public class XLSXReaderExample  {

    public static void main(String[] args) {  
        try {  
            File file = new File("C:\\demo\\studentdata.xlsx");  
            FileInputStream fis = new FileInputStream(file);  

            // Creating Workbook instance that refers to .xlsx file  
            XSSFWorkbook wb = new XSSFWorkbook(fis);   
            XSSFSheet sheet = wb.getSheetAt(0); 

            // Iterating over rows using iterator
            Iterator<Row> itr = sheet.iterator();
            while (itr.hasNext()) {  
                Row row = itr.next();  

                // Iterating over each column in a row
                Iterator<Cell> cellIterator = row.cellIterator();   
                while (cellIterator.hasNext()) {  
                    Cell cell = cellIterator.next();  
                    switch (cell.getCellType()) {  
                        case NUMERIC: // Field that represents numeric cell type  
                            // Getting the value of the cell as a number  
                            System.out.print(cell.getNumericCellValue() + "\t\t");   
                            break;
                        case STRING: // Field that represents string cell type  
                            // Getting the value of the cell as a string  
                            System.out.print(cell.getStringCellValue() + "\t\t");  
                            break;
                    }
                }
                System.out.println("");  
            }  

            // Closing the workbook to free resources
            wb.close();
        } catch (Exception e) {  
            e.printStackTrace();  
        }
    }
}
import java.io.File;  
import java.io.FileInputStream;  
import java.util.Iterator;  
import org.apache.poi.ss.usermodel.Cell;  
import org.apache.poi.ss.usermodel.Row;  
import org.apache.poi.xssf.usermodel.XSSFSheet;  
import org.apache.poi.xssf.usermodel.XSSFWorkbook;  

public class XLSXReaderExample  {

    public static void main(String[] args) {  
        try {  
            File file = new File("C:\\demo\\studentdata.xlsx");  
            FileInputStream fis = new FileInputStream(file);  

            // Creating Workbook instance that refers to .xlsx file  
            XSSFWorkbook wb = new XSSFWorkbook(fis);   
            XSSFSheet sheet = wb.getSheetAt(0); 

            // Iterating over rows using iterator
            Iterator<Row> itr = sheet.iterator();
            while (itr.hasNext()) {  
                Row row = itr.next();  

                // Iterating over each column in a row
                Iterator<Cell> cellIterator = row.cellIterator();   
                while (cellIterator.hasNext()) {  
                    Cell cell = cellIterator.next();  
                    switch (cell.getCellType()) {  
                        case NUMERIC: // Field that represents numeric cell type  
                            // Getting the value of the cell as a number  
                            System.out.print(cell.getNumericCellValue() + "\t\t");   
                            break;
                        case STRING: // Field that represents string cell type  
                            // Getting the value of the cell as a string  
                            System.out.print(cell.getStringCellValue() + "\t\t");  
                            break;
                    }
                }
                System.out.println("");  
            }  

            // Closing the workbook to free resources
            wb.close();
        } catch (Exception e) {  
            e.printStackTrace();  
        }
    }
}
JAVA

輸出:

Id    Names
1     Zeeshan
2     Shoaib
3     Umar
4     Rizwan
5     Ahsan
Id    Names
1     Zeeshan
2     Shoaib
3     Umar
4     Rizwan
5     Ahsan
SHELL

IronXL C# 庫

IronXL 是一個獨立的 .NET 庫,能夠讓 C# 開發人員讀取和編輯 Microsoft Excel 文件。 它既不需要安裝 Microsoft Excel,也不依賴於 Interop。

使用 IronXL,開發人員可以輕鬆進行所有與 Excel 有關的計算,只需撰寫少量代碼,且操作快速。 這可以用於例如兩個單元格相加、計算列的總和、向 Excel 表格中添加整列、向 Excel 表格中添加整行、單行和多行列計算總和,或者通過 IronXL 的 有用功能輕鬆完成的其他許多任務。

IronXL 完全支持 .NET Framework、.NET Core、Mobile、Xamarin、Azure Linux 和 macOS。

IronXL 功能集

  • 加載、讀取和編輯來自 XLS/XLSX/CSV/TSV 的數據。
  • 保存和導出為 XLS/XLSX/CSV/TSV/JSON。
  • System.Data 對象 — 將 Excel 電子表格作為 System.Data.DataSetSystem.Data.DataTable 對象工作。
  • 公式——支持 Excel 公式。
  • 範圍 — ["A1:B10"] 語法易於使用。
  • 排序 — 排序行、列和範圍。
  • 樣式 — 視覺樣式、字體和字體大小、背景圖案、邊框、對齊和數字格式。

下面是使用 IronXL 在 C# 中讀取 Excel 文件的代碼範例:

using IronXL;
using System.Linq;

public class ExcelReaderExample
{
    public static void Main(string[] args)
    {
        // Supported spreadsheet formats for reading include: XLSX, XLS, CSV and TSV
        WorkBook workbook = WorkBook.Load("test.xlsx");
        WorkSheet sheet = workbook.WorkSheets.First();

        // Select cells easily in Excel notation and return the calculated value
        int cellValue = sheet["A2"].IntValue;

        // Read from Ranges of cells elegantly
        foreach (var cell in sheet["A2:A10"]) {
            Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text);
        }
    }
}
using IronXL;
using System.Linq;

public class ExcelReaderExample
{
    public static void Main(string[] args)
    {
        // Supported spreadsheet formats for reading include: XLSX, XLS, CSV and TSV
        WorkBook workbook = WorkBook.Load("test.xlsx");
        WorkSheet sheet = workbook.WorkSheets.First();

        // Select cells easily in Excel notation and return the calculated value
        int cellValue = sheet["A2"].IntValue;

        // Read from Ranges of cells elegantly
        foreach (var cell in sheet["A2:A10"]) {
            Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text);
        }
    }
}
Imports IronXL
Imports System.Linq

Public Class ExcelReaderExample
	Public Shared Sub Main(ByVal args() As String)
		' Supported spreadsheet formats for reading include: XLSX, XLS, CSV and TSV
		Dim workbook As WorkBook = WorkBook.Load("test.xlsx")
		Dim sheet As WorkSheet = workbook.WorkSheets.First()

		' Select cells easily in Excel notation and return the calculated value
		Dim cellValue As Integer = sheet("A2").IntValue

		' Read from Ranges of cells elegantly
		For Each cell In sheet("A2:A10")
			Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text)
		Next cell
	End Sub
End Class
$vbLabelText   $csharpLabel

使用 IronXL 能使開發者的工作更加容易。 其簡單且易於使用的代碼使軟件在處理 Excel 文件時更不易出現錯誤。

下載 IronXL 並在你的項目中使用它。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担产品测测试,产品开发和研究的责任时,Jordi 为持续的产品改进增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。