ExcelスプレッドシートからVB.NETにデータをインポートしていますDataTable
。このExcelスプレッドシートには、最初の18行に、多くの空のセルを含む多くのガベージデータが含まれています。最終的には後処理でこれらの行を削除しますが、手動で変更せずに、Excelファイルにそのままアクセスする必要があります。
IMEX=1
設定により、すべての列がテキストであると想定するようにJetエンジンに指示されていることに気付きました。ただし、別の値に設定する際に問題があります(以下で詳しく説明します)。したがって、デフォルトのJetエンジンの列タイプのスキャンは特にうまく機能しません。
私はどちらかをしたい:
- インポートする前に列タイプを手動で定義する
- 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
ありがとうございました!