![]() |
#21 |
Участник
|
Не могу детально пояснить. Очень большая загруженность сейчас.
Просто внимательно посмотрите примеры данные по ссылкам. Там все работает аналогично вызовам методов через SysDictClass / SysDictTable |
|
![]() |
#22 |
Участник
|
Цитата:
Сообщение от DesparioN
![]() Если не сложно, можете раскрыть тему более подробно?
X++: System.Type enumValue; System.Reflection.MethodInfo methodInfo; enumValue = System.Type::GetType("DocumentFormat.OpenXml.EnumValue`1"); methodInfo = enumValue.GetMethod("Value"); В частности мне надо в DocumentFormat.OpenXml.Spreadsheet.Alignment указать значение для горизонтальных и вертикальных границ. ![]() Вот тут хороший пример: https://wiki.programstore.ru/primer-...rammy-v-excel/ Но там используется метод OXMLExp::getEnumValue(), а кода нет. В reflection более менее разбираюсь. Но всё равно не выходит ЗЫ Ну а если есть готовый код по вставке картинки в XMLExcelReport_RU в XML буду оооочень благодарен. На С# вот такой простой код: X++: DocumentFormat.OpenXml.EnumValue<DocumentFormat.OpenXml.Drawing.BlipCompressionValues> value; value = new DocumentFormat.OpenXml.EnumValue<DocumentFormat.OpenXml.Drawing.BlipCompressionValues>(DocumentFormat.OpenXml.Drawing.BlipCompressionValues.Print); X++: enumObject = CLRInterop::parseClrEnum('DocumentFormat.OpenXml.Drawing.BlipCompressionValues', 'Print'); enumType = System.Type::GetType("DocumentFormat.OpenXml.Drawing.BlipCompressionValues, DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); enumValueType = System.Type::GetType("DocumentFormat.OpenXml.EnumValue`1, DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); typeParams = new System.Type[1](); typeParams.SetValue(enumType, 0); genericType = enumValueType.MakeGenericType(typeParams); Object = System.Activator::CreateInstance(genericType, CLRInterop::parseClrEnum('DocumentFormat.OpenXml.Drawing.BlipCompressionValues', 'Print')); Последний раз редактировалось LETTO; 16.10.2023 в 13:08. |
|
![]() |
#23 |
Участник
|
Готового примера нет.
Но как я понимаю, вам надо не дженерик тип вызвать, а дженерик конструктор для типа "DocumentFormat.OpenXml.EnumValue`1" т.е. сам этот тип "DocumentFormat.OpenXml.EnumValue`1" не получится использовать, нужно конкретный производный тип подставить. Копайте в эту сторону. У меня была похожая задача. Делали обмен с кафкой, используя .net компонент Confluent.Kafka.dll там вся библиотека построена на дженериках. и для того чтобы заменить одну строку C# кода такого вида X++: consumer = new ConsumerBuilder<String, String>(config).Build(); Сначала создаем в аксапте объект с типом Confluent.Kafka.ConsumerBuilder`2 а затем для него создаем экземпляр System.Reflection.ConstructorInfo constructorInfo = System.Type.GetConstructor(...) при помощи которого уже и вызываем конструктор типа X++: new ConsumerBuilder<String, String> Я поигрался недавно с этим, получил рабочий код, но пока отложил, так как коллега написал сборку обертку, которая в аксапту выставляет классы обертки над дженериками, так что без всего этого можно обойтись стало. Последний раз редактировалось Logger; 16.10.2023 в 13:18. |
|
|
За это сообщение автора поблагодарили: LETTO (3). |
![]() |
#24 |
Участник
|
Dll-ка кафки нужной версии во вложении
|
|
![]() |
#25 |
Участник
|
В моем случае тоже приходил null в аксапте
Не получалось создать тип Confluent.Kafka.ConsumerBuilder`2 Похоже аксапта просто не находила нужный тип в сборке теми методами которыми я пытался делать (там в джобе закомменченный код) В итоге пришлось извращаться. Брать другой обычный (не generic) тип из библиотеки Confluent.Kafka Для него получать System.Reflection.Assembly и уже при помощи экземпляра этого типа получать Confluent.Kafka.ConsumerBuilder`2 попробуйте также. |
|
![]() |
#26 |
Участник
|
|
|
![]() |
#27 |
Участник
|
|
|
![]() |
#28 |
Участник
|
Цитата:
Я сам такое не делал. Хотя тут все аналогично как в моем примере с кафкой. Что-то вопрос популярен. Спрашивают его повторно в личке другие люди. Мой коллега делал. С его разрешения публикую его вариант X++: protected void insertImage_inCell( Filename _fileName , int _posX , int _posY , int64 _posXOffcet , int64 _posYOffcet , int64 _width , int64 _height ) { #define.EMU_per_pixel(9525)//EMU per pixel(approximately) DocumentFormat.OpenXml.Packaging.ImagePart imagePart; DocumentFormat.OpenXml.Drawing.Spreadsheet.ShapeProperties shapeProperties; DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualPictureProperties nonVisualPictureProperties; DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualDrawingProperties nonVisualDrawingProperties; DocumentFormat.OpenXml.Drawing.Spreadsheet.BlipFill blipFill; DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture picture; DocumentFormat.OpenXml.Drawing.Spreadsheet.TwoCellAnchor twoCellAnchor; DocumentFormat.OpenXml.Drawing.Stretch stretch; DocumentFormat.OpenXml.Drawing.Blip blip; DocumentFormat.OpenXml.Drawing.Transform2D transform2D; DocumentFormat.OpenXml.Drawing.Extents extents; DocumentFormat.OpenXml.Drawing.PresetGeometry presetGeometry; System.IO.FileStream fileStream; DocumentFormat.OpenXml.Drawing.Spreadsheet.FromMarker fromMarker; DocumentFormat.OpenXml.Drawing.Spreadsheet.ToMarker toMarker; void clearNet() { imagePart = null; shapeProperties = null; nonVisualPictureProperties = null; nonVisualDrawingProperties = null; blipFill = null; picture = null; twoCellAnchor = null; stretch = null; blip = null; transform2D = null; extents = null; presetGeometry = null; fromMarker = null; toMarker = null; } picId += picId ? 1000 : 1; //Id начинаем с 1000, на случай, если в книге уже есть картинки imagePart = drawingsPart.AddImagePart(DocumentFormat.OpenXml.Packaging.ImagePartType::Png); fileStream = new System.IO.FileStream(_fileName, System.IO.FileMode::Open); imagePart.FeedData(fileStream); fileStream.Close(); fileStream.Dispose(); fileStream = null; blip = new DocumentFormat.OpenXml.Drawing.Blip(); blip.set_Embed(new DocumentFormat.OpenXml.StringValue(drawingsPart.GetIdOfPart(imagePart))); blipFill = new DocumentFormat.OpenXml.Drawing.Spreadsheet.BlipFill(); blipFill.set_Blip(blip); blipFill.set_SourceRectangle(new DocumentFormat.OpenXml.Drawing.SourceRectangle()); stretch = new DocumentFormat.OpenXml.Drawing.Stretch(); stretch.set_FillRectangle(new DocumentFormat.OpenXml.Drawing.FillRectangle()); OXML_RU::appendChild(blipFill, stretch); extents = new DocumentFormat.OpenXml.Drawing.Extents(); extents.set_Cx(new DocumentFormat.OpenXml.Int64Value(_width)); extents.set_Cy(new DocumentFormat.OpenXml.Int64Value(_height)); transform2D = new DocumentFormat.OpenXml.Drawing.Transform2D(); transform2D.set_Extents(extents); shapeProperties = new DocumentFormat.OpenXml.Drawing.Spreadsheet.ShapeProperties(); shapeProperties.set_BlackWhiteMode(OXMLExp::getEnumValue(DocumentFormat.OpenXml.Drawing.BlackWhiteModeValues::Auto)); shapeProperties.set_Transform2D(transform2D); Последний раз редактировалось Logger; 04.09.2025 в 23:10. Причина: не влезло сообщение - пришлось разбить на несколько |
|
![]() |
#29 |
Участник
|
X++: presetGeometry = new DocumentFormat.OpenXml.Drawing.PresetGeometry(); presetGeometry.set_AdjustValueList(new DocumentFormat.OpenXml.Drawing.AdjustValueList()); presetGeometry.set_Preset(OXMLExp::getEnumValue(DocumentFormat.OpenXml.Drawing.ShapeTypeValues::Rectangle)); OXML_RU::appendChild(shapeProperties, presetGeometry); OXML_RU::appendChild(shapeProperties, new DocumentFormat.OpenXml.Drawing.NoFill()); fromMarker = new DocumentFormat.OpenXml.Drawing.Spreadsheet.FromMarker(); fromMarker.set_ColumnId (new DocumentFormat.OpenXml.Drawing.Spreadsheet.ColumnId (int642str(_posX - 1))); //считается от нуля fromMarker.set_ColumnOffset (new DocumentFormat.OpenXml.Drawing.Spreadsheet.ColumnOffset(int642str(_posXOffcet * #EMU_per_pixel))); // convert to pixels fromMarker.set_RowId (new DocumentFormat.OpenXml.Drawing.Spreadsheet.RowId (int642str(_posY - 1))); //считается от нуля fromMarker.set_RowOffset (new DocumentFormat.OpenXml.Drawing.Spreadsheet.RowOffset (int642str(_posYOffcet * #EMU_per_pixel))); // convert to pixels toMarker = new DocumentFormat.OpenXml.Drawing.Spreadsheet.ToMarker(); toMarker.set_ColumnId (new DocumentFormat.OpenXml.Drawing.Spreadsheet.ColumnId (int642str(_posX - 1))); //считается от нуля toMarker.set_ColumnOffset (new DocumentFormat.OpenXml.Drawing.Spreadsheet.ColumnOffset(int642str((_posXOffcet + _width) * #EMU_per_pixel))); // convert to pixels toMarker.set_RowId (new DocumentFormat.OpenXml.Drawing.Spreadsheet.RowId (int642str(_posY - 1))); //считается от нуля toMarker.set_RowOffset (new DocumentFormat.OpenXml.Drawing.Spreadsheet.RowOffset (int642str((_posYOffcet + _height) * #EMU_per_pixel))); // convert to pixels twoCellAnchor = new DocumentFormat.OpenXml.Drawing.Spreadsheet.TwoCellAnchor(); twoCellAnchor.set_FromMarker(fromMarker); twoCellAnchor.set_ToMarker (toMarker); twoCellAnchor.set_EditAs(OXMLExp::getEnumValue(DocumentFormat.OpenXml.Drawing.Spreadsheet.EditAsValues::OneCell)); nonVisualDrawingProperties = new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualDrawingProperties(); nonVisualDrawingProperties.set_Id(OXML_RU::setUInt32Value(picId)); nonVisualDrawingProperties.set_Name(new DocumentFormat.OpenXml.StringValue(_fileName)); nonVisualPictureProperties = new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualPictureProperties(); nonVisualPictureProperties.set_NonVisualDrawingProperties(nonVisualDrawingProperties); nonVisualPictureProperties.set_NonVisualPictureDrawingProperties(new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualPictureDrawingProperties()); picture = new DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture(); picture.set_NonVisualPictureProperties(nonVisualPictureProperties); picture.set_BlipFill(blipFill); picture.set_ShapeProperties(shapeProperties); OXML_RU::appendChild(twoCellAnchor, picture); OXML_RU::appendChild(twoCellAnchor, new DocumentFormat.OpenXml.Drawing.Spreadsheet.ClientData()); OXML_RU::appendChild(worksheetDrawing, twoCellAnchor); clearNet(); } Цитата:
- метод вставки картинки
основная замена: DocumentFormat.OpenXml.Drawing.Spreadsheet.AbsoluteAnchor на DocumentFormat.OpenXml.Drawing.Spreadsheet.TwoCellAnchor + добавлена очистка объектов (все это игнорируют, в исходнике даже FileStream не диспозился) |
|
![]() |
#30 |
Участник
|
X++: public static System.Object getEnumValue(System.Enum _o) { System.Object ret; System.Reflection.Assembly assembly; System.Reflection.ConstructorInfo constructorInfo; System.Type enumType, enumGenericType, genericType; System.Type[] enumTypes; System.Object[] enumValues; str enumTypeStr, enumValueStr, assemblyStr; if (! CLRInterop::isNull(_o)) { try { enumValueStr = _o.ToString(); enumType = _o.GetType(); enumTypeStr = enumType.ToString(); assembly = enumType.get_Assembly(); //определяем .net сборку (по ENUM) assemblyStr = assembly.ToString(); enumGenericType = assembly.GetType (#OpenXmlGenericEnumValue); //тип DocumentFormat.OpenXml.EnumValue`1 assembly = null; if (CLRInterop::isNull(enumGenericType)) { enumType = null; throw error (strFmt(".net сборка '%1'(ENUM '%2') не содержит дженерик-тип %3", assemblyStr, enumTypeStr, #OpenXmlGenericEnumValue)); } //инициируем массив типов (с единственным элементом = enumType) enumTypes = new System.Type[1](); enumTypes.SetValue(enumType, 0); enumType = null; genericType = enumGenericType.MakeGenericType (enumTypes); //создаем generic DocumentFormat.OpenXml.EnumValue`1, приведенный к типу enumTypes enumGenericType = null; if (CLRInterop::isNull(genericType) || ! genericType.get_IsGenericType()) { throw error (strFmt("ENUM '%1' не является дженериком", enumTypeStr)); } constructorInfo = genericType.GetConstructor (enumTypes); //конструктор (для ENUM generic типа) genericType = null; enumTypes = null; //инициируем массив занчений значение ENUM (с единственным элементом= enumValueStr) enumValues = new System.Object[1](); enumValues.SetValue (CLRInterop::parseClrEnum(enumTypeStr, enumValueStr), 0); ret = constructorInfo.Invoke(enumValues); //создаем объект ENUM generic типа (с значением = enumValueStr) constructorInfo = null; enumValues = null; } catch { error (WMSCOMPrint::getClrErrorMessage()); } } return ret; } Цитата:
- метод создания дженерика еще немного подрихтовал(+ добавил комментарии)
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (10). |
Теги |
.net, ado, generic, net |
|
|