跳過到頁腳內容
EXCEL 工具

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

什麼是Excel?

Microsoft Excel活頁簿是一個基於試算表的軟體,允許用戶高效地組織和儲存資料。 它以表格形式儲存和組織資料,即使用行和列。 Excel試算表中的儲存格是容納資料的方框,可以使用不同的樣式、格式和公式進行操作。

如何在Java中讀取Excel文件?

有時候讀取Excel文件可能會很複雜。 由於Excel的儲存格,在Java中讀取Excel文件與讀取Word文件略有不同。 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文件。

How to Read Excel Files in Java, Figure 1: Download Binary Distribution File

下載Apache POI JAR文件

下載ZIP文件後,您需要解壓縮它並將以下JAR文件添加到您的專案classpath。 這在下面的從Excel文件讀取中有解釋。

How to Read Excel Files in Java, Figure 2: JAR Files

將Apache POI Jar文件添加到Java的classpath

注意:還要將ooxml-lib中的文件一起複製。

POI中的類別和介面

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

How to Read Excel Files in Java, Figure 3: Apache POI類別

Apache POI類別

以下是POI中用於在Java中讀取XLSXLSX文件的不同Java介面和類別的列表:

Workbook介面由XSSFWorkbook類別實現:

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

Sheet介面由XSSFSheet類別實現:

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

Row介面由XSSFRow類別實現:

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

Cell介面由XSSFCell類別實現:

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

從Excel文件讀取

在這個範例中,我們將在Java中讀取以下Excel文件:

How to Read Excel Files in Java, Figure 4: The Excel File to be Read

將被讀取的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文件的步驟相同,除了以下兩個主要點:

  • 首先,將文件格式更改為.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、移動端、Xamarin、Azure Linux和macOS。

IronXL 功能集

  • 載入、讀取和編輯XLS/XLSX/CSV/TSV的資料。
  • 保存和導出為XLS/XLSX/CSV/TSV/JSON。
  • System.Data 對象 — 作為System.Data.DataTable對象處理Excel試算表。
  • 公式 — 处理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);
        }
    }
}
$vbLabelText   $csharpLabel

使用IronXL使開發者的工作變得更加輕鬆。 其簡單易用的代碼使得與Excel文件工作時,軟體更不易出現錯誤。

下載IronXL並立即與您的專案一起使用。

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

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me