使用 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...。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,避免平台相依、驅動缺失、效能低下等諸多坑點。