25.11.2023, 21:09 | #1 |
Участник
|
Создание отчета на XMLExcelReport_RU с страницами и лого
А использовал ли кто-нибудь отчет на основании XMLExcelReport_RU где есть лого в шаблоне и разрывы страниц?
Столкнулся с таким непонятным багом, что если есть лого и добавляется разрыв страницы в сформированном XML файле(который можно получить открыв xlsx в архиве) в конце хмл с листом генерятся вот такие строки X++: <x:drawing r:id="rId2" /> <x:rowBreaks count="1" manualBreakCount="1"> <x:brk id="19" man="1" max="16383" /> </x:rowBreaks> Если эти теги(x:drawing и x:rowBreaks) поменять вручную местами, то все работает. Но непонятно как это пофиксить из кода. Все стандартные отчеты идут без логотипов Версия D365FO(если это важно), но я думаю в АХ2012 такая же проблема |
|
26.11.2023, 14:40 | #2 |
Участник
|
Не сталкивался.
Может быть задействовать уже готовый шаблон в которым эти свойства выставлены как надо ? |
|
26.11.2023, 15:04 | #3 |
Участник
|
Цитата:
Аксапта пересоздает данные шаблона копированием и далеко не всегда корректно это делает. я, в свое время, так и не поборол (там другое, но проблема из-за того же подхода) Специальные именованные диапазоны Excel и работа с ними в DAX2012 при помощи OXML |
|
27.11.2023, 15:47 | #4 |
Участник
|
В общем получилось решить меняя местами эти теги при сохранении. Код для этого ниже
X++: using DocumentFormat.OpenXml; [ExtensionOf(classstr(OxmlWorksheet_RU))] final class OxmlWorksheet_RUDEV_Extension { private OpenXmlElement DEVsavedLastDrawingElement; public void save() { if (this.rowBreaks().elements()) { this.DEVremoveDrawing(worksheet); } next save(); if (DEVsavedLastDrawingElement != null) { OXML_RU::appendChild(worksheet, DEVsavedLastDrawingElement); } } //fixing the bug where page break element should be before the drawing public void DEVremoveDrawing(DocumentFormat.OpenXml.OpenXmlElement _parent) { OpenXmlElement lastDrawingElement; int i; i = worksheet.ChildElements.get_Count(); lastDrawingElement = _parent.get_LastChild(); str name = lastDrawingElement.get_LocalName(); if (name == "drawing") { DEVsavedLastDrawingElement = lastDrawingElement.CloneNode(true); lastDrawingElement.Remove(); } } } |
|
|
За это сообщение автора поблагодарили: SRF (1). |