मैं एक डेटाटेबल को एक माइस्क्ल टेबल से डेटा के साथ एक्सेल फ़ाइल में कॉपी करने की कोशिश कर रहा हूं, बस इतना आसान। लेकिन मेरे पास जो कोड है वह डेटा को उसी तरह बनाता और भरता है जैसे उसे करना चाहिए।

लेकिन मैं इस कोड को केवल फ़ाइल ढूंढना चाहता हूं और इसे खोलने की आवश्यकता के बिना डेटा को अपडेट/सम्मिलित करना चाहता हूं।

एक और बात, यह प्रक्रिया बहुत धीमी है, क्या कोड में कोई समस्या है? या यह जैसा है वैसा ही है?

कोड है:

Dim dts As New DataTable
    Dim sql = "SELECT referencia, descricao, notas, tipo, custo, eqs, sac, preco_minimo, percent_pvp, margem_eqs, margem_sac, margem_minimo FROM produtos"

    Using conn As New MySqlConnection(ConStrMySql),
        cmd As New MySqlCommand(sql, conn)
        conn.Open()
        Using reader = cmd.ExecuteReader
            dts.Load(reader)
        End Using
    End Using

    Dim oXL As Excel.Application
    Dim oWB As Excel.Workbook
    Dim oSheet As Excel.Worksheet
    Dim oRange As Excel.Range

    oXL = New Excel.Application
    oXL.Visible = True
    oXL.DisplayAlerts = False

    oWB = oXL.Workbooks.Add

    oSheet = DirectCast(oWB.ActiveSheet, Excel.Worksheet)
    oSheet.Name = "Produtos"

    Dim dt As Data.DataTable = dts

    Dim rowCount As Integer = 1
    For Each dr As DataRow In dt.Rows
        rowCount += 1
        For i As Integer = 1 To dt.Columns.Count

            If rowCount = 2 Then
                Dim t = i - 1
                oSheet.Cells(1, i) = dt.Columns(t).ColumnName
            End If
            Dim j = i - 1
            oSheet.Cells(rowCount, i) = dr.Item(j).ToString
        Next
    Next

    oRange = oSheet.Range(oSheet.Cells(1, 1),
              oSheet.Cells(rowCount, dt.Columns.Count))
    oRange.EntireColumn.AutoFit()

    oSheet = Nothing
    oRange = Nothing
    oWB.SaveAs("test.xlsx")
    oWB.Close()
    oWB = Nothing
    oXL.Quit()

    GC.WaitForPendingFinalizers()
    GC.Collect()
    GC.WaitForPendingFinalizers()
    GC.Collect()

मैंने फ़ाइल भरने के अन्य तरीकों के लिए थोड़ी खोज की है लेकिन मुझे केवल एक ही मिला है जो वास्तव में काम करता है और यह इस तरह था:

Using csv As New System.IO.StreamWriter("17 - tic\BD2021-UPDATE.xlsx")
        csv.WriteLine(String.Format("{0};{1};{2}", Data1, Data2, Data3))
    End Using

लेकिन यह फिर से एक नई फाइल बनाता है और मैं एक मौजूदा का उपयोग करना चाहता हूं:

फिर से समस्या यह है: मेरे पास एक कोड है जो काम करता है लेकिन जब भी मैं उप को कॉल करता हूं तो हर बार एक नया बनाने के बिना मैं इसे मौजूदा फ़ाइल का उपयोग करने के लिए अनुकूलित नहीं कर सकता। और अगर मेरा कोड इसके प्रदर्शन के साथ कुछ समस्या है।

धन्यवाद

0
Rwolf27 27 मई 2021, 18:49
क्या इससे आपके सवाल का जवाब मिलता है? vb.net में मौजूदा एक्सेल फाइल को कैसे संशोधित करें
 – 
sous2817
27 मई 2021, 18:58
खैर बीकॉज मैं वीबी के लिए बहुत नया हूं, यह बताना मुश्किल है और ईमानदार होने के लिए मैं समाधान को समझ नहीं पा रहा हूं और इसे कैसे शामिल किया जा सकता है, इसलिए मुझे नहीं लगता।
 – 
Rwolf27
27 मई 2021, 19:05

1 उत्तर

सबसे बढ़िया उत्तर

इस हेल्पर Module को एक एक्सेल फाइल में एक Dataset को सेव करने के विकल्प के रूप में देखें। आपको मशीन/पीसी पर Microsoft.Jet.OLEDB.4.0 Excel 8.0 या 12 स्थापित करना होगा। जैसा कि आप देखते हैं कि उपयोग सरल है:

