0

ExcelスプレッドシートからVB.NETにデータをインポートしていますDataTable。このExcelスプレッドシートには、最初の18行に、多くの空のセルを含む多くのガベージデータが含まれています。最終的には後処理でこれらの行を削除しますが、手動で変更せずに、Excelファイルにそのままアクセスする必要があります。

IMEX=1設定により、すべての列がテキストであると想定するようにJetエンジンに指示されていることに気付きました。ただし、別の値に設定する際に問題があります(以下で詳しく説明します)。したがって、デフォルトのJetエンジンの列タイプのスキャンは特にうまく機能しません。

私はどちらかをしたい:

  1. インポートする前に列タイプを手動で定義する
  2. Excelにさらに多くの行をスキャンさせ(デフォルトは8だと思います)、列の種類を判別します

しかし、私はアイデア#2に問題があります。開くregedit.exeための管理者権限がないため、その方法を使用してレジストリを変更することはできません。以前はどういうわけかキーをインポートしてこれを回避していましたが、どうやってやったのか思い出せません。したがって、誰かが私がアイデア#2を実行するのを手伝ってくれない限り、#1は理想的な解決策になります。

これは可能ですか?現在、私は次の方法を使用しています。

If _
    SetDBConnect( _
    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filepath & _
    ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""", True) Then

    dtSchema = _dh.GetOleDbSchemaTable()

    If _dh.Errors <> "" Then
       Throw New Exception("::LoadFileToBuffer.GetOleDbSchemaTable::" & _dh.Errors())
    End If

    For Each sheetRow In dtSchema.Rows
       If sheetRow("TABLE_NAME").ToString() = "TOTAL_DOLLARS$" Then
          totalDollars = sheetRow("TABLE_NAME").ToString()
        ElseIf sheetRow("TABLE_NAME").ToString() = "TOTAL_UNITS$" Then
          totalUnits = sheetRow("TABLE_NAME").ToString()
       End If
    Next

    'Get total dollars table
     sql.Append("SELECT * FROM [" & totalDollars & "]")
     dtDollars = _dh.GetTable(sql.ToString())
End If

ありがとうございました!

4

1 に答える 1

1

あなたは言うことができるはずです:

 sql.Append("SELECT * FROM [" & totalDollars & "$A18:X95]")

totalDollars はシート名で、x95 は最後の有効な行です。行 18 で使用できないヘッダーを含めることはできません。

于 2013-01-14T20:26:58.203 に答える