簡體   English   中英

使用Office Interop將單元格寫入Excel的最快方法?

[英]Fastest way to write cells to Excel with Office Interop?

我正在編寫一個函數,使用VB .NET中的Office Interop將數據導出到Excel。 我目前正在使用Excel工作表的Cells()方法直接編寫單元格:

worksheet.Cells(rowIndex, colIndex) = data(rowIndex)(colIndex)

這需要很長時間才能獲得大量數據。 是否有更快的方法可以立即將大量數據寫入Excel? 用范圍做事會更快嗎?

如果可以的話,你應該避免逐個單元地讀寫。 使用數組並一次讀取或寫入整個塊更快。 我在使用C#從工作表中讀取了一段時間后寫了一篇文章; 基本上,相同的代碼以相反的方式工作(見下文),並且運行得更快,尤其是對於更大的數據塊。

  var sheet = (Worksheet)Application.ActiveSheet;
  var range = sheet.get_Range("A1", "B2");
  var data = new string[3,3];
  data[0, 0] = "A1";
  data[0, 1] = "B1";
  data[1, 0] = "A2";
  data[1, 1] = "B2";
  range.Value2 = data;

如果您還沒有,請確保在開始輸出數據之前設置Application.ScreenUpdating = false 這將使事情變得更快。 完成輸出數據后,將其設置為True。 必須重新繪制每個單元格上的屏幕需要花費大量時間,繞過此節省了這一點。

至於使用范圍,您仍然需要將1(一)個特定單元格作為值,因此我認為這里沒有任何好處。 我不知道這樣做比你在實際輸出數據方面做得更快。

只是為了補充Tommy的答案。

  • 在開始編寫之前,您可能還希望將計算設置為手動。

Application.Calculation = xlCalculationManual

完成寫作后,將其設置為自動。 (如果原始模式可能不是自動模式,則必須在將其設置為手動之前存儲該值)

Application.Calculation = xlCalculationAutomatic

  • 您還可以使用Range對象的CopyFromRecordset方法。

http://msdn.microsoft.com/de-de/library/microsoft.office.interop.excel.range.copyfromrecordset(office.11​​).aspx

從excel范圍寫入和讀取值的最快方法是Range.get_ValueRange.set_Value

方式如下:

Range filledRange = Worksheet.get_Range("A1:Z678",Missing);
object[,] rngval = (object[,]) filledRange.get_Value (XlRangeValueDataType.xlRangeValueDefault);

Range Destination = Worksheet2.get_Range("A1:Z678",Missing);
destination.set_Value(Missing,rngval);

是的,不需要迭代。 性能只是瞧!!

希望能幫助到你 !!

老實說,編寫它的最快方法是使用逗號分隔符。 使用Join(“,”)。ToString方法編寫一行字段更容易,而不是嘗試迭代單元格。 然后將文件另存為“.csv”。 使用interop,將文件作為csv打開,它將在打開時自動為您更新單元格。

如果有其他人像我這樣使用@Mathias給出的方法(這似乎是加載到Excel中最快的方法),並使用@ IMil對陣列的建議。
干得好:

'dt (DataTable) is the already populated DataTable
'myExcelWorksheet (Worksheet) is the worksheet we are populating
'rowNum (Integer) is the row we want to start from (usually 1)
Dim misValue As Object = System.Reflection.Missing.Value
Dim arr As Object = DataTableToArray(dt)
'Char 65 is the letter "A"
Dim RangeTopLeft As String = Convert.ToChar(65 + 0).ToString() + rowNum.ToString()
Dim RangeBottomRight As String = Convert.ToChar(65 + dt.Columns.Count - 1).ToString() + (rowNum + dt.Rows.Count - 1).ToString()
Dim Range As String = RangeTopLeft + ":" + RangeBottomRight
myExcelWorksheet.Range(Range, misValue).NumberFormat = "@" 'Include this line to format all cells as type "Text" (optional step)
'Assign to the worksheet
myExcelWorksheet.Range(Range, misValue).Value2 = arr

然后

Function DataTableToArray(dt As DataTable) As Object
    Dim arr As Object = Array.CreateInstance(GetType(Object), New Integer() {dt.Rows.Count, dt.Columns.Count})
    For nRow As Integer = 0 To dt.Rows.Count - 1
        For nCol As Integer = 0 To dt.Columns.Count - 1
            arr(nRow, nCol) = dt.Rows(nRow).Item(nCol).ToString()
        Next
    Next
    Return arr
End Function

限制包括僅允許26列之前需要更好的代碼來提供范圍值字母。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM