29.03.2011, 17:57 | #1 |
Модератор
|
Вставка в Excel из TextBuffer. Кодировка
При вставке в Excel через excelDocument.insertText
Слова на русском языке превращаются в знаки вопроса (?????? ????) При трассировке, в текстовом буфере слова нормально видны. В чем нюанс? P.S. Буфер собирается через strfmt X++: textBuffer textBuffer = new TextBuffer(); int workSheet = 1; ................. textbuffer.appendText( strfmt("%1\t%2\t%3\t%4\t%5\t%6\r\n", bankAccountTable.Name, ........ ................. excelDocument.insertText("A3", textbuffer, workSheet);
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
|
За это сообщение автора поблагодарили: NataLee (1). |
29.03.2011, 18:07 | #2 |
Модератор
|
Данный глюк наблюдается при раскладке клавиатуры EN
При значение RU, все нормально. Что то такое уже было, может напомните, где почитать?
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
|
За это сообщение автора поблагодарили: invise (0). |
29.03.2011, 18:26 | #3 |
Moderator
|
Вроде, RU должно быть и в Аксапте (перед загрузкой в буфер), и в Excel перед вставкой в таблицу. Любые другие комбинации приводят к кракозябрам (наверное, и к "вопросикам" тоже).
|
|
29.03.2011, 18:27 | #4 |
MCP
|
По-моему все дело в текущем языке системы. Он должен совпадать с языком вставляемого текста
P.S. Чтобы решить проблему, перед вставкой надо проверять язык раскладки клавиатуры, если он EN - программно переключать в RU. Другого решения мне найти не удалось. Последний раз редактировалось kornix; 29.03.2011 в 18:30. |
|
29.03.2011, 18:34 | #5 |
Модератор
|
Цитата:
Цитата:
Цитата:
Сообщение от AndyD
По поводу переключения раскладки - можно не заморачиваться с ней, а воспользоваться PasteSpecial
X++: COMExcelDocument_RU excel = new COMExcelDocument_RU(); TextBuffer tb = new TextBuffer(); COM Doc; COM app; COM sheet; COM cell; ; excel.newFile(); doc = excel.getComDocument(); app = doc.Application(); sheet = app.ActiveSheet(); cell = sheet.Range("B2"); cell.Select(); tb.setText("Строка1\tКолонка2\nСтрока2\tКолонка2\nСтрока3\tКолонка2\nСтрока4\tКолонка2"); tb.toClipboard(); sheet.PasteSpecial(COMVariant::createFromStr("Текст")); P.S. Хм, замутить смену раскладки через API или забить на производительность
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
|
За это сообщение автора поблагодарили: Gustav (1). |
29.03.2011, 18:36 | #6 |
MCP
|
Лучше сменить раскладку через API
|
|
29.03.2011, 18:36 | #7 |
Участник
|
__________________
Sergey Nefedov |
|
29.03.2011, 18:37 | #8 |
Участник
|
Посмотрите
http://forum.mazzy.ru/index.php?showtopic=385 Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) pasteSpecial(1) - реально помогает. Ему не важен текущий язык системы. Кроме того 1 - числовая константа. не зависит от языка установленного MS Office (в отличие от строковых параметров) Последний раз редактировалось Logger; 29.03.2011 в 18:39. |
|
29.03.2011, 18:47 | #9 |
Модератор
|
Цитата:
Сообщение от Logger
Посмотрите
http://forum.mazzy.ru/index.php?showtopic=385 ........................... pasteSpecial(1) - реально помогает. Ему не важен текущий язык системы. Кроме того 1 - числовая константа. не зависит от языка установленного MS Office (в отличие от строковых параметров) Цитата:
Сообщение от Poleax
При вставке в Excel через excelDocument.insertText
Слова на русском языке превращаются в знаки вопроса (?????? ????) При трассировке, в текстовом буфере слова нормально видны. Цитата:
P.S. Windows Server 2008 R2 64 Rus, Ax 2009 SP1 EE RU5
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. Последний раз редактировалось Poleax; 29.03.2011 в 18:50. |
|
29.03.2011, 19:19 | #10 |
Участник
|
Цитата:
Ну так я же в первом посте и привел эту ссылку
Цитата:
Не помогает pasteSpecial(1)
|
|
29.03.2011, 20:27 | #11 |
Участник
|
В AX2009 при стандартном экспорте в Excel из грида делается так:
X++: public void pasteSpecial() { #define.XL_UNICODEFORMAT(0) COMVariant clipboardFormat; ; clipboardFormat = new COMVariant(); clipboardFormat.int(#XL_UNICODEFORMAT); worksheet.pasteSpecial(clipboardFormat, false, false); }
__________________
Ivanhoe as is.. |
|
29.03.2011, 21:51 | #12 |
Участник
|
Цитата:
Сообщение от Ivanhoe
В AX2009 при стандартном экспорте в Excel из грида делается так:
X++: public void pasteSpecial() { #define.XL_UNICODEFORMAT(0) COMVariant clipboardFormat; ; clipboardFormat = new COMVariant(); clipboardFormat.int(#XL_UNICODEFORMAT); worksheet.pasteSpecial(clipboardFormat, false, false); } А можно и просто paste() вызывать. Переключение раскладки не требуется для DAX2009
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Poleax (3). |
30.03.2011, 10:48 | #13 |
Модератор
|
Цитата:
Сообщение от Ivanhoe
В AX2009 при стандартном экспорте в Excel из грида делается так:
X++: public void pasteSpecial() { #define.XL_UNICODEFORMAT(0) COMVariant clipboardFormat; ; clipboardFormat = new COMVariant(); clipboardFormat.int(#XL_UNICODEFORMAT); worksheet.pasteSpecial(clipboardFormat, false, false); } Использую для проверки Job вставка столбца в Excel Кодировка Цитата:
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
30.03.2011, 11:03 | #14 |
Участник
|
Цитата:
__________________
Ivanhoe as is.. |
|
|
За это сообщение автора поблагодарили: NataLee (1), Poleax (3). |
30.03.2011, 11:16 | #15 |
Модератор
|
Цитата:
Закрываем тему. X++: 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 XLSWorkSheet.pasteSpecial(0); // 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("Ошибка при копировании данных через буфер обмена."); } }
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. Последний раз редактировалось Poleax; 30.03.2011 в 11:32. |
|
|
За это сообщение автора поблагодарили: Arahnid (1). |