11.05.2006, 09:58 | #1 |
Программатор
|
Параметры pastespecial()
Доброго времени суток!
Экспортирую в Эксель (2003) через copy(), pastespecial().Мне необходимо чтобы вставлялись в Эксель только значения. Задаю параметр pastespecial(-4163) на что Аксапта выдает ошибку : Метод 'pastespecial' в COM-объекте класса '_Worksheet' возвратил код ошибки 0x80010105 (<неизвестно>), который означает: <неизвестно>. Создавал в экселе макрос - параметр верен. в чём проблема подскажите пожалуйста. Заранее благодарен - Sada... |
|
11.05.2006, 10:36 | #2 |
Administrator
|
Не вдаваясь в подробности (хорошо было бы посмотреть как все вызывается - строчку кода) - хочу спросить - цифрку -4163 облачаете в ComVariant::createFromInt(-4163) ?
__________________
Возможно сделать все. Вопрос времени |
|
11.05.2006, 10:56 | #3 |
Программатор
|
sheet.pastespecial(-4163);
что самое интересное нашол в одном классе тоже самое, там работает а тут нет... барабашка. sheet типа COM. |
|
11.05.2006, 11:23 | #4 |
Moderator
|
А вот это не поможет? http://www.axforum.info/forums/showt...1761#post51761
там применяется конструкция: TextBuffer.toClipboard(); worksheet.pastespecial(1); |
|
11.05.2006, 12:08 | #5 |
Участник
|
А почему параметр целое?
Метод pastespecial() есть у двух объектов: Range и WorkSheet Для Range первым параметром передается значение enum'а XlPasteType Судя по вашему коду это - xlPasteValues = 0xFFFFEFBD (-4163) Для WorkSheet - строка, указывающая на формат данных в Clipboard'е. Причем для русской и английской версий Excel она будет различаться. Для русской будет, например "Текст" или "Текст в кодировке Unicode". Передавать этот параметр надо ч/з COMVariant::CreateFromString() Судя по имени sheet COM объект у вас имеет тип WorkSheet и вызвать надо так X++: sheet.PasteSpecial(COMVariant::CreateFromString("Текст"));
__________________
Axapta v.3.0 sp5 kr2 |
|
11.05.2006, 13:05 | #6 |
Moderator
|
Нашёл у себя в джобах пример. Когда-то баловался. Однако, работает...
X++: static void PasteSpecial_DemoJob(Args _args) { TextBuffer txtb = new TextBuffer(); EmplTable emplTable; int row; COM xlApp; // Excel.Application COM wbks, wbk; // Workbooks, Workbook COM wkss, wks; // Worksheets, Worksheet COM rng, rngCR, cell; // все Range ; xlApp = new COM('Excel.Application'); wbks = xlApp.Workbooks(); wbk = wbks.Add(); wkss = wbk.Worksheets(); wks = wkss.Item(1); for (row = 1; row <= 5; row += 1) // выводит 5 копий таблицы emplTable { txtb.setText(''); while select emplTable order by Name { txtb.appendText(emplTable.Name ); txtb.appendText('\t'); txtb.appendText(emplTable.PhoneLocal ); txtb.appendText('\t'); txtb.appendText(emplTable.EmplId ); txtb.appendText('\t'); txtb.appendText(emplTable.CellularPhone); txtb.appendText('\t'); txtb.appendText(emplTable.UserId ); txtb.appendText('\t'); txtb.appendText('\r\n'); } txtb.toClipboard(); rng = wks.Range('A'+int2str(row*1000)); // каждую копию списка начинаем с очередной 1000-й строки Excel rng.PasteSpecial(1); } xlApp.Visible(true); } |
|
11.05.2006, 13:21 | #7 |
Программатор
|
Суть проблемы была в следующем: вывожу в Эксель данные и навожу затем красоту. итоги жирным шрифтом, сетку накладываю и все такое (в общем чтоб глаз и начальство радовало). но copy()/paste() всю эту красоту затирает. Создал макрос в Экселе, посмотрел что будет если использовать PasteSpecial(). Параметр -4163 меня вполне устроил, я даже нашол место где это работает именно с этим параметром. Но вываливалась выше указанная ошибка. После кучи проб и ошибок, поставив PasteSpecial(2), моя красота перестала затираться и нармально рисуется. Как так - Бог его знает, но на данный момент меня это вполне устроило. Всем спасибо за активное усастие
P.S.:Хотя почему ошибка я так и не понял... |
|
11.05.2006, 14:43 | #8 |
Участник
|
Стрелять хелпописателей.
Для WorkSheet параметр Format в методе PasteSpecial() может иметь как текстовый, так и целочисленный тип. Константы, используемые в методе PasteSpecial() объекта WorkSheet xlAll = 1 xlFormulas = 2 xlValues = 3 xlFormats = 4 xlPasteComments = 5 xlDataValidation = 6 xlAllExceptBorders = 7 xlColumnWidths = 8 При этом надо учитывать, что если использовать эти константы, кроме xlAll, то необходимо, чтобы ячейки были скопированы непосредственно из Excel с помощью Range.Copy
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Logger (1), sashanka (1). |
11.05.2006, 17:15 | #9 |
Moderator
|
Цитата:
Сообщение от AndyD
Стрелять хелпописателей.
Даешь ADO и CopyFromRecordset ! Sada, Вы вроде собирались заняться (http://www.axforum.info/forums/showthread.php?p=102277#post102277) или мне показалось? |
|
12.05.2006, 05:21 | #10 |
Программатор
|
2Gustav: Не показалось, просто надо было кое что добавить в старый и переписывать выгрузку - времени нет, да и лень.... А ADO скоро будет мной побеждено
А про pastespecial() - ну да... в музей... тут в АОТе и не такое увидишь (особенно мне нравится стандарная выгрузка).Еще раз всем спасибо... С уважением - Sada... |
|