webForumDet fria alternativet

Prestandaproblem med excel

1 svar · 283 visningar · startad av Hyzac

HyzacMedlem sedan mars 200475 inlägg
#1

Jag har följande kod som skapar en excel fil från dynamisk data. Problemet är att det tar väldigt lång tid 1min 48s för tusen rader. Sedan ligger processen EXCEL.exe kvar om man kikar i Aktivitetshanteraren fast jag har kod som ska ta bort det.

Nån som har tips om prestandaökning och processavslut?

Jag har ersatt vissa av värdena om ni undrar varför det bara står "värde" i insättningen i cellerna, dessa är alla av typen varchar annars så inga speciella datatyper används.

Dim oXL As Excel.Application
        Dim oWB As Excel.Workbook
        Dim oSheet As Excel.Worksheet
        'Dim oRng As Excel.Range
        Try
            GC.Collect()
            ' Start Excel and get Application object.
            oXL = New Excel.Application()
            oXL.Visible = True
            oXL.UserControl = True
            Dim oldCI As System.Globalization.CultureInfo = _
                System.Threading.Thread.CurrentThread.CurrentCulture
            System.Threading.Thread.CurrentThread.CurrentCulture = _
                New System.Globalization.CultureInfo("en-US")
            'oXL.Workbooks.Add()
            oWB = oXL.Workbooks.Add(Missing.Value)

            oSheet = oWB.ActiveSheet
            oSheet.Cells(1, 1).Value = "värde"
            oSheet.Cells(1, 2).Value = "värde"
            oSheet.Cells(1, 3).Value = "värde"
            oSheet.Cells(1, 4).Value = "värde"
            oSheet.Cells(1, 5).Value = "värde"
            oSheet.Cells(1, 6).Value = "värde"
            oSheet.Cells(1, 7).Value = "värde"
            oSheet.Cells(1, 8).Value = "värde"
            oSheet.Cells(1, 9).Value = "värde"
            oSheet.Cells(1, 10).Value = "värde"
            oSheet.Cells(1, 11).Value = "värde"
            oSheet.Cells(1, 12).Value = "värde"
            oSheet.Cells(1, 13).Value = "värde"
            oSheet.Cells(1, 14).Value = "värde"
            'oSheet.get_Range("A1", "N1").Font.Bold = True
            'oSheet.get_Range("A1", "N1").ColorIndex = 15
            'oSheet.get_Range("A1", "N1").Pattern = xlSolid
            cmd.Connection.Open()
            Dim myReader As SqlDataReader = cmd.ExecuteReader
            Dim i As Integer = 2
            While myReader.Read
                oSheet.Cells(i, 1).Value = myReader("värde")
                oSheet.Cells(i, 2).Value = myReader("värde")
                oSheet.Cells(i, 3).Value = myReader("värde")
                oSheet.Cells(i, 4).Value = myReader("värde")
                oSheet.Cells(i, 5).Value = myReader("värde")
                oSheet.Cells(i, 6).Value = myReader("värde")
                oSheet.Cells(i, 7).Value = myReader("värde")
                oSheet.Cells(i, 8).Value = myReader("värde")
                oSheet.Cells(i, 9).Value = myReader("värde")
                oSheet.Cells(i, 10).Value = myReader("värde")
                oSheet.Cells(i, 11).Value = myReader("värde")
                oSheet.Cells(i, 12).Value = myReader("värde")
                oSheet.Cells(i, 13).Value = myReader("värde")
                oSheet.Cells(i, 14).Value = myReader("värde")
                i = i + 1
            End While
            myReader.Close()
            myReader = Nothing
            cmd.Connection.Close()

            oWB.SaveAs(filePath, Excel.XlFileFormat.xlWorkbookNormal, Missing.Value, Missing.Value, False, False, Excel.XlSaveAsAccessMode.xlShared, False, False, Missing.Value, Missing.Value, Missing.Value)
            ' Need all following code to clean up and extingush all references!!!
            oWB.Close(Missing.Value, Missing.Value, Missing.Value)
            oXL.Workbooks.Close()
            oXL.Quit()
            'System.Runtime.InteropServices.Marshal.ReleaseComObject(oRng)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oXL)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oWB)
            oSheet = Nothing
            oWB = Nothing
            oXL = Nothing
            GC.Collect() ' force final cleanup!
            System.Threading.Thread.CurrentThread.CurrentCulture = oldCI
            errLabel.Text = "<a href=""fil.xls"" target=""_blank"">H&auml;mta excelfil</a>"
        Catch exc As Exception
            Dim errorMessage As String
            errorMessage = "Fel: "
            errorMessage = String.Concat(errorMessage, exc.Message)
            errorMessage = String.Concat(errorMessage, " Rad: ")
            errorMessage = String.Concat(errorMessage, exc.Source)
            errLabel.Text = errorMessage
        End Try
HyzacMedlem sedan mars 200475 inlägg
#2

Processerna upptäckte jag berodde på att i testerna så hade jag ibland avbrutit körningen och då inte avslutat dem korrekt. Kör man nu så ligger det bara en process hela tiden. Men skulle gärna se lite prestandaökning dock.

136 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)