30.07.2013, 09:03 | #1 |
Программатор
|
AX 2012 и OxmlRow_RU
Добрый день коллеги. Есть отличный класс для работы со строками OxmlRow_RU. Но где аналог оного (к примеру) OxmlColumn_RU. Я бы хотел всячески играться с колонками, дублировать, вставлять, копировать и тд. Кто то сталкивался с такой проблемой? И интересно как её обошли? Может кто сделал свой OxmlColumn_RU.
Заранее спасибо! |
|
30.07.2013, 09:11 | #2 |
Участник
|
Можно сделать свою обертку над DocumentFormat.OpenXml.Spreadsheet.Column
|
|
30.07.2013, 09:14 | #3 |
Программатор
|
Можно, но в лоб не получилось
|
|
30.07.2013, 09:19 | #4 |
Участник
|
Надо изучить, в каком контексте ты ее используешь (стандартный функционал Ax делает некоторую постобработку в конце - это надо учитывать). Так как, ячейки ЕМНИП, хранятся внутри строки, а колонка - это только описатель. То есть при копировании столбца, надо проходить по строчкам и копировать там ячейки. Вообще Open XML SDK - достаточно тонкая обертка над форматом. Попробуй переименовать xslx в zip и посмотреть, как оно там устроено.
|
|
30.07.2013, 09:21 | #5 |
Программатор
|
Максим, я не понимаю о чём ты А еще есть такое понятие как ВРЕМЯ, которого нет для того, чтобы лицезреть все это дело.
|
|
30.07.2013, 09:30 | #6 |
Участник
|
Есть формат Office Open XML - являющийся текущим форматом сохранения для Office.
Он представляет собой зазипованную кучу xml файлов. Над ним есть обертка, под названием Open XML SDK, чтобы чуть поудобнее было работать с форматом. Над ней есть обертка уже в Ax чтобы удобнее было работать из X++. Поверх этой обертки есть некая логика, которая реализует кусочек экселя типа определения высоты строки. А еще имитирует интерфейс к которому привыкли (XMLExcelDocument_RU). Поверх этого гордо сидит XMLExcelReport_RU - который управляет жизненным циклом типового отчета. Чтобы понять, что надо сделать, надо понять, как устроен исходный формат. А чтобы понять исходный формат, надо на него посмотреть. |
|
|
За это сообщение автора поблагодарили: gl00mie (2), alex55 (1), Kabardian (2). |
30.07.2013, 09:34 | #7 |
Программатор
|
Смотрю.... красиво наворотили. Вообще вопрос в другом, не как доделать, а может кто доделал? и почему этого нет в стандарте?
Последний раз редактировалось Sada; 30.07.2013 в 09:41. |
|
30.07.2013, 10:00 | #8 |
Участник
|
В стандарте нет, потому, что для стандартных отчетов не понадобилось
|
|
30.07.2013, 10:03 | #9 |
Программатор
|
Неужто нет отчётов в стандарте с динамическим количеством столбцов?
|
|
30.07.2013, 10:33 | #10 |
Участник
|
Действительно, надо переименовать xlsx файл в zip и посмотреть что внутри, думаю это значительно облегчит работу
Дело в том что воркшит состоит из строк, а строки состоят из ячеек. А объект Columns служит только как шаблон для ячеек(ширина и другие свойства), то есть чтобы скопировать колонку нужно пройти по всем строкам, вытащить оттуда ячейки и снова вставить, что намного сложней чем скопировать строку. Если вам нужен отчёт с переменным количеством ячеек то копировать надо не колонку а ячейку. Пример можно увидеть в OXMLExcelReport_RTax25RegTrans_RU.createColumns(). В принципе мне кажется что не должно составить труда копировать при необходимости и объект Column в Columns чтобы задавать ширину. MS Excel предоставляет огромное количество функционала, и полностью повторить его не представляется возможным в рамках модификации в AX. Кроме того, да, действительно не было необходимости копирования колонок(речь идёт именно о колонках, а не о размножении ячеек в конкретной строке). Поэтому в том виде как Вы хотите оно не было реализовано. |
|
|
За это сообщение автора поблагодарили: belugin (5), Sada (5). |
31.07.2013, 15:33 | #11 |
Программатор
|
Коллеги, такой вопрос.
К примеру у меня есть 10 проименованных колонок. Мне нужно вывести в 11 и 12 колонки какие то значения. Аксапта копирует верхнее первое значение в нижние строки для 11 и 12 колонки, а для первых 10-ти работает нормально. Как это можно обойти? Не хотелось бы заморачиваться копированием ячеек(если это поможет)... Последний раз редактировалось Sada; 31.07.2013 в 15:55. |
|
05.08.2013, 01:51 | #12 |
Участник
|
Цитата:
Цитата:
Сообщение от belugin
Есть формат Office Open XML - являющийся текущим форматом сохранения для Office. Над ним есть обертка, под названием Open XML SDK, чтобы чуть поудобнее было работать с форматом. Над ней есть обертка уже в Ax чтобы удобнее было работать из X++. Поверх этой обертки есть некая логика, которая реализует кусочек экселя типа определения высоты строки. А еще имитирует интерфейс к которому привыкли (XMLExcelDocument_RU).
|
|
|
За это сообщение автора поблагодарили: Sada (1), db (1), Logger (3). |
05.08.2013, 11:50 | #13 |
Программатор
|
Еще вопросик, не знаю сюда его задать или нет.
Объединение ячеек. В OXMLWorksheet_RU есть метод saveMergeCells. там нужен контейнер, в котором [fromrow, toRow, fromCol, ToCol].но есть еще переменная MergeCells, которую никак не пойму как проинитить. Там же метод initMergeCells() а в нем if (!mergeCells) { return; } ???? это что такое ?)) |
|
05.08.2013, 15:39 | #14 |
Участник
|
Тип mergeCells - DocumentFormat.OpenXML.Spreadsheet.MergeCells - это смерженные ячейки шаблона.
if (!mergeCells) { return; } Означает что если нет в воркшите объединённых ячеек то в аксаптовый мап с этими ячейками вычитывать нечего |
|
|
За это сообщение автора поблагодарили: Sada (2). |
05.08.2013, 15:48 | #15 |
Участник
|
Касательно колонок - не совсем понял. Именованных колонок или ячеек?
Идея в том что отчёт состоит из секций которые задаются посредством выделения и задания именованных ренжей СТРОКам, например с 1 по 10 шапка отчёта, потом с 11 по 15 шапка страницы, потом 16 строки и так далее. В рамках каждой секции задаются с помощью именованных диапазонов поля(а не колонки)(ItemName, Amount и так далее). Пример - шаблон ТОРГ-12 который можно выгрузить из ресурса TORG_12. Когда шаблон открывается(при установленной переменной templateMode = true), из него вычитываются все строки в память, содержимое удаляется. Дальше когда вызывается execute на некую секцию всё содержимое секции скидывается обратно в файл. например Execute("REPORTHEADER") скинет в файл 10 строк(см пример выше). Ещё раз - ещё десять и так далее. Последний раз редактировалось VORP; 05.08.2013 в 15:51. |
|
05.08.2013, 15:51 | #16 |
Участник
|
следовательно чтобы что то выводилось в 11 и 12 колонки надо либо задать полям в этих колонках namedRanges, либо, если шаблон динамический - размножить ячейки в соответствующей строке.
|
|
05.08.2013, 15:56 | #17 |
Программатор
|
Научите объединять ячейки программно
Последний раз редактировалось Sada; 05.08.2013 в 16:03. |
|
05.08.2013, 15:56 | #18 |
Программатор
|
|
|
05.08.2013, 16:14 | #19 |
Участник
|
У вас templateMode = true?
Я особо не вижу смысла в объединении ячеек, можно всё это нарисовать в шаблоне - одну объединённую вторую разединенную, и вызывать какую надо в зависимости от ситуации. Но если очень хочется - надо добавить в DocumentFormat.openXml.Spreadsheet.Worksheet узел MergeCells(строго на нужном месте а то будет ошибка). Для этого можно воспользоваться методами InsertBefore или InsertAfter, для чего можно использовать: OXML_RU::invokeGeneric(row, 'InsertBefore', cell.GetType(), parameters); Дело в том что эти функции generic и из аксапты по нормальному не вызываются. Если mergeCells узел уже есть его добавлять не надо ну а дальше положить просто данные в аксаптовый мап mergeCellsSet аналогично тому как это делается в initMergeCells. в нем хранятся координаты левого верхнего и правого нижнего углов. |
|
05.08.2013, 16:43 | #20 |
Программатор
|
templateMode = true. У меня динамическое количество столбцов, и вот группа, объединяющая эти столбцы(верхний уровень) - ее хочу объеденить. Заранее количество столбцов в ней не известно . Надеюсь понятно объяснил
|
|
Теги |
open xml, ax2012 |
|
|