2015-06-25 99 views
1

我就需要編輯像執行各種操作Excel文件的應用程序的工作:C#的Microsoft.Office.Interop.Excel V15慢

    從工作表
  • 複製粘貼部分到工作表
  • 添加/編輯值
  • 公式和宏在後臺

這是最初使用Excel 2007中開發的應用程序,但我現在要使用Excel 2013年不幸的是跑,我注意到,這幾乎是10倍倍在安裝了Excel 2013的計算機上運行而不是Excel 2007時運行速度較慢。

因此,我創建了一個非常簡單的基準測試應用程序,它隨機生成數字並將它們寫入1000(行)* 15(列)= 15000個單元格中。

的結果是令人失望的,因爲它需要大約670毫秒到Excel 2007和3257左右運行毫秒在Excel 2013年運行(這是5倍倍慢)

請找到,讓上面的基準測試結果的代碼:

static void Main(string[] args) 
    { 
     var stopwatch = new Stopwatch(); 

     stopwatch.Reset(); 
     stopwatch.Start(); 

     var excel = new Application(); 
     excel.Visible = false; 
     excel.DisplayAlerts = false; 

     var workbooks = excel.Workbooks; 

     var workbook = workbooks.Add(Type.Missing); 
     var worksheets = workbook.Sheets; 
     var worksheet = (Worksheet)worksheets[1]; 

     WriteArray2(1000, 15, worksheet); 

     workbook.SaveAs(@"c:\temp\Speedtest.xlsx"); 

     excel.Quit(); 

     stopwatch.Stop(); 
     Console.WriteLine("Time elapsed (milliseconds): "+(stopwatch.ElapsedMilliseconds).ToString()); 
     Console.ReadLine(); 
     return; 
    } 

    private static void WriteArray2(int rows, int columns, Worksheet worksheet) 
    { 
     var data = new object[rows, columns]; 
     Random r = new Random(); 

     for (var row = 1; row <= rows; row++) 
     { 
      for (var column = 1; column <= columns; column++) 
      { 
       data[row - 1, column - 1] = r.NextDouble()*2000000-1000000; 
      } 
     } 
     var startCell = (Range)worksheet.Cells[1, 1]; 
     var endCell = (Range)worksheet.Cells[rows, columns]; 
     var writeRange = worksheet.Range[startCell, endCell]; 

     writeRange.Value2 = data; 
    } 
} 

您是否遇到過與Excel 2013類似的問題? 您是否知道我有什麼可以嘗試優化Excel 2013的?

我知道一些人在Excel 2013中提出了性能問題,但是微軟並沒有承認這是事實。

感謝您的幫助!

+0

你可以顯示緩慢的代碼? –

+0

需要多長時間? –

+0

熱啓動:在Excel 2013中運行3257毫秒,在Excel 2007中運行670毫秒。 – gpanagopoulos

回答

0

很難說如何在沒有看到任何代碼的情況下優化您的應用程序。 可能有所幫助的一種方法是不選擇單個單元格,您可以選擇一個範圍。然後你可以在你的C#代碼中遍歷數組,這比重複訪問interop快。

我不知道爲什麼2013年比2007年慢,但interos通常很慢,需要安裝Excel才能使用。出於這些原因,我傾向於避免Interops。

由於Excel電子表格只是由XML組成,所以另一種解決方案可能是使用庫自己編寫XML。

的OpenXML的圖書館顯然是一個不錯的選擇,這裏有一些有用的鏈接:

SDK - https://msdn.microsoft.com/en-us/library/office/bb448854.aspx

教程 - https://msdn.microsoft.com/en-us/library/office/hh180830%28v=office.14%29.aspx

但是我認爲在執行宏的OpenXML是很困難的。但有人設法做到這一點:https://stackoverflow.com/a/21789643/3209889

+1

感謝您的建議Magnus。我之前使用過OpenXML,可能會提供解決方案。然而,這裏的問題在於,使用Interop管理excel的層是非常成熟,經過良好測試的,並且在我們的Excel 2007服務器中執行得非常好。一旦我們將Excel升級到v2013,它就開始行爲不端。爲了改變它來嘗試OpenXML(仍然不能保證它會工作),我們將不得不花費很多時間和預算來研究,開發和測試! – gpanagopoulos

相關問題