0

私はさまざまな方法を使用してこのデータをインポートしようとしました (毎朝、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 にのみ依存する必要があります。

4

1 に答える 1

0

Excel ワークシートで VB を使用して、適切なデータを作成し、新しい xls ファイルにコピーしてみてください。個人的には、xls としてインポートするのではなく、タブ区切りまたはパイプ テキスト ファイルとして保存する傾向があります。xls をインポートしようとするイライラを解消し​​てくれます。

ファイルのタイトルが毎日、または日付に基づいている場合は、すべての作業を行って後で閉じるxlsファイルにコーディングするだけでよいはずです。

于 2013-09-15T08:59:39.840 に答える