Цитата:
Сообщение от
Владимир Максимов
Кстати, может просто "мусор" остался в буфере обмена после последнего 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);
Последовательность действий такова:
- подгружаю шаблон xlt
- открываю лист шаблон
- копирую его
- далее начинаю заполнять новый лист данными с помощью TextBuffer
Ошибка появляется даже если 1 лист добавить копированием и попытаться туда что-то записать.
Если вставлять новые строки по одной то время выгрузки увеличивается в разы.
Насчет вставки строк - я вроде так и делаю
X++:
COM worksheets,
sheet,
newsheet,
range,
rows,
newRows,
cell;
TextBuffer tb;
Table1 table1;
Table2 table2;
int curRow,
numRows;
;
//загрузка шаблона
GridExcel.XMLURL("S:\\testSpreadSheet.xml");
worksheets = GridExcel.Worksheets();
//выделем нужную строчку на шаблоне
sheet = worksheets.Item(1);
range = sheet.Range("A9:F9");
curRow = 9;
//подсчитываем кол-во необходимых для вставки строк
select count(recid) from table1;
numRows = table1.RecId;
if( numRows <= 1 )
{
return;
}
//вставляем строки
rows = sheet.Rows();
newRows = rows.Item( strfmt("%1:%2", curRow + 1,NumRows + curRow) ); //вставляем после выделенной строки
newRows.Insert();
//копируем нужный формат
newRows = rows.Item( strfmt("%1:%2", curRow + 1,NumRows + curRow) ); //куда будем копировать форматирование
rows = range.EntireRow(); //откуда будем копировать форматирование
rows.copy( newRows );