AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.03.2011, 17:57   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
? Вставка в 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  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Данный глюк наблюдается при раскладке клавиатуры EN
При значение RU, все нормально.

Что то такое уже было, может напомните, где почитать?
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
За это сообщение автора поблагодарили: invise (0).
Старый 29.03.2011, 18:26   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Вроде, RU должно быть и в Аксапте (перед загрузкой в буфер), и в Excel перед вставкой в таблицу. Любые другие комбинации приводят к кракозябрам (наверное, и к "вопросикам" тоже).
Старый 29.03.2011, 18:27   #4  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
По-моему все дело в текущем языке системы. Он должен совпадать с языком вставляемого текста

P.S. Чтобы решить проблему, перед вставкой надо проверять язык раскладки клавиатуры, если он EN - программно переключать в RU. Другого решения мне найти не удалось.

Последний раз редактировалось kornix; 29.03.2011 в 18:30.
Старый 29.03.2011, 18:34   #5  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от Gustav Посмотреть сообщение
Вроде, RU должно быть и в Аксапте (перед загрузкой в буфер), и в Excel перед вставкой в таблицу. Любые другие комбинации приводят к кракозябрам (наверное, и к "вопросикам" тоже).
я знал, что Gustav отзовется на слово Excel в теме.

Цитата:
Сообщение от kornix Посмотреть сообщение
По-моему все дело в текущем языке системы. Он должен совпадать с языком вставляемого текста

P.S. Чтобы решить проблему, перед вставкой надо проверять язык раскладки клавиатуры, если он EN - программно переключать в RU. Другого решения мне найти не удалось.
Да же, вариант AndyD, у меня криво работает

Цитата:
Сообщение от 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("Текст"));
Вставка через excelDocument.insertValue проходит нормально, но медленно, через буфер косяки.

P.S. Хм, замутить смену раскладки через API или забить на производительность
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
За это сообщение автора поблагодарили: Gustav (1).
Старый 29.03.2011, 18:36   #6  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Лучше сменить раскладку через API
Старый 29.03.2011, 18:36   #7  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Как переключить раскладку клавиатуры
__________________
Sergey Nefedov
Старый 29.03.2011, 18:37   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Посмотрите
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  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от Logger Посмотреть сообщение
Посмотрите
http://forum.mazzy.ru/index.php?showtopic=385
...........................
pasteSpecial(1) - реально помогает. Ему не важен текущий язык системы.
Кроме того 1 - числовая константа. не зависит от языка установленного MS Office (в отличие от строковых параметров)
Ну так я же в первом посте и привел эту ссылку
Цитата:
Сообщение от Poleax Посмотреть сообщение
При вставке в Excel через excelDocument.insertText

Слова на русском языке превращаются в знаки вопроса (?????? ????)
При трассировке, в текстовом буфере слова нормально видны.
Не помогает pasteSpecial(1)


Пост удален Wamr

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  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Ну так я же в первом посте и привел эту ссылку
я долго собирался с мыслями. Пока писал ответ, тут уже вы успели ответить.

Цитата:
Не помогает pasteSpecial(1)
Очень странно. Нам вроде бы помогал. Возможно причина в том что все пользователи сидят на терминальном сервере и для всех получается какой то один дефолтный язык.
Старый 29.03.2011, 20:27   #11  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
В 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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от 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  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от 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);
}
Так не работает?
Вывод в Excel из любой формы работает отлично. Кодировка нормальная. (\Classes\SysExcelWorksheet\pasteSpecial)

Использую для проверки Job вставка столбца в Excel
Кодировка

Цитата:
Сообщение от AndyD Посмотреть сообщение
Угу.
А можно и просто paste() вызывать. Переключение раскладки не требуется для DAX2009
Да действительно
  • sheet.Paste(); Отработал нормально, в не зависимости от раскладки
  • sheet.PasteSpecial(1); Кодировка выводится не верная
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
Старый 30.03.2011, 11:03   #14  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
#define.XL_UNICODEFORMAT(0)
clipboardFormat.int(#XL_UNICODEFORMAT);
worksheet.pasteSpecial(clipboardFormat, false, false);
Цитата:
Сообщение от Poleax Посмотреть сообщение
[*]sheet.PasteSpecial(1); Кодировка выводится не верная [/LIST]
Я может чего не понимаю, но в стандарте не 1, а 0. sheet.PasteSpecial(0) не работает??
__________________
Ivanhoe as is..
За это сообщение автора поблагодарили: NataLee (1), Poleax (3).
Старый 30.03.2011, 11:16   #15  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Я может чего не понимаю, но в стандарте не 1, а 0. sheet.PasteSpecial(0) не работает??
Работает, спасибо.
Закрываем тему.

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).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
textBuffer и максимальный размер буфера для вставки в Excel Roman777 DAX: Программирование 10 01.02.2010 19:15
Вставка нескольких строк из шаблона Excel breakpoint DAX: Программирование 2 04.06.2009 15:31
Вставка строки в Excel A-Lis-A DAX: Программирование 2 27.09.2007 12:03
TextBuffer и кодировка...? mmm DAX: Программирование 7 24.01.2007 18:13
вставка столбца в Excel Pawlik DAX: Программирование 23 29.03.2006 12:20

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:46.