4

指定した形式の Excel シートからインポートするコードがあります。列の 1 つは、ほとんどのデータが数値ですが、数値以外の値も存在します。数値以外の値は、何らかの理由でインポート コードによって無視されます。

接続文字列は次のようになります。

    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 に通知することに注意してください。これは役に立たないようです。何が起こっているのか分かりますか?

4

2 に答える 2

3

私が指摘したことは、エンジンが列の最初の値から列のデータ型を推測することです。

したがって、最初の値が数値の場合、エンジンは列を数値と見なし、アルファ値を数値に変換しようとすると失敗します。

私が通常行ったことは、Excel のすべての値にアンダースコアを追加し、SQL または DataSet で最初のアンダースコアを置き換えることです。それが役立つことを願っています

于 2009-09-19T12:20:04.230 に答える
2

デフォルトでは、Excelはデータの最初の8行に基づいて列のデータ型を決定します。これを変更するには、レジストリキーを更新する必要があります。

HKLM \ Software \ Microsoft \ Office \ 12.0 \ Access Connect Engine \ Engines \ Excel

Excelでスキャンする行数を指定します。値を0に設定すると、すべての行がスキャンされます。特に大きなスプレッドシートでは、ゼロに設定するとExcelの読み込みが少し遅くなる可能性があることに注意してください。

また、Excel 2003も使用している場合は、2番目のレジストリキーを更新する必要があります。

HKLM \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel

于 2009-09-19T12:45:55.040 に答える