私はさまざまな方法を使用してこのデータをインポートしようとしました (毎朝、Crystal Report サーバーによって生成された 97 ~ 2000 の xls ファイルで、最初のシートがいっぱいになり、2 番目のシートが半分以上いっぱいになります。合計で約 120,000 レコードになりますが、不定)。データには約 14 列ありますが、問題は、1 行目と 2 行目にタイトル データが 2 列分あり、レポート サーバーによる入力を止めることができないことです。次のようなコードを使用してデータをインポートする場合:
Imports System.Data.OleDb
Public Class ImportData
Private Const databaselocation As String = "G:\db.mdb"
Private Const excelfileloc As String = "D:\"
Private connstr As String = "Provider=Microsoft.JET.OLEDB.4.0; Data Source=" & databaselocation & "; User Id=admin; Password=;"
Private excelstring1 As String = "Provider=Microsoft.JET.OLEDB.4.0; Data Source=" & excelfileloc
Private excelstring2 As String = "; Extended Properties=""Excel 8.0; HDR=NO; IMEX=1"";"
Public Function ImportExcel() As Boolean
Dim connection As OleDb.OleDbConnection = New OleDb.OleDbConnection(connstr)
Dim command As New OleDb.OleDbCommand
connection.Open()
command.Connection = connection
Try
Using conn As New OleDbConnection(excelstring1 & "excel.xls" & excelstring2)
Using cmd As New OleDbCommand()
cmd.Connection = conn
cmd.CommandText = "INSERT INTO [MS Access;Database=" & databaselocation & "].[dbo_impExcel] SELECT * FROM [Sheet1$]"
conn.Open()
cmd.ExecuteNonQuery()
End Using
End Using
Catch ex As Exception
End Try
End Function
End Class
最初の 2 行のみをインポートし、残りは無視します。次にコードを繰り返しますが、 を使用する[Sheet2$]
と、データが正常に返されます。手動で Excel ファイルにアクセスしてタイトルを削除すると、データは正常にインポートされます。現時点では、最初にタイトル行を削除するコードを使用していますが、もっと良い方法があるはずです。私の実験では、MS SQL データベースでストアド プロシージャを作成しようとしましたが、OPENROWSET
それでも問題が発生します (ただし、さまざまなジョブの制約により、このジョブは JET にのみ依存する必要があります。