![]() |
#4 |
Участник
|
Кстати, может просто "мусор" остался в буфере обмена после последнего tb.toClipboard()? В смысле, первая команда rows.copy() пытается скрестить "ежа и ужа". Часть буфера от Windows загнанный в tb.toClipboard() и часть буфера от OWC через rows.copy()
Попробуй сначала сделать оба листа и только потом наполнять их данными через tb.toClipboard() + range.paste() Я бы еще поэкспериментировал с копированием без параметра. Т.е. через буфер обмена. X++: // Выделяю образцовую строку bookMark = int2str(_rowTemplate) + ":" + int2str(_rowTemplate); range = sheet.range(bookMark); // Копирую ее содержимое со всеми форматами в буфер обмена range.copy(); // Вставляю из буфера обмена в строку ниже (под выделенной) range.insert(#xlDown); X++: /* Вставка указанного количества строк, как копии одной строки шаблона _rowTemplate - номер строки, которая будет размножена (скопирована) _rowsInsert - количество строк, вставляемых ПОД указанной строкой шаблона При вставке указанным способом "раздвигается" диапазон ячеек для суммирования если вставка выполняется "внутри" диапазона формулы Для сохранения суммирования в шаблоне надо делать минимум 2 строки "деталей" (чтобы была возможность указать диапазон в формуле), а вставку выполнять после второй строки "деталей", используя эту вторую строку как шаблон */ void insertRowsAsCopy(Row _rowTemplate, Row _rowsInsert) { MSOfficeBookMark_RU bookMark; SysExcelRange sysExcelRange; Row currentRow, insertedRows; ; if (_rowsInsert < 2) { return; } // Итерационный цикл // Вставляю сначала 1, потом 2, 4, 8 и т.п. строк на последнем шаге вставляю остаток строк currentRow = 1; while (currentRow < _rowsInsert) { if (currentRow * 2 <= _rowsInsert) { insertedRows = currentRow; currentRow += insertedRows; } else { insertedRows = _rowsInsert - currentRow; currentRow = _rowsInsert; } bookMark = int2str(_rowTemplate) + ":" + int2str(_rowTemplate + insertedRows - 1); sysExcelRange = this.range(bookMark); sysExcelRange.copy(); sysExcelRange.insert(#xlDown); } // while (currentRow < _rowsInsert) /* // Прямая вставка указанного количества // По времени одинаков с итерационным циклом, но имеет недостатки // 1) Нужно физическое наличие необходимого количества пустых строк // 2) В качестве "конца листа" (последней использованной ячейки) будет удвоенное количество вставляемых строк // т.е. переход по Ctrl+End выбросит далеко за конец информационной части отчета // Выделяю нужное количество строк ПОД итоговой строкой bookMark = int2str(_rowTemplate+1)+":"+int2str(_rowTemplate+1+_rowsInsert-1); sysExcelRangeSource = this.range(bookMark); sysExcelRangeSource.comObject().cut(); // Вставляю выделенные строки перед второй строкой bookMark = int2str(_rowTemplate)+":"+int2str(_rowTemplate); sysExcelRangeTarget = this.range(bookMark); sysExcelRangeTarget.insert(#xlDown); // Выделяю образцовую строку bookMark = int2str(_rowTemplate)+":"+int2str(_rowTemplate); sysExcelRangeSource = this.range(bookMark); // Копирую образцовую строку со всеми формулами во вновь добавленные строки bookMark = int2str(_rowTemplate)+":"+int2str(_rowTemplate+_rowsInsert-1); sysExcelRangeTarget = this.range(bookMark); sysExcelRangeSource.comObject().copy(sysExcelRangeTarget.comObject()); */ }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
Теги |
errors, spreadsheet |
|
|