使用Office Interop将单元格写入Excel的最快方法?

我正在写一个函数来使用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。 不得不在每个单元格上重画屏幕需要花费很多时间,绕过这个可以节省时间。

至于使用范围,你仍然需要将一个特定单元格作为一个值,所以我没有看到任何好处。 我不知道这样做比实际输出数据要快。

只是增加汤米的答案。

  • 在开始写作之前,您可能还想将计算设置为手动。

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打开文件,打开后会自动为你做单元更新。

如果有其他人像我一样寻找一个完整的解决scheme,使用@Mathias给出的方法(这似乎是加载到Excel中最快的方法)@IMil的build议在arrays上。
干得好:

 '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列,因此需要更好的代码来提供范围值字母。