2011-07-28 18 views
1

目標實現: 想要將獲取的錶轉儲到Excel表。如何在VB.Net中優化這個簡單但複雜的實現?

我的實現:

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

此功能以CSV格式寫入文本文件,然後在Excel中打開文件並將其保存爲xlsx格式。我想這與一個53列×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 
+0

你的解決方案是不同的,但良好的.. 我將嘗試包括這在我實現.. 'Thanks..' –