首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 使用 ODBC 連接 Excel 為何從第二行開始讀取資料?

     編輯:程式設計疑難解答

現象說明

使用 JDBC-ODBC Bridge(sun.jdbc.odbc.JdbcOdbcDriver)連接 Excel 檔案時,執行 SELECT * FROM [Sheet1$] 發現第一列資料被略過,從第二列開始返回。

根本原因

Excel 的第一行預設被視為「標題列」(Header Row),ODBC 驅動程式依據 FirstRowHasNames 註冊表設定(預設為 1),自動將第一行作為欄位名稱,不納入結果集。因此:

  • 結果集的欄位名稱 = 第一行的儲存格內容。
  • 資料列從第二行開始。

解決方案

方法一:修改連接字串(推薦)

在連接 URL 中明確指定 HDR=NO,告知驅動程式第一行也是資料:

String url = "jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=C:/data.xls;HDR=NO;";
  • HDR=YES(預設):第一行為標題。
  • HDR=NO:第一行為資料,欄位名自動命名為 F1、F2...。

方法二:改用 Apache POI(強烈建議)

JDBC-ODBC Bridge 已在 Java 8 移除,且僅限 Windows、32 位元、需安裝 Office/驅動程式,穩定性差。Apache POI 是純 Java 實現,跨平台、功能豐富、支援 .xls/.xlsx、可精確控制儲存格讀寫:

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>5.3.0</version>
</dependency>

// 讀取範例
try (Workbook wb = WorkbookFactory.create(new File("data.xlsx"))) {
    Sheet sheet = wb.getSheetAt(0);
    for (Row row : sheet) {
        for (Cell cell : row) {
            System.out.print(cell.toString() + "\t");
        }
        System.out.println();
    }
}

總結

ODBC 讀 Excel 預設跳過首行是因為「標題列」機制。若必須用 ODBC,加 HDR=NO;但現代專案強烈建議直接使用 Apache POI,避免平台相依、驅動缺失、效能低下等諸多坑點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved