2009-09-19 82 views
4

我有從指定格式的Excel工作表導入的代碼。在其中一列中,大多數數據都是數字,但也存在非數字值。出於某種原因,非數字值會被導入代碼忽略。從Excel導入 - 忽略非數字值

ConnectionString中看起來是這樣的:

Dim FileConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
    "Data Source=" & Path & "\" & _ 
    Filename & ";Extended Properties=" & _ 
    """Excel 12.0;HDR=YES;IMEX=1;""" 

實際導入代碼看起來是這樣的:

Dim Factory As DbProviderFactory = _ 
    DbProviderFactories.GetFactory("System.Data.OleDb") 

    Dim Adapter As DbDataAdapter = Factory.CreateDataAdapter(), _ 
    DataObject As New DataSet 

    Using Connection As DbConnection = Factory.CreateConnection 
     Connection.ConnectionString = FileConnectionString 

     Using Command As DbCommand = Connection.CreateCommand 

      Command.CommandText = _ 
      "SELECT [Column1], [Column2]" & _ 
      "FROM [Sheet1$]" 

      Adapter.SelectCommand = Command 

      Adapter.Fill(DataObject) 

      ... 

請注意,我已經啓用IMEX = 1通知Excel中混合數據出席。這似乎沒有幫助。任何想法發生了什麼?

回答

2

默認情況下,Excel基於前8行數據中列的數據類型。要改變這一點,你需要更新註冊表項:

HKLM \軟件\微軟\辦公室\ 12.0 \訪問連接引擎\引擎\ Excel中

與行數你希望Excel掃描。將該值設置爲0以使其掃描所有行。請注意,將其設置爲零可以減慢Excel的加載速度,特別是在大型電子表格中。

另外,如果您還使用Excel 2003中,你需要更新第二個註冊表項:

HKLM \ SOFTWARE \微軟\噴氣\ 4.0 \發動機\ Excel中

+0

謝謝 - 我確實可以訪問服務器,所以我正在討論編輯註冊表。值,或者只輸入8個虛擬STRING值。後者將更便於攜帶,methinks。 – 2009-09-19 13:09:35

3

我注意到的是,引擎從列中的第一個值推斷列的數據類型。

因此,如果您的第一個值是數字,則引擎會將該列假定爲數字,並且在嘗試將Alpha值轉換爲數字時將失敗。

我通常所做的是在Excel上爲所有值附加下劃線,然後在SQL或DataSet上進行替換第一個下劃線。希望它可以幫助

+1

謝謝,非常有用的提示 - 但傑夫的小費似乎是更準確的原因。我可能會在工作表中輸入8個虛擬STRING值(以編程方式或手動方式)以獲得最可預測的可移植行爲。 – 2009-09-19 13:08:58

+0

哦,順便說一句,我不能使用你的解決方案的原因是因爲我不想爲每個值添加下劃線的開銷。乾杯。 – 2009-09-19 13:10:40