Есть веб проект, все что он делает, это открывает Excel Application, некую таблицу, и проходит по строкам, столбцам, начитывает ячейки.
Область размером 25x20, т.е. 500 ячеек, он обрабатывает около 30 сек, что по моему, очень много, думаю что обращаюсь к Excel "как то не так". Мой комп Celeron 1.7Ghz, 512Mb. Код приведен ниже, подскажите плиз, в чем моя вина?
for(int i = 1; i < 25; i++)
{
for(int j = 1; j < 20; j++)
{
TableCell cell = new TableCell();
Excel.Range myExcelCell = ((Excel.Range)shit.Cells[i,j]);
//Тут еще есть запись в файл, но на скорость она особо не влияет, проверял.
}
}
excel.ScreenUpdating = true;
Навскидку пара вариантов:
1. Открываешь книгу, в книге в какой-либо ячейке записываешь суммирующую формулу, считываешь значение из этой ячейки, закрываешь без сохранения.
2. Использовать не два цикла, а определить Range и бежать по нему циклом for each. Может будет побыстрее.
По поводу певого варианта, не совсем понял...
Можно поподробнее?
Зараннее — спасибо!
A>Здравствуйте, _Michail, Вы писали:
A>Навскидку пара вариантов: A>1. Открываешь книгу, в книге в какой-либо ячейке записываешь суммирующую формулу, считываешь значение из этой ячейки, закрываешь без сохранения. A>2. Использовать не два цикла, а определить Range и бежать по нему циклом for each. Может будет побыстрее.
Здравствуйте, _Michail, Вы писали:
_M>Здравствуйте, alsadykov, Вы писали:
_M>По поводу певого варианта, не совсем понял... _M>Можно поподробнее? _M>Зараннее — спасибо!
По поводу первого варианта я немного поторопился — он годится только если тебе надо чего-то подсчитать. В этом случае в некую ячейку вставляешь не число или текст, а формулу типа =СУММ(F34:G40) (ну или какую-надо функцию, их там как у дурачка фантиков). Причем формула задается через свойство formulaR1C1: Worksheets("Sheet1").Range("B1").FormulaR1C1 = "=SQRT(R1C1)"
Ок, спасибо, пока попробую второй.
A>Здравствуйте, _Michail, Вы писали:
_M>>Здравствуйте, alsadykov, Вы писали:
_M>>По поводу певого варианта, не совсем понял... _M>>Можно поподробнее? _M>>Зараннее — спасибо!
A>По поводу первого варианта я немного поторопился — он годится только если тебе надо чего-то подсчитать. В этом случае в некую ячейку вставляешь не число или текст, а формулу типа =СУММ(F34:G40) (ну или какую-надо функцию, их там как у дурачка фантиков). Причем формула задается через свойство formulaR1C1: Worksheets("Sheet1").Range("B1").FormulaR1C1 = "=SQRT(R1C1)"
Можешь дать маленький пример по второму варианту?
A>Здравствуйте, _Michail, Вы писали:
A>Навскидку пара вариантов: A>1. Открываешь книгу, в книге в какой-либо ячейке записываешь суммирующую формулу, считываешь значение из этой ячейки, закрываешь без сохранения. A>2. Использовать не два цикла, а определить Range и бежать по нему циклом for each. Может будет побыстрее.
Здравствуйте, _Michail, Вы писали:
_M>Привет Всем!
_M>Есть веб проект, все что он делает, это открывает Excel Application, некую таблицу, и проходит по строкам, столбцам, начитывает ячейки. _M>Область размером 25x20, т.е. 500 ячеек, он обрабатывает около 30 сек, что по моему, очень много, думаю что обращаюсь к Excel "как то не так". Мой комп Celeron 1.7Ghz, 512Mb. Код приведен ниже, подскажите плиз, в чем моя вина?
Если тебе критична скорость, забери данные через clipboard — все будет летать.
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Скорость критична.
Можешь дать маленький екзампл, как забрать данные через clipboard, и как потом пробежаться по ячейкам?
Заранее — спасибо!
EM>Здравствуйте, _Michail, Вы писали:
_M>>Привет Всем!
_M>>Есть веб проект, все что он делает, это открывает Excel Application, некую таблицу, и проходит по строкам, столбцам, начитывает ячейки. _M>>Область размером 25x20, т.е. 500 ячеек, он обрабатывает около 30 сек, что по моему, очень много, думаю что обращаюсь к Excel "как то не так". Мой комп Celeron 1.7Ghz, 512Mb. Код приведен ниже, подскажите плиз, в чем моя вина?
EM>Если тебе критична скорость, забери данные через clipboard — все будет летать.
Тот же вопрос, немного с другой стороны, Excel это область неуправляемого кода,
есть ли возможность перенести часть ее(диапазон ячеек), на нашу сторону, т.е. в массив скажем?
В этом случае я имею только массив Value2, мне еще нужну знать Text, формат ячейки, бордюры и т.д.
Если я делаю
(object[,])((Excel.Range)shit.get_Range(excel.Cells[1, 1], excel.Cells[25, 10])).Text к примеру, валиться
System.InvalidCastException: Specified cast is not valid.
Здравствуйте, _Michail, Вы писали:
_M>Здравствуйте, Chupa_Kabra, Вы писали:
_M>В этом случае я имею только массив Value2, мне еще нужну знать Text, формат ячейки, бордюры и т.д. _M>Если я делаю _M>(object[,])((Excel.Range)shit.get_Range(excel.Cells[1, 1], excel.Cells[25, 10])).Text к примеру, валиться _M>System.InvalidCastException: Specified cast is not valid.
Ах, дак вам еще и форматирование нужно ... Можно попробовать по аналогии, но с этим я не возился.
А валится у вас совершенно правильно, с какого перепуга вы дергаете свойство Text ?
Это массив элементов, один раз его получили, потом делайте свой вложенный цикл и обращайтесь не через interop, а к этому массиву, по скорости разница существенная.
Все хотят хорошо провести время, но время не проведешь !
Здравствуйте, Chupa_Kabra, Вы писали:
C_K>Ах, дак вам еще и форматирование нужно ... Можно попробовать по аналогии, но с этим я не возился. C_K>А валится у вас совершенно правильно, с какого перепуга вы дергаете свойство Text ? C_K>Это массив элементов, один раз его получили, потом делайте свой вложенный цикл и обращайтесь не через interop, а к этому массиву, по скорости разница существенная.
Мне нужно иметь доступ ко всем свойствам ячеки, те что предоставлят Excel.Range, с вариантом Value2 все работает чудесно и быстро, так же кроме Value2 работает FormulaXXXX, но это по моему все...
Почему нельзя получить в свой локальный массив или переменную, Range? И обращяться к этому массиву?
Вся задача то сводиться к тому, что нужно БЫСТРО пробежаться по диапазону ячеек, и полчуть 5-6 свойств, ну не верю я что это невозможно!
Здравствуйте, _Michail, Вы писали:
_M>Здравствуйте, Chupa_Kabra, Вы писали:
C_K>>Ах, дак вам еще и форматирование нужно ... Можно попробовать по аналогии, но с этим я не возился. C_K>>А валится у вас совершенно правильно, с какого перепуга вы дергаете свойство Text ? C_K>>Это массив элементов, один раз его получили, потом делайте свой вложенный цикл и обращайтесь не через interop, а к этому массиву, по скорости разница существенная.
_M>Мне нужно иметь доступ ко всем свойствам ячеки, те что предоставлят Excel.Range, с вариантом Value2 все работает чудесно и быстро, так же кроме Value2 работает FormulaXXXX, но это по моему все... _M>Почему нельзя получить в свой локальный массив или переменную, Range? И обращяться к этому массиву?
_M>Вся задача то сводиться к тому, что нужно БЫСТРО пробежаться по диапазону ячеек, и полчуть 5-6 свойств, ну не верю я что это невозможно!
Просто основная идея была минимизировать число обращений к екселю.
На крайний случай попробуйте foreach вызвать. Возможно перебор ячеек будет делаться быстрее, хотя опыт работы с экселем показывает, что достоверно не знаешь, где найдешь где потеряешь
Все хотят хорошо провести время, но время не проведешь !
Скорость обработки Excel таблицы.
От:
Аноним
Дата:
20.04.05 07:13
Оценка:
Можно получить нужный Excel.Range, где хранятся данные, и взять у него Value2, в котором будет object[,] с данными. Это гораздо быстрее чем бегать по отдельным ячейкам.
>Тот же вопрос, немного с другой стороны, Excel это область неуправляемого кода,
есть ли возможность перенести часть ее(диапазон ячеек), на нашу сторону, т.е. в массив скажем?
Так Вам же говорят — возьмите Range и у него в Value2 будет массив object[,]