2015-06-25 3 views
1

Я работаю над приложением, которое необходимо отредактировать файл первенствовать выполняя различные действия, например:C# Microsoft.Office.Interop.Excel v15 медленно

  • Copy Paste секции из листа для рабочего листа
  • Добавить/Редактировать значения
  • формул и макросов работать в фоновом режиме

Это приложение изначально разработан с Excel 2007, но теперь я должен использовать Excel 2013. к сожалению, я заметил, что почти в 10 раз раз медленнее при работе на машине с установленным Excel 2013, а не Excel 2007.

Поэтому я создал очень простое приложение для сравнения, которое произвольно генерирует числа и записывает их в 1000 строк (15).

Результаты неутешительны, поскольку это занимает около 670 миллисекунд, чтобы работать в Excel 2007 и около 3257 миллисекунд для работы в Excel 2013. (это 5x раз медленнее)

Пожалуйста найти код, который дает приведенные выше результаты тестов :

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, но Microsoft не признала это как факт.

Благодарим за помощь!

+0

Можете ли вы показать медленный код? –

+0

Сколько времени займет ваша цель? –

+0

Теплый запуск: 3257 миллисекунд для запуска в Excel 2013 и 670 миллисекунд для запуска в Excel 2007. – gpanagopoulos

ответ

0

Сложно сказать, как вы можете оптимизировать свое приложение, не видя никакого кода. Одним из способов, который может помочь, является выбор отдельных ячеек, вы можете выбрать диапазон. Затем вы можете перебирать массив в вашем коде C#, который быстрее, чем многократный доступ к взаимодействию.

Я не уверен, почему 2013 год медленнее 2007 года, но interops обычно довольно медленны и требуют, чтобы 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 раньше и мог бы дать решение. Однако проблема заключается в том, что уровень управления excel с помощью Interop очень зрелый, хорошо протестирован и отлично работает на нашем сервере с Excel 2007. Как только мы обновили Excel до версии v2013, он начал плохо себя вести. Чтобы изменить его, чтобы попробовать OpenXML (по-прежнему нет гарантии, что он будет работать), нам придется тратить много времени и средств на исследования, разработку и тестирование! – gpanagopoulos

Смежные вопросы