Показать сообщение отдельно
Старый 04.05.2016, 12:10   #61  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Моя старенькая AX2009 начала барахлить при выводе данных в Excel. Я использовал для вывода данных буфер обмена. Через много лет у некоторых пользователей (не у всех) стало вываливаться сообщение "Метод pastespecial возвратил код ошибки Неизвестно, которое обозначает Неизвестно".

В связи с этим переделал движок отчетов на технологию, описанную в этой ветке.
Обернул все тонкости работы с Recordset в класс zExcelADO, чтобы программирование отчета происходило на высоком уровне.
Вместо нулевых значений в Excel остаются пустые ячейки.
Методы DD_DrawGridToTheEnd и DD_FontBoldAndBackColor1 я таскаю с собой уже 10 лет
Класс zExcelADO прилагается. Ниже Job с примером

X++:
static void Job129(Args _args)
{
    zExcelADO         e = new zExcelADO();
    CustInvoiceJour   CustInvoiceJour;
    int               i;
    ;
    e.addField(Types::String);
    e.addField(Types::Date);
    e.addField(Types::UtcDateTime);
    e.addField(Types::Real);
    e.addField(Types::String);
    while select CustInvoiceJour
    {
        i++;
        if (i > 1000)
            break;
        e.addRecord();
        e.addCell(CustInvoiceJour.InvoiceId);
        e.addCell(CustInvoiceJour.InvoiceDate);
        e.addCell(CustInvoiceJour.createdDateTime);
        e.addCell(CustInvoiceJour.InvoiceAmount);
        e.addCell(CustInvoiceJour.salesTable().custTable_CustAccount().Name);
    }
    e.toExcel("A4");
    
    e.excel().insertValue("A1", "Список накладных");
    e.excel().insertValue("A2", "Первые 1000 штук");
    e.excel().insertValue("A3", "Номер");
    e.excel().insertValue("B3", "Дата");
    e.excel().insertValue("C3", "Дата создания");
    e.excel().insertValue("D3", "Сумма");
    e.excel().insertValue("E3", "Название клиента");

    e.DD_DrawGridToTheEnd("A3", 1, true);
    e.DD_FontBoldAndBackColor1("A1", "E3", true, -1, -1, -1, -1);
    e.excel().visible(true);
}
Данные с типом UTCDateTime выводятся в Эксель без времени, чтобы выводилось время, надо задать соответствующий формат ячеек. Можно подсунуть свой шаблон вызвав конструкцию типа
X++:
    e.excel(new ComExcelDocument_RU());
    e.excel().newFile("Имя файла.xlt",false);
Вложения
Тип файла: xpo Class_zExcelADO.xpo (11.0 Кб, 546 просмотров)
За это сообщение автора поблагодарили: Ruff (5), Gustav (10), Player1 (4).