2010-06-22 66 views
13

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

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

這對於大量數據需要很長時間。有沒有更快的方法來一次寫入大量的數據到Excel?做範圍會更快嗎?

+0

這近乎重複有廣泛的答案:http://stackoverflow.com/questions/3840270/fastest-way-to-interface-between-live-unsaved-excel-data-and-c-sharp-objects。 – Govert 2011-11-10 07:20:47

回答

28

如果可以的話,您應該避免逐個讀寫細胞。使用數組可以更快,並且可以一次讀取或寫入整個塊。我寫了一篇帖子,回到reading from worksheets using 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; 
+1

我無法在您的博客上留言,所以讓我在這裏寫下。您可以使用CreateInstance方法在C#中創建一個基於1的數組: var arr =(object [,])Array.CreateInstance(typeof(object),new int [] {2,3),new int [] {1 ,1}) – IMil 2013-12-04 06:09:01

10

如果您尚未開始輸出數據,請務必設置Application.ScreenUpdating = false。這會讓事情變得更快。輸出完數據後,將其設置回True。不得不在每個單元格上重新繪製屏幕會花費很多時間,繞過這一點可以節省時間。

至於使用範圍,你仍然需要針對一個特定單元格的值,所以我在這裏看不到任何好處。我不知道這樣做比實際輸出數據的速度要快。

5

只是添加到湯米的答案。

  • 您可能還想在開始編寫之前將計算設置爲手動。

Application.Calculation = xlCalculationManual

,並將其設置回自動當你與你的寫作完成。 (如果有一個機會,原來的模式可能已經不是自動其他任何東西,你將它設置爲手動之前存儲的值)

Application.Calculation = xlCalculationAutomatic

  • 你也可以使用Range對象的CopyFromRecordset方法。

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

2

老實說,寫它的最快方法是使用逗號分隔符。使用Join(「,」).ToString方法而不是試圖遍歷單元格來寫一行字段會更容易。然後將該文件保存爲「.csv」。使用interop,以csv打開文件,打開後會自動爲你做單元更新。

+3

如果速度是你所追求的,那麼這就是要走的路,但是特別是在字符串和特殊字符周圍有陷阱 – 2010-09-10 06:10:15

+0

如果你想用公式編寫,這個工作是否可行? – 2012-09-18 18:16:49

3

從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); 

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

希望它有幫助!

0

如果有其他人像我一樣來找@ @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 

然後

限制包括只允許26列之前,它需要更好的代碼能想出的範圍值字母。

相關問題