引子
常規的方法可能是循環讀取每一行每一個格子的內容並存入 Recordset 並保存
此處使用Open Recordset 的方式,將 Excel Worksheet 作爲一個數據源直接讀取
速度將是數量級的差別,幾萬筆記錄的情況下,將由幾十秒,甚至幾分鐘,加快至幾秒鐘
解決代碼
'導入Excel 文件內容
'Excel 格式爲 Excel 2007 之上的 .xlsx 格式,需使用 ACE 讀取
'其中的 HDR=No (Yes) 代表是否處理第一行的標題行
Private Function ImportExcelSheetData(ByVal p_sExcelFilePath As String, ByVal p_sSheetName As String) As Boolean
On Error GoTo errHandler
ImportExcelSheetData = False
Dim cn As New ADODB.Connection
Set m_rstImportData_Excel = New ADODB.Recordset
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & p_sExcelFilePath & ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
m_rstImportData_Excel.Open "SELECT * FROM [" & p_sSheetName & "$]", cn, adOpenStatic, adLockOptimistic
ImportExcelSheetData = True
errHandler:
If Err.Number <> 0 Then
Screen.MousePointer = vbDefault
MsgBox Err.Description, vbOKOnly + vbExclamation, "ImportExcelSheetData"
End If
End Function
可能的問題
- 有時會出現讀取到記錄,但實際內容卻爲 Empty 的情況
- 有時則出現讀取到內容,但在後續使用時其中的值均變爲 Empty 的情況
解決方法
- <推薦>最大的可能是因爲在使用 Recordset.Open() 方式打開Excel 文件時,那個文件已經被 Excel Application 打開,故有時會導致此情況,最簡單的辦法即在使用Open()方式之前關閉Excel Object;
- 另一個方法是完全處理完成數據(如保存至DB Table)後,再關閉或釋放Excel Object