2013-09-04 13 views
5

के बिना एक्सेल निर्यात मैं एक वीबीएनईटी (विंडोज फॉर्म) एप्लिकेशन से एक्सेल में निर्यात को पूरा करने की कोशिश कर रहा हूं।इंटरऑप

दुर्भाग्य से, मैं 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 प्रक्रिया एक्सप्लोरर का उपयोग करता हूं, मैं इसे देख सकता हूं। अगर मैं अपना प्रोग्राम बंद करता हूं, तो मैं बिना किसी समस्या के इस फाइल को खोल सकता हूं।

मुझे लगता है कि मुझे कुछ ऑब्जेक्ट को नष्ट करना है या बस फ़ाइल को बंद करना है। कृपया कोई इसे पूरा करने के लिए नोब की मदद कर सकता है?

+0

इस तरह, आपको अभी भी मशीन पर प्रदाता स्थापित करने की आवश्यकता है। ऐसा लगता है कि जेट डिफ़ॉल्ट रूप से हर जगह मौजूद नहीं है। ओपनएक्सएमएल पर क्यों नहीं स्विच करें? .xlsx फ़ाइलों को अब एक्सेल के पिछले संस्करण के साथ संगतता पैक के साथ खोला जा सकता है। बस एक विचार ... – Chris

+0

डिट्टो एक्सएमएल - डेटाटेबल a.WriteXML विधि के रूप में। आपको टेबल पर एक नाम की आपूर्ति करने की आवश्यकता है। उपयोगकर्ता फ़ाइल ओपन से फ़ाइल खोल सकता है या एक्सेल पर ड्रैग/ड्रॉप कर सकता है। या एक सीएसवी फ़ाइल बनाएं जो एक्सेल आसानी से खोलें। केलरमैन सॉफ्टवेयर में एक सस्ता .NET CSV (और एक्सेल I think) लाइब्रेरी है। – rheitzman

+0

@ क्रिस: मुझे ओपनएक्सएमएल के साथ विचार पसंद है; मुझे कुछ [नोब-जागरूक] नमूने कहां मिल सकता है? – 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 

भी ध्यान रखें कि एक form कि आप ShowDialog() विधि के साथ प्रदर्शित भी निपटारा किया जाना चाहिए।

+0

बहुत बहुत धन्यवाद, यह पूरी तरह से काम करता है :) – Alexander

संबंधित मुद्दे