私は、VB.NET(Windows Forms)アプリケーションからExcelへのエクスポートを実行しようとしています。InteropのないExcelのエクスポート
残念ながら、Excelがインストールされていない場合でもアプリケーションはすべてのコンピュータで動作するため、残念ながらOffice Interopsは使用できません。
私は、ネット上の次のサンプルを見つけました:
Public Sub ExportDatasetToExcel(ByVal ds As DataSet, Optional ByVal strHeader As String = "Save As")
'Proudly copied from:
'http://www.daniweb.com/software-development/vbnet/threads/368400/write-into-excel-using-oledb-connection#post1583200
Dim fileSave As New SaveFileDialog()
fileSave.Filter = "Excel 97-2003 Workbook (*.xls)|*.xls"
fileSave.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
fileSave.Title = strHeader
fileSave.ShowDialog()
Dim xlsFilePath As String = fileSave.FileName
If xlsFilePath = "" Then
Exit Sub
End If
System.IO.File.Copy(storagePath & "\" & "empty.xls", xlsFilePath)
Cursor.Current = Cursors.WaitCursor
Dim conn As New OleDb.OleDbConnection(String.Format("provider=Microsoft.Jet.OLEDB.4.0; Data Source='{0}';" & "Extended Properties='Excel 8.0;HDR=YES;'", xlsFilePath))
conn.Open()
Dim strTableQ(ds.Tables.Count) As String
Dim i As Integer = 0
'making table query
For i = 0 To ds.Tables.Count - 1
strTableQ(i) = "CREATE TABLE [" & ds.Tables(i).TableName & "]("
Dim j As Integer = 0
For j = 0 To ds.Tables(i).Columns.Count - 1
Dim dCol As DataColumn
dCol = ds.Tables(i).Columns(j)
strTableQ(i) &= " [" & dCol.ColumnName & "] varchar(255) , "
Next
strTableQ(i) = strTableQ(i).Substring(0, strTableQ(i).Length - 2)
strTableQ(i) &= ")"
Dim cmd As New OleDb.OleDbCommand(strTableQ(i), conn)
cmd.ExecuteNonQuery()
Next
'making insert query
Dim strInsertQ(ds.Tables.Count - 1) As String
For i = 0 To ds.Tables.Count - 1
strInsertQ(i) = "Insert Into " & ds.Tables(i).TableName & " Values ("
For k As Integer = 0 To ds.Tables(i).Columns.Count - 1
strInsertQ(i) &= "@" & ds.Tables(i).Columns(k).ColumnName & " , "
Next
strInsertQ(i) = strInsertQ(i).Substring(0, strInsertQ(i).Length - 2)
strInsertQ(i) &= ")"
Next
'Now inserting data
For i = 0 To ds.Tables.Count - 1
For j As Integer = 0 To ds.Tables(i).Rows.Count - 1
Dim cmd As New OleDb.OleDbCommand(strInsertQ(i), conn)
For k As Integer = 0 To ds.Tables(i).Columns.Count - 1
cmd.Parameters.AddWithValue("@" & ds.Tables(i).Columns(k).ColumnName.ToString(), ds.Tables(i).Rows(j)(k).ToString())
Next
cmd.ExecuteNonQuery()
cmd.Parameters.Clear()
Next
Next
conn.Close()
conn.Dispose()
Cursor.Current = Cursors.Default
End Sub
このコードは動作し、.xlsファイルに自分のデータセットをエクスポートします。
問題:プログラムの実行中にこのファイルを開くことができません。私のプログラムはまだこのファイルを扱っているようです。私はSysinternals Process Explorerを使用するたびにそれを見ることができます。プログラムを閉じると、問題なくこのファイルを開くことができます。
私はいくつかのオブジェクトを破壊するか、ファイルを閉じる必要があると思います。誰でもそれを達成するためにnoobを助けることができますか?
この方法では、プロバイダをマシンにインストールする必要があります。ジェットはデフォルトでどこにも存在しないようです。なぜOpenXmlに切り替えるのですか? .xlsxファイルを互換性パック付きの以前のバージョンのExcelで開くことができるようになりました。ちょっと考えました... – Chris
Ditto XML - a.WriteXMLメソッドとしてのDataTable。テーブルに.Nameを指定する必要があります。ユーザーはファイルを開くか、Excel上でドラッグ&ドロップしてファイルを開くことができます。または簡単に開くExcelファイルを作成します。 Kellerman Softwareには安価な.Net CSV(と私が考えるExcel)ライブラリがあります。 – rheitzman
@Chris:私はOpenXMLでそのアイディアが好きです。いくつか[noob-aware]のサンプルはどこにありますか? – Alexander