2013-09-04 12 views
5

私は、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を助けることができますか?

+0

この方法では、プロバイダをマシンにインストールする必要があります。ジェットはデフォルトでどこにも存在しないようです。なぜOpenXmlに切り替えるのですか? .xlsxファイルを互換性パック付きの以前のバージョンのExcelで開くことができるようになりました。ちょっと考えました... – Chris

+0

Ditto XML - a.WriteXMLメソッドとしてのDataTable。テーブルに.Nameを指定する必要があります。ユーザーはファイルを開くか、Excel上でドラッグ&ドロップしてファイルを開くことができます。または簡単に開くExcelファイルを作成します。 Kellerman Softwareには安価な.Net CSV(と私が考えるExcel)ライブラリがあります。 – rheitzman

+0

@Chris:私はOpenXMLでそのアイディアが好きです。いくつか[noob-aware]のサンプルはどこにありますか? – Alexander

答えて

3

これが問題であるかどうかわかりません。 OleDbCommandオブジェクトを廃棄しないでください。ファイルへの参照を保持する可能性があります。これを試してみてください:

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 

    Using fileSave As New SaveFileDialog() 
     fileSave.Filter = "Excel 97-2003 Workbook (*.xls)|*.xls" 
     fileSave.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) 
     fileSave.Title = strHeader 

     If fileSave.ShowDialog() = Windows.Forms.DialogResult.OK Then 
      Dim xlsFilePath As String = fileSave.FileName 
      If xlsFilePath = "" Then Exit Sub 

      System.IO.File.Copy(storagePath & "\" & "empty.xls", xlsFilePath) 

      Cursor.Current = Cursors.WaitCursor 

      Using 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) &= ")" 

        Using cmd As New OleDb.OleDbCommand(strTableQ(i), conn) 
         cmd.ExecuteNonQuery() 
        End Using 
       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 
         Using 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() 
         End Using 
        Next 
       Next 
       conn.Close() 
       Cursor.Current = Cursors.Default 

      End Using 
     End If 
    End Using 
End Sub 

はまた、あなたがShowDialog()方法で表示formがあまりにも処分されなければならないことに注意してください。

+0

ありがとう、それは完全に動作します:) – Alexander

関連する問題