निम्नलिखित Sub का उपयोग करें: ExportDataSetToExcel इसके साथ ही Dataset जिसे आपको सहेजना है और पथ को String फ़ाइल के रूप में उपयोग करें। यदि आप अपने एक्सेल में परिवर्तन करना चाहते हैं, तो खुली हुई एक्सेल फ़ाइल का उपयोग नहीं करते हैं, लेकिन केवल अपनी Dataset में परिवर्तन करते हैं, तो जब आप कर लेंगे तो आप अंतिम सामग्री को एक्सेल फ़ाइल के रूप में सहेज सकते हैं (परिवर्तनों के साथ भी)

Module XlsHelper

    Event OnTotalRowsDetected(RowCount As Integer)
    Event OnRowExported(RowIndex As Integer)

    Const CON_STRING As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source='{0}'; Extended Properties='Excel 8.0;HDR=YES'"

    Function GetConnectionString(fileName As String, mode As String) As String
        Dim imex As String = CType(IIf(mode.ToLower = "write", "2", "1"), String)
        Return String.Format(CON_STRING, fileName, mode, imex)
    End Function

    Private Structure ExcelDataTypes
        Public Const NUMBER As String = "NUMBER"
        Public Const DATETIME As String = "DATETIME"
        Public Const TEXT As String = "TEXT"
    End Structure

    Private Structure NETDataTypes
        Public Const _Short As String = "Int16"
        Public Const _Int As String = "Int32"
        Public Const _Long As String = "Int64"
        Public Const _String As String = "String"
        Public Const _Date As String = "DateTime"
        Public Const _Bool As String = "Boolean"
        Public Const _Decimal As String = "Decimal"
        Public Const _Double As String = "Double"
        Public Const _Float As String = "Float"
    End Structure


    Sub ExportDataSetToExcel(ByVal dataSet As DataSet, filePath As String)

        Dim result() As Byte = Nothing

        Try

            Dim fileTemp As String = My.Computer.FileSystem.GetTempFileName
            If IsNothing(fileTemp) OrElse fileTemp.Length = 0 Then
                Throw New Exception("Connot write on temp folder. Check folder permissions")
            End If

            fileTemp &= ".xls"

            If dataSet IsNot Nothing AndAlso dataSet.Tables.Count > 0 Then
                Dim sConn As String = GetConnectionString(fileTemp, "Write")

                Using connection As OleDbConnection = New OleDbConnection(sConn)

                    connection.Open()

                    For Each dt As DataTable In dataSet.Tables

                        Dim strCreateTableStruct As String = BuildCreateTableCommand(dt)

                        If String.IsNullOrEmpty(strCreateTableStruct) Then Return

                        Using command As OleDbCommand = New OleDbCommand(strCreateTableStruct, connection)
                            command.ExecuteNonQuery()
                            Dim totRows As Integer = dt.Rows.Count - 1

                            RaiseEvent OnTotalRowsDetected(totRows)

                            For rowIndex As Integer = 0 To dt.Rows.Count - 1
                                Using command1 As OleDbCommand = New OleDbCommand(BuildInsertCommand(dt, rowIndex), connection)
                                    command1.ExecuteNonQuery()
                                End Using
                                RaiseEvent OnRowExported(rowIndex)
                            Next
                        End Using

                    Next

                End Using

            End If


            If IO.File.Exists(fileTemp) Then
                result = IO.File.ReadAllBytes(fileTemp)
                IO.File.Delete(fileTemp)
            End If

            If result IsNot Nothing AndAlso result.Length > 0 Then
                Using Fs As FileStream = New FileStream(filePath, FileMode.OpenOrCreate)
                    Fs.Write(result, 0, result.Length)
                End Using
            End If

        Catch eX As Exception
            MsgBox(eX.ToString)

        End Try





    End Sub

    Private Function BuildCreateTableCommand(ByVal dataTable As DataTable) As String
        Dim sb As StringBuilder = New StringBuilder()
        Dim dataTypeList As Dictionary(Of String, String) = BuildExcelDataTypes()
        If dataTable.Columns.Count <= 0 Then Return Nothing
        sb.AppendFormat("CREATE TABLE [{0}] (", BuildExcelSheetName(dataTable))

        For Each col As DataColumn In dataTable.Columns
            Dim type As String = ExcelDataTypes.TEXT

            If dataTypeList.ContainsKey(col.DataType.Name.ToString().ToLower()) Then
                type = dataTypeList(col.DataType.Name.ToString().ToLower())
            End If

            sb.AppendFormat("[{0}] {1},", col.Caption.Replace(" "c, "_"c), type)
        Next

        sb = sb.Replace(","c, ")"c, sb.ToString().LastIndexOf(","c), 1)
        Return sb.ToString()
    End Function

    Private Function BuildInsertCommand(ByVal dataTable As DataTable, ByVal rowIndex As Integer) As String
        Dim sb As StringBuilder = New StringBuilder()
        sb.AppendFormat("INSERT INTO [{0}$](", BuildExcelSheetName(dataTable))

        For Each col As DataColumn In dataTable.Columns
            sb.AppendFormat("[{0}],", col.Caption.Replace(" "c, "_"c))
        Next

        sb = sb.Replace(","c, ")"c, sb.ToString().LastIndexOf(","c), 1)
        sb.Append("VALUES (")

        For Each col As DataColumn In dataTable.Columns
            Dim type As String = col.DataType.ToString()
            Dim strToInsert As String = dataTable.Rows(rowIndex)(col).ToString().Replace("'", "''")
            sb.AppendFormat("'{0}',", strToInsert)
        Next

        sb = sb.Replace(","c, ")"c, sb.ToString().LastIndexOf(","c), 1)
        Return sb.ToString()
    End Function

    Private Function BuildExcelSheetName(ByVal dataTable As DataTable) As String
        Dim retVal As String = dataTable.TableName
        If dataTable.ExtendedProperties.ContainsKey("test") Then retVal = dataTable.ExtendedProperties("test").ToString()
        Return retVal.Replace(" "c, "_"c)
    End Function

    Private Function BuildExcelDataTypes() As Dictionary(Of String, String)
        Dim dataTypeLookUp As Dictionary(Of String, String) = New Dictionary(Of String, String) From {
                {NETDataTypes._Short, ExcelDataTypes.NUMBER},
                {NETDataTypes._Int, ExcelDataTypes.NUMBER},
                {NETDataTypes._Long, ExcelDataTypes.NUMBER},
                {NETDataTypes._String, ExcelDataTypes.TEXT},
                {NETDataTypes._Date, ExcelDataTypes.DATETIME},
                {NETDataTypes._Bool, ExcelDataTypes.TEXT},
                {NETDataTypes._Decimal, ExcelDataTypes.NUMBER},
                {NETDataTypes._Double, ExcelDataTypes.NUMBER},
                {NETDataTypes._Float, ExcelDataTypes.NUMBER}
            }
        Return dataTypeLookUp

    End Function

