讀取excel數據:
Public Function GetDataExcel(ByVal ExcelPath As String) As DataSet
Dim OledbConnectionString As String = Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & ExcelPath & "';Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'")
Dim conn As OleDbConnection = New OleDbConnection(OledbConnectionString)
Dim SheetNameList As ArrayList = New ArrayList
Try
If conn.State = ConnectionState.Closed Then
conn.Open()
End If
Dim dtExcelSchema As DataTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
'第一個引數 是 GetOleDbSchemaTable 的結構描述參數 OleDbSchemaGuid 引數,用來識別要傳回 (例如資料表、 資料行和主索引鍵) 的結構描述資訊。第二個引數是限制,以篩選傳回結構描述 資料表 中的資料列的物件陣列 (比方說您可能會指定資料表名稱、 型別、 擁有者及 /or 結構描述的限制)。
'OleDbSchemaGuid(成員包括下列各項):資料行\外部索引鍵\索引\主索引鍵\資料表\檢視表
'限制是每一個都對應到 DataColumn 產生 DataTable 中篩選條件值的物件陣列。OleDbSchemaGuid 引數決定相關的限制。例如當您指定資料表的 OleDbSchemaGuid,陣列的限制是,如下所示:{TABLE_CATALOG TABLE_SCHEMA,空間,TABLE_TYPE}
Dim SheetName As String = ""
Dim i As Integer = 0
For i = 0 To dtExcelSchema.Rows.Count - 1
SheetName = dtExcelSchema.Rows(i).Item("TABLE_NAME").ToString
If SheetName.Contains("FilterDatabase") Then
Continue For
End If
SheetNameList.Add(SheetName)
i = i + 1
Next
Catch ex As Exception
Throw ex
Finally
conn.Close()
End Try
Dim dsExcel As DataSet = New DataSet
Dim dtExcel As DataTable
Try
Dim strsql As String = ""
Dim j As Integer
For j = 0 To SheetNameList.Count - 1
strsql = "select * from [" + Format(SheetNameList(j).ToString) + "]"
Dim oleExcelDataAdapter As OleDbDataAdapter = New OleDbDataAdapter(strsql, conn)
dtExcel = New DataTable(Format(SheetNameList(j).ToString))
oleExcelDataAdapter.Fill(dtExcel)
dsExcel.Tables.Add(dtExcel)
Next
Catch ex As Exception
Throw ex
End Try
Return dsExcel
End Function
End Class
但是這樣寫,如果有一列數據中前幾列是數字,到了後面是文字,則會將這一列識別為數字,當讀取到文字區域時,會將其視為錯誤,讀入為空。
可參見https://blog.csdn.net/GUO_LOVER/article/details/52397200的說明
Dim OledbConnectionString As String = Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & ExcelPath & "';Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'")
其中,
1.HDR=Yes; 表示是否让第一行作为列头
HDR=Yes,這代表第一行是標題,不做為資料使用 ,如果用HDR=NO,則表示第一行不是標題,做為資料來使用。系統預設的是YES
2.IMEX=1表示强制混合数据转换为文本。
IMEX( IMport EXport mode )是用来告诉驱动程序使用Excel文件的模式,其值有0、1、2三种,分别代表导出、导入、混合模式(完全更新能力)。
當 IMEX=0 時為“匯出模式”,這個模式開啟的 Excel 檔案只能用來做“寫入”用途。
當 IMEX=1 時為“匯入模式”,這個模式開啟的 Excel 檔案只能用來做“讀取”用途。
當 IMEX=2 時為“連結模式”,這個模式開啟的 Excel 檔案可同時支援“讀取”與“寫入”用途。
当我们设置IMEX=1时强制混合数据转换为文本,但仅仅这种设置并不可靠,IMEX=1只确保在某列前8行数据至少有一个是文本项的时候才起作用,它只是把查找前8行数据中数据类型占优选择的行为作了略微的改变。例如某列前8行数据全为纯数字,那么它仍然以数字类型作为该列的数据类型,随后行里的含有文本的数据仍然变空。
這是由於在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Excel
(打開註冊表使用win+R,輸入regedit。我找的時候沒有找到這個地址,而是:電腦\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\Excel,不同電腦可能略有差異,也可以直接搜TypeGuessRows)
有一个TypeGuessRows值,预设是8,表示会先读取前8列来决定每一个栏位的型态,所以如果前8列的资料都是数字,到了第9列以后出现的文字资料都会变成null,所以如果要解决这个问题,只要把TypeGuessRows机码值改成0,就可以解这个问题了(不需要重啟電腦)!