12.05.2012, 14:11 | #21 |
Участник
|
Цитата:
Тогда, судя по всему, придётся сравнить производительность обоих способов и выбрать наиболее подходящий в данном случае. Спасибо Вам, Gustav, за совет. |
|
12.05.2012, 14:18 | #22 |
Moderator
|
Цитата:
Поговорим об ADO и Поговорим об MS Script Control. |
|
|
За это сообщение автора поблагодарили: serg.epshtein (1). |
12.05.2012, 16:11 | #23 |
Участник
|
Сделал программное копирование через copy()/paste(). Действительно, после 32766 объединений paste() уже не может скопировать объединенные ячейки. Хотя и ошибок не выдает.
X++: static void Job_Test(Args _args) { Form form = new Form(); Args args = new Args(); FormRun formRun; FormActiveXControl ss; COM worksheet; COM range; COM rangeSource; COM rangeTarget; COM cells; int i; int maxI; int timeNowBegin = timeNow(); SysOperationProgress progress; ; form.addDesign('Design'); args.object(form); formRun = classFactory.formRunClass(args); formRun.init(); formRun.design().caption('Табличный процессор'); ss = formRun.design().addControl(FormControlType::ActiveX, 'Spreadsheet'); //ss.className('{0002E541-0000-0000-C000-000000000046}'); // Microsoft Office Spreadsheet 10.0 ss.className('{0002E559-0000-0000-C000-000000000046}'); // Microsoft Office Spreadsheet 11.0 ss.heightMode(FormHeight::ColumnHeight); ss.widthMode(FormWidth::ColumnWidth); range = ss.Range('A1'); worksheet = range.Parent(); cells = worksheet.Cells(); // Объединение ячеек в первой строке range = ss.Range(cells.Item(1,1),cells.Item(1,2)); range.Merge(); // Первую строку указываю как источник для последующего копирования rangeSource = ss.Range('1:1'); rangeSource.copy(); #AviFiles //maxI = 20; //maxI = 32767; maxI = 33000; //maxI = 36409; //maxI = 37000; progress = new SysOperationProgress(); progress.setAnimation(#aviStopwatch); progress.setTotal(maxI); progress.setCaption("Проверка объединения"); progress.setText("Подготовка..."); progress.update(true); for (i=2; i<=maxI; i++) { progress.setText(strFmt("Осталось %1 из %2", maxI - i + 1, maxI)); progress.incCount(); // Копирую в текущую строку "образцовую" строку rangeTarget = ss.Range(strFmt('%1:%1',i)); rangeTarget.paste(); // Запись значения // range = ss.Range(cells.Item(i,1),cells.Item(i,2)); range = ss.Range('A'+ int2str(i)); range.Value2(i); } info("Время выполнения " + time2str(timeNow()-timenowBegin,1,1)); formRun.run(); formRun.wait(); } PS: Где-то в районе 36400 строк OWC съедает всю доступную (ему) память и начинаются дикие торомоза. Так что, думаю, при работе с OWC вообще не стоит использовать такое количество строк. Даже если бы и не было никаких ошибок
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
Теги |
excel, merge, owc, spreadsheet |
|
|