21.01.2015, 12:43 | #1 |
Участник
|
XMLExcelDocument_RU объединение ячеек и вставка картинки
Добрый день.
Делаю отчёт на базе XMLExcelDocument_RU. Всё хорошо, но встала задача объединять ячейки по вертикали и вставлять в неё картинку. Код: worksheet.row(0).multiplyCell(1,5); worksheet.row(1).worksheet().mergeCells().add([1,1,2,2]); Заранее спасибо. Ax2012 R3 |
|
21.01.2015, 13:45 | #2 |
Участник
|
у нас worksheet.mergeCells().add(con); такая конструкция работает. объединение работает в момент заполнения конкретной области листа
|
|
21.01.2015, 14:21 | #3 |
Участник
|
Объединение работает.
X++: worksheet.mergeCells().add([1,2,5,7]); |
|
21.01.2015, 15:28 | #5 |
Участник
|
Так это всё чкркз COM ...а я вывожу через XML
|
|
21.01.2015, 15:41 | #6 |
Участник
|
Через xml, насколько я знаю, не получится. Делайте xml, а в конце во время открытия документа вставьте через com картинки.
__________________
Ivanhoe as is.. |
|
22.01.2015, 09:45 | #7 |
Участник
|
Цитата:
т.е. всякие преимущества в виде того что на сервере не открываются ексели теряются, а поддержка двух технологий немного усложняется |
|
22.01.2015, 10:13 | #8 |
Участник
|
В движке XML отчетов в Аксапте много чего не реализовано
Из неприятного - нет поддержки формул в шаблонах Если не делать дополнительных телодвижений, то создается отчет, который не может загрузить Excel Так же, не меняются сами формулы при размножении строк. Т.е. если для строки 7 создать формулу =A7+B7, то во всех копиях этой строки останется ссылка на строку 7. Приходится в формуле использовать что-то типа такого =ДВССЫЛ("$A$"&СТРОКА())+ДВССЫЛ("$B$"&СТРОКА()), либо писать доп. код для изменения
__________________
Axapta v.3.0 sp5 kr2 |
|
22.01.2015, 10:14 | #9 |
Участник
|
Безусловно, надо принимать общее решение. Если все отчеты xml и в одном нужно вставить вдруг картинку - можно так как я написал. Если большая часть отчетов настолько сложные, то можно и другие технологии рассмотреть.
По моему опыту, xml самые простые и надежные. Через com, например, в нашем фреймворке делается закрытие файла Excel на редактирование перед отображением пользователю, туда же вполне можно и картинки добавить.
__________________
Ivanhoe as is.. |
|
26.01.2015, 11:20 | #10 |
Участник
|
Цитата:
Сообщение от AndyD
В движке XML отчетов в Аксапте много чего не реализовано
Из неприятного - нет поддержки формул в шаблонах Если не делать дополнительных телодвижений, то создается отчет, который не может загрузить Excel Так же, не меняются сами формулы при размножении строк. Т.е. если для строки 7 создать формулу =A7+B7, то во всех копиях этой строки останется ссылка на строку 7. Приходится в формуле использовать что-то типа такого =ДВССЫЛ("$A$"&СТРОКА())+ДВССЫЛ("$B$"&СТРОКА()), либо писать доп. код для изменения Спасибо |
|
26.01.2015, 11:29 | #11 |
Участник
|
Вы через XMLExcelDocument_RU.insertValue() формулы вставляете?
__________________
Axapta v.3.0 sp5 kr2 |
|
26.01.2015, 12:49 | #12 |
Участник
|
|
|
26.01.2015, 14:00 | #13 |
Участник
|
Это неправильно.
Вместо формулы, у вас получается значение в ячейке Надо добавить в класс OXMLCell_RU подобный метод X++: public void setFormula(str _formula) { DocumentFormat.OpenXml.OpenXmlElementList oxmlElementList; DocumentFormat.OpenXml.OpenXmlElement oxmlElement; DocumentFormat.OpenXml.Spreadsheet.CellFormula cellFormula; System.Collections.IEnumerator enumerator; ; oxmlElementList = cell.get_ChildElements(); enumerator = oxmlElementList.GetEnumerator(); while (enumerator.MoveNext()) { oxmlElement = enumerator.get_Current(); if (oxmlElement is DocumentFormat.OpenXml.Spreadsheet.CellFormula) { cellFormula = oxmlElement as DocumentFormat.OpenXml.Spreadsheet.CellFormula; break; } } if (!cellFormula) { //BP deviation documented cellFormula = new DocumentFormat.OpenXml.Spreadsheet.CellFormula(); cell.set_CellFormula(cellFormula); } cellFormula.set_Text(_formula); } И использовать для создания/изменения формулы эти методы Сами формулы должно записываться в АНГЛИЙСКОМ варианте, независимо от языка используемого офиса. Т.е. SUM, вместо СУММ и т.п. Так же, если формулы были сохранены в шаблоне, то что бы они пересчитались с учетом изменений в данных, необходимо вызвать подобный метод X++: protected void setWorkbookParms() { DocumentFormat.OpenXml.Packaging.WorkbookPart workbookPart; DocumentFormat.OpenXml.Spreadsheet.Workbook workbook; DocumentFormat.OpenXml.Spreadsheet.CalculationProperties calcProperties; DocumentFormat.OpenXml.BooleanValue trueValue; ; workbookPart = document.workbook().workbookPart(); workbook = workbookPart.get_Workbook(); calcProperties = workbook.get_CalculationProperties(); trueValue = new DocumentFormat.OpenXml.BooleanValue(true); calcProperties.set_FullCalculationOnLoad(trueValue); calcProperties.set_ForceFullCalculation(trueValue); }
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: raniel (1), Морковка (1). |
26.01.2015, 14:45 | #14 |
Участник
|
Кстати я сам дошёл до реализации первого метода, но расположил его в классе OxmlWorkBook_RU по аналогии с setNamedRangeFontSize. И это не работало пока не переписал формулы по английский.
Ну а тот факт что я могу использовать формулы прям шаблоне, просто иначе их писать то это просто шикарно. Спасибо! Остался вопрос с картинкой. Кстати выводить её у меня получилось, но координаты надо задавать попиксельно вручную. Как можно вычислить координаты середины ячейки? Последний раз редактировалось raniel; 26.01.2015 в 16:27. Причина: Дополнение |
|