Как оптимизировать эту простую, но сложную на вид реализацию в VB.Net? - PullRequest
1 голос
/ 28 июля 2011

Цель достижения: Хотите сбросить извлеченную таблицу на лист 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 и только что начал работать. Но ..

Мне кажется, это очень неэффективно и неубедительно.

Итак, вы можете помочь уменьшить сложность и повысить производительность?

Совершенно другая (лучшая) реализация приветствуется!

Пожалуйста, помогите мне оптимизировать это ... с вашим опытом!

1 Ответ

1 голос
/ 29 июля 2011

Эта функция записывает в текстовый файл в формате CSV, а затем открывает файл в Excel и сохраняет его в формате xlsx.Я попытался сделать это с таблицей 53 x 10000 столбцов, и это заняло ~ 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
...