27.11.2013, 08:31 | #1 |
Участник
|
Очередной импорт из Excel
Всем привет. Может уже было, решил поделиться, преобразование range из Excel в контейнер значений. Вставляем в класс ComExcelDocument_RU
X++: public Container getRangeValue(MSOfficeBookMark_RU _bookMark,int _workSheet = 1) { COM comWorkSheet, comCells, comRange, comRows,comCols, comItem; Container con, conRow; int startRow, endRow, startCol, endCol, rowCounter, colCounter; ; if (! m_comDocument) throw error(StrFmt("@DIS100401", this.getApplicationName())); comWorkSheet = this.getWorkSheet(_workSheet); comCells = comWorkSheet.cells(); comRange = this.findRange(_bookMark, _workSheet); comRows = comRange.Rows(); startRow = comRows.row(); endRow = startRow + comRows.count() - 1; comCols = comRange.columns(); startCol = comCols.column(); endCol = startCol + comCols.count() - 1; for(rowCounter = startRow; rowCounter <= endRow; rowCounter++) { conRow = conNull(); for(colCounter = startRow; colCounter <= endCol; colCounter++) { comItem = COM::createFromVariant(comCells.item(rowCounter, colCounter)); conRow += ComExcelDocument_RU::variant2Str(comItem.value()); } con = conpoke(con, conlen(con) + 1, conRow); } return con; } |
|
|
За это сообщение автора поблагодарили: S.Kuskov (3), NickMDAX (1). |
27.11.2013, 08:52 | #2 |
Участник
|
Спасибо за пример А... чем это принципиально отличается от случая, когда вложенные циклы находятся в коде импорта? Ведь в импорте все равно понадобится цикл для разбора контейнера.
|
|
27.11.2013, 09:03 | #3 |
Участник
|
Не знаю верно ли я понял. Но по моему суть в том что бы один раз обратиться к Excel, путем считывания объекта cells. + скрыта вся реализация в классе. А принципиально различий нет, я думаю. Скорость импорта средняя, но быстрее чем каждый раз к клеткам обращаться.
Еще пробовал через comVariant = range.value2(), но тут аксапта не работает с многомерными массивами. Куда проще перебирать контейнер, чем возиться с этими комами каждый раз. Ну и нужно понимать, что это не для загрузки больших данных. Ну еще есть маленький +, хавает объединенные ячейки. Последний раз редактировалось Kainix; 27.11.2013 в 09:05. |
|
27.11.2013, 10:35 | #4 |
Участник
|
Нет. В Вашем примере все то же поячеечное чтение - comCells.item(). По одной ячейке за раз. Выигрыша в производительности не будет. У Вас просто чуть другой способ идентификации ячеек и возврат полученных результатов.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|