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