Возможно то, о чем я здесь напишу и так все знают, но я столкнулся с некоторыми проблемами при использовании данного метода.
1) Если в качестве параметра передается объект TextBuffer в который вообще ничего не записано (не пустая строка, а именно вообще ничего), то получим исключение на команде PastSpecial. Поэтому стоит добавить проверку на размер TextBiffer
2) Насколько я понимаю, логика работы с буферами в Windows примерно следующая: если в данный момент осуществляется заполнение буфера обмена, то команда, данная из другого приложения на заполнение буфера обмена будет проигнорирована.
На практике, это означает примерно следующее:
-) Пользователь запустил отчет и пока отчет готовит данные переключился на другое приложение.
-) В этом другом приложении он дал команду на копирование буфера (Ctrl+C)
-) В этот момент AXAPTA начала выполнять метод insertText() и попытка что-то добавить в буфера обмена была отвергнута
-) Последующая команда PastScpecial вызвала исключение и отчет не был сформирован
В качестве решения, я "зациклил" попытку вставки. В результате, получился примерно такой код
Код:
public void insertText(BookMark _bookMark, TextBuffer _text, int _workSheet = 1)
{
COM XLSWorkSheet, XLSrange;
TextBuffer tempBuffer; // To store clipboard contents
int nextI,
maxI = 3;
;
// Если содержимое TextBuffer вообще не введено, то PastSpecial даст ошибку,
// а если заведена пустая строка, то нет смысла делать PastSpecial
if (! _text.size())
{
return;
}
// Initializing XLSWorkSheet object
XLSWorkSheet = this.getWorkSheet(_workSheet);
if (!XLSWorkSheet)
{
throw error("@DIS6043");
}
// Initializing XLSRange object
XLSrange = this.findRange(_bookMark,_workSheet);
if (!XLSrange)
{
throw error("@SYS27391");
}
XLSrange.select();
for (nextI = 1; nextI <= maxI; nextI++)
{
try
{
// Storing clipboard contents
tempBuffer = new TextBuffer();
tempBuffer.fromClipboard();
// Preparing text to be inserted
_text.toClipboard();
// Inserting text from clipboard
XLSWorkSheet.pasteSpecial(1); // 1 - "Text only" mode
// Restoring clipboard contents
tempBuffer.toClipboard();
// В случае успеха, прерываю цикл
break;
}
catch(Exception::Error)
{
// в случае ошибки удаляю последнюю строку infolog,
// которая генерится автоматически ошибкой COM
if (infolog.line())
{
infolog.clear(infolog.line()-1);
}
// предпринимаю очередную попытку сделать вставку через буфер
}
} // for (nextI)
// Если выход из цикла for произошел "штатно", то значение счетчика будет больше максимально допустимого значения
if (nextI > maxI)
{
throw error("Ошибка при копировании данных через буфер обмена.");
}
}