VB讀excel數據丟失

讀取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,就可以解这个问题了(不需要重啟電腦)!

3.Extended Properties='Excel 8.0:對於Excel 97以上版本都用Excel 8.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值