首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

VBScript 使用 ADO 讀取 Excel 文件完整指南:無需安裝 Office

     編輯:Java 相關知識

背景

在無 Office 環境的 Windows 服務器上,需讀取 Excel 數據導入系統。利用 Windows 內置的 Microsoft.Jet.OLEDB.4.0 驅動 + ADO (ActiveX Data Objects),可將 Excel 作為數據源直接用 SQL 查詢,無需安裝 Office,輕量高效。

核心函數:ReadExcel

Function ReadExcel(myXlsFile, mySheet, my1stCell, myLastCell, blnHeader)
    ' 參數說明:
    ' myXlsFile   - Excel 文件完整路徑
    ' mySheet     - 工作表名(如 "Sheet1")
    ' my1stCell   - 起始單元格(如 "A1")
    ' myLastCell  - 結束單元格(如 "D100")
    ' blnHeader   - 第一行是否為標題行

    Dim arrData, i, j
    Dim objExcel, objRS
    Dim strHeader, strRange

    Const adOpenStatic = 3

    ' 構建 Extended Properties
    If blnHeader Then strHeader = "HDR=YES;" Else strHeader = "HDR=NO;"
    ' IMEX=1 強制混合類型列按文本讀取,避免數字/文本混合導致空值
    strHeader = "Excel 8.0;IMEX=1;" & strHeader

    Set objExcel = CreateObject("ADODB.Connection")
    objExcel.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & myXlsFile & ";Extended Properties=""" & strHeader & """"

    Set objRS = CreateObject("ADODB.Recordset")
    strRange = mySheet & "$" & my1stCell & ":" & myLastCell  ' 如 Sheet1$A1:D100
    objRS.Open "Select * from [" & strRange & "]", objExcel, adOpenStatic

    i = 0
    Do Until objRS.EOF
        ' 遇到第一列為空則停止(可選邏輯)
        If IsNull(objRS.Fields(0).Value) Or Trim(objRS.Fields(0).Value) = "" Then Exit Do

        ReDim Preserve arrData(objRS.Fields.Count - 1, i)
        For j = 0 To objRS.Fields.Count - 1
            If IsNull(objRS.Fields(j).Value) Then
                arrData(j, i) = ""
            Else
                arrData(j, i) = Trim(objRS.Fields(j).Value)
            End If
        Next
        objRS.MoveNext
        i = i + 1
    Loop

    objRS.Close
    objExcel.Close
    Set objRS = Nothing
    Set objExcel = Nothing

    ReadExcel = arrData  ' 返回二維數組:第一維列,第二維行
End Function

調用示例

Option Explicit
Dim arrSheet, intCount

' 讀取 Sheet1 A1:B6,含標題行
arrSheet = ReadExcel("ReadExcelTest.xls", "Sheet1", "A1", "B6", True)
For intCount = 0 To UBound(arrSheet, 2)
    WScript.Echo arrSheet(0, intCount) & vbTab & arrSheet(1, intCount)
Next

WScript.Echo "==============="

' 讀取 Sheet1 A2:B6,無標題行
arrSheet = ReadExcel("ReadExcelTest.xls", "Sheet1", "A2", "B6", False)
For intCount = 0 To UBound(arrSheet, 2)
    WScript.Echo arrSheet(0, intCount) & vbTab & arrSheet(1, intCount)
Next

關鍵參數詳解

參數作用推薦值
HDR首行是否列名YES/NO
IMEX導入模式:1=混合類型按文本讀取(關鍵!)1
Excel 版本Excel 8.0 兼容 .xls;.xlsx 需 ACE 驅動Excel 8.0 / Excel 12.0 Xml

.xlsx 文件支持(Office 2007+)

需安裝 Microsoft Access Database Engine (AccessDatabaseEngine.exe),連接字符串修改為:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1"

64 位系統需安裝 64 位 ACE 驅動,且腳本在 64 位 cscript/wscript 下運行。

常見問題與解決

  • 數字列讀出為空:必須加 IMEX=1,強制文本模式。
  • 列名包含特殊字符:SQL 中用方括號包裹 [Column Name]。
  • 大文件性能:ADO 一次性加載到記憶體,超大文件建議分批讀取或用流式解析庫(如 Apache POI Java 版)。
  • 權限問題:確保運行腳本的用戶對文件有讀權限,對臨時目錄有寫權限(Jet 驅動會創建臨時文件)。

總結

ADO + Jet/ACE OLEDB 是 Windows 平台無 Office 讀取 Excel 的經典方案,代碼簡潔、性能尚可、部署輕量。關鍵在於 IMEX=1 參數與正確的驅動版本選擇。現代項目建議遷移至 Apache POI (Java)、openpyxl (Python) 等跨平台庫,獲得更強大的功能與穩定性。

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