【问题标题】:How to optimize this simple but complex looking implementation in VB.Net?如何在 VB.Net 中优化这个简单但看起来很复杂的实现?
【发布时间】:2011-07-28 08:21:07
【问题描述】:

目标实现: 想要将获取的表格转储到 Excel 工作表中。

我的实现:

Imports System.Data.OleDb

    Private Sub getRawDataNextMonth()
    Dim sheetName As String = "RawData"
    Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\rawData.xlsx;Extended Properties=""Excel 12.0 XML;""")
    Dim adapter As New Data.OleDb.OleDbDataAdapter("SELECT * FROM [Sheet1$]", con)
    Dim dataSet As New Data.DataSet
    adapter.Fill(dataSet)
    Dim dataTable As Data.DataTable = dataSet.Tables(0)
    Dim rawData(dataTable.Rows.Count, dataTable.Columns.Count - 1) As Object
    Dim range As Excel.Range = WB.Sheets(sheetName).Range("A2:T" + dataTable.Rows.Count.ToString())
    For col = 0 To dataTable.Columns.Count - 1
        For row = 0 To dataTable.Rows.Count - 1
            rawData(row, col) = dataTable.Rows(row).ItemArray(col)
        Next
    Next
    range.Value2 = rawData
    End Sub

我是数据获取和 ADO.Net 概念的新手,刚刚开始工作。 但是..

这对我来说似乎非常低效和蹩脚。

那么,您能否帮助降低复杂性并提高性能?

非常欢迎完全不同(更好)的实现!

请根据您的经验帮我优化一下!

【问题讨论】:

    标签: .net excel vb.net oledb


    【解决方案1】:

    此函数以 CSV 格式写入文本文件,然后在 Excel 中打开文件并将其保存为 xlsx 格式。我用一个 53 列 x 10,000 行的表尝试了这个,花了大约 2 秒:

    Private Sub Export3(ByVal filename As String, ByRef dt As DataTable)
    
            Dim tempfile As String = Path.GetTempPath + Path.GetFileNameWithoutExtension(Path.GetTempFileName) + ".csv"
            Dim sb As StringBuilder
    
            Using sw As StreamWriter = New StreamWriter(tempfile)
                sb = New StringBuilder("")
                For c As Integer = 0 To dt.Columns.Count - 1
                    sb.Append(dt.Columns(c).ColumnName + ",")
                Next
                sw.WriteLine(sb.ToString.TrimEnd(","c))
    
                For r As Integer = 0 To dt.Rows.Count - 1
                    sb = New StringBuilder("")
                    For c As Integer = 0 To dt.Columns.Count - 1
                        sb.Append(dt.Rows(r).Item(c).ToString + ",")
                    Next
                    sw.WriteLine(sb.ToString.TrimEnd(","c))
                Next
            End Using
    
    
            Dim xlApp As Excel.Application = Nothing
            Dim xlBook As Excel.Workbook = Nothing
    
            Try
                xlApp = New Excel.Application
                'xlApp.Visible = True 'for debugging
                xlApp.DisplayAlerts = False
                xlBook = xlApp.Workbooks.Open(tempfile)
    
                xlBook.SaveAs(filename, Excel.XlFileFormat.xlWorkbookDefault)
    
                My.Computer.FileSystem.DeleteFile(tempfile)
    
            Finally
                If Not IsNothing(xlBook) Then
                    xlBook.Close()
                End If
                If Not IsNothing(xlApp) Then xlApp.Quit()
            End Try
        End Sub
    

    【讨论】:

    • 您的解决方案不同但很好。我会尝试将其包含在我的实现中。Thanks..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2014-03-20
    相关资源
    最近更新 更多