2015-12-16 8 views
4

Мне нужно быстро поменять ячейки Excel. Я нашел аналогичный метод для записи в ячейки Excel, который для меня очень быстрый, поэтому я попытался применить тот же метод при окрашивании ячеек. Рассмотрим следующий код:Экранная клавиатура Excel Interop, использующая диапазон

xlRange = xlWorksheet.Range["A6", "AS" + dtSchedule.Rows.Count]; 

double[,] colorData = new double[dtSchedule.Rows.Count, dtSchedule.Columns.Count]; 
for (var row = 0; row < dtSchedule.Rows.Count; row++) 
{ 
    for (var column = 0; column < dtSchedule.Columns.Count; column++) 
    { 
     if (column <= 3) 
     { 
      colorData[row, column] = GetLightColor2("#ffffff"); 
      continue; 
     } 


     if (dtSchedule.Rows[row][column].ToString() != "#000000" && !string.IsNullOrEmpty(dtSchedule.Rows[row][column].ToString())) 
     { 
      string[] schedule = dtSchedule.Rows[row][column].ToString().Split('/'); 
      string color = schedule[0].Trim(); 

      colorData[row, column] = GetLightColor2(color); 
      continue; 
     } 

     colorData[row, column] = GetLightColor2("#000000"); 
    } 
} 

xlRange.Interior.Color = colorData; 

Это функция GetLightColor2:

private double GetLightColor2(string hex) 
{ 
    return ColorTranslator.ToOle(ColorTranslator.FromHtml(hex)); 
} 

Когда я запускал код, ошибка была брошена

xlRange.Interior.Color = colorData; 

со следующей ошибкой:

System.Runtime.InteropServices.COMException (0x80020005): Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH)) at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData) at Microsoft.Office.Interop.Excel.Interior.set_Color(Object value)

I coul d не найти никакого другого обходного пути, если не окрашивать ячейку, перейдя через каждую ячейку, которая действительно медленная. Или это то, что я делаю это неправильно.

Благодарим вас за внимание.

+2

Попробуйте использовать ClosedXML его проще, чем Interop, Эта ссылка может помочь https://closedxml.codeplex.com/wikipage?title=Selecting%20Columns&referringTitle=Documentation –

+0

подписаться на советы Akhil R Джея. У Interop есть много недостатков, включая проблемы с производительностью и резидентные процессы после работы с ним. Не рекомендуется использовать его на стороне сервера. – Alexei

+0

Я не думаю, что есть способ, а не как трюк с настройкой значений с помощью double [,] - попробуйте записать макрос excel, чтобы увидеть метод, используемый VBA при окрашивании диапазона ячеек и преобразовании его в C# –

ответ

0

Если у вас не вопрос о excel addin, я настоятельно рекомендую следовать совету Akhil R J. Это не последняя большая проблема, с которой вы столкнетесь в interop, эта технология - всего лишь одна большая проблема и ошибка. Если по какой-то причине вы не можете, я могу рассказать вам кое-что о вашей проблеме:

1) Невозможно делать то, что вы хотите, используя массивы. Это возможно только для значений и формул.

2) Установите Application.ScreenUpdating = false, когда вы устанавливаете цвета или любую другую операцию с помощью excel. Затем он замораживает ввод пользователя, все идет быстрее.

3) Если многие ячейки имеют один и тот же цвет - используйте Application.Union, чтобы сделать диапазон от отдельных ячеек одного цвета. Но он эффективен только для слияния до 50 ячеек за один раз. Если вы берете больше, операция слияния занимает слишком много времени, и это не эффективно. После этого просто установите один цвет для всего объединенного диапазона. Довольно эффективно, примерно в 5-10 раз быстрее в моем случае.

4) Есть другой способ, сложный. Я сам попытаюсь попробовать эту проблему (у меня есть добавление, поэтому я не могу просто начать использовать OpenXML). Используя interop, вы можете скопировать целевой диапазон в буфер обмена Windows. В буфере обмена он хранится во многих форматах, включая что-то вроде OpenXMl-like. Таким образом, вы можете редактировать его в буфере обмена и вставлять обратно, снова используя interop. Я думаю, что это самый быстрый способ, но для написания этого кода должно быть очень много времени.

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