End Module

उपयोग:

ExportDataSetToExcel(dts, "C\Somewhere\17 - tic\BD2021-UPDATE.xlsx")
1
G3nt_M3caj 27 मई 2021, 19:57
1
संरचना स्वचालित रूप से अनुकूलित है। एक्सेल फ़ाइल में डेटासेट की समान संरचना होती है (डेटासेट डेटाटेबल नहीं है क्योंकि डेटासेट के अंदर कई टेबल हो सकते हैं)। आपके द्वारा उपयोग किया जाने वाला एकमात्र उप है ExportDataSetToExcel
 – 
G3nt_M3caj
27 मई 2021, 20:08
1
अन्य सभी कार्य वहां हैं और ऊपर वर्णित मुख्य कार्य से बुलाए जाते हैं :)
 – 
G3nt_M3caj
28 मई 2021, 11:52
1
कोड के बारे में अपने प्रश्न पूछने के लिए आप यहां मुझसे सीधे संपर्क कर सकते हैं। इस तरह, यह अन्य लोगों की मदद करता है जिसका अर्थ है कि वास्तव में इस साइट का उद्देश्य (लोगों की मदद करना, ज्ञान साझा करना)
 – 
G3nt_M3caj
28 मई 2021, 12:50
1
आपको डेटासेट के अंदर प्रत्येक तालिका में प्रत्येक फ़ाइल के लिए ठीक से डेटाटाइप सेट करना होगा जैसे: Dts.Tables("TableName").Columns("myFieldAlphaNumeric").DataType = "System.String" या Dts.Tables("TableName").Columns("myFieldNumeric").DataType = "System.Int32"
 – 
G3nt_M3caj
28 मई 2021, 13:20
1
इसे GetType(Integer) या System.Type.GetType("System.Int32") में बदलें
 – 
G3nt_M3caj
28 मई 2021, 16:47