21.10.2020, 14:40 | #1 |
Участник
|
OpenXml. C# -> X++
Всем привет!
Вопрос чайника знатокам C#. Пытаюсь конвертировать следующий условно рабочий код: X++: private void InsertBookmarkText(BookmarkStart bookmark, string value) { bookmark.Parent.InsertAfter(new Run(new Text(value)), bookmark); } X++: private void insertBookmarkText( DocumentFormat.OpenXml.Wordprocessing.BookmarkStart _bookmark, System.String _value) { DocumentFormat.OpenXml.OpenXmlElement parent; DocumentFormat.OpenXml.Wordprocessing.Run run; DocumentFormat.OpenXml.Wordprocessing.Text text; ; parent = _bookmark.get_Parent(); text = new DocumentFormat.OpenXml.Wordprocessing.Text(_value); run = new DocumentFormat.OpenXml.Wordprocessing.Run(text); parent.InsertAfter(run, _bookmark); //Здесь ошибка: Аргумент 1 несовместим с требуемым типом } DAX2012 R3 |
|
21.10.2020, 15:33 | #2 |
Участник
|
Посмотрите на использование OXML_RU\invokeGeneric в приложении.
Например, вот так используется при добавлении нового листа OxmlWorkBook_RU\insertSheet : X++: ... Array parameters = new Array(Types::Class); DocumentFormat.OpenXml.Spreadsheet.Sheet newSheet, sheetAfter; ... newSheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet(); ... if (sheetAfter) { parameters.value(1, newSheet); parameters.value(2, sheetAfter); OXML_RU::invokeGeneric(sheets, 'InsertAfter', newSheet.GetType(), parameters); } else { OXML_RU::appendChild(sheets, newSheet); } ... X++: ... if (xSession::isCLRSession()) { parameters = new Array(Types::AnyType); } ...
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: decoder (1), Logger (5), gl00mie (5). |
23.10.2020, 10:05 | #3 |
Участник
|
Еще вопрос.
Как имея имя метки (EDT Bookmark) получить DocumentFormat.OpenXml.Wordprocessing.BookmarkStart ? Что-то типа: X++: public static DocumentFormat.OpenXml.Wordprocessing.BookmarkStart bookmark2BookmarkStart( Bookmark _bookmark) { DocumentFormat.OpenXml.Wordprocessing.BookmarkStart ret; DocumentFormat.OpenXml.StringValue stringValue; ; stringValue = OXML_RU::setStringValue(_bookmark); ret = new DocumentFormat.OpenXml.Wordprocessing.BookmarkStart(); ret.set_Id(stringValue); ret.set_Name(stringValue); return ret; } |
|
23.10.2020, 11:03 | #4 |
Участник
|
Судя по ссылкам вроде https://stackoverflow.com/questions/...g-open-xml-sdk надо в коллекции типа doc.MainDocumentPart.RootElement.Descendants<BookmarkStart> найти элемент с нужным Name
Код: Public static void ReplaceBookmarkParagraphs(WordprocessingDocument doc, string bookmark, string text) { //Find all Paragraph with 'BookmarkStart' var t = (from el in doc.MainDocumentPart.RootElement.Descendants<BookmarkStart>() where (el.Name == bookmark) && (el.NextSibling<Run>() != null) select el).First(); //Take ID value var val = t.Id.Value; //Find the next sibling 'text' OpenXmlElement next = t.NextSibling<Run>(); //Set text value next.GetFirstChild<Text>().Text = text; //Delete all bookmarkEnd node, until the same ID deleteElement(next.GetFirstChild<Text>().Parent, next.GetFirstChild<Text>().NextSibling(), val, true); } |
|
|
За это сообщение автора поблагодарили: decoder (1). |
02.03.2023, 18:05 | #5 |
Участник
|
Цитата:
Сообщение от decoder
Всем привет!
Вопрос чайника знатокам C#. Пытаюсь конвертировать следующий условно рабочий код: X++: private void InsertBookmarkText(BookmarkStart bookmark, string value) { bookmark.Parent.InsertAfter(new Run(new Text(value)), bookmark); } X++: private void insertBookmarkText( DocumentFormat.OpenXml.Wordprocessing.BookmarkStart _bookmark, System.String _value) { DocumentFormat.OpenXml.OpenXmlElement parent; DocumentFormat.OpenXml.Wordprocessing.Run run; DocumentFormat.OpenXml.Wordprocessing.Text text; ; parent = _bookmark.get_Parent(); text = new DocumentFormat.OpenXml.Wordprocessing.Text(_value); run = new DocumentFormat.OpenXml.Wordprocessing.Run(text); parent.InsertAfter(run, _bookmark); //Здесь ошибка: Аргумент 1 несовместим с требуемым типом } DAX2012 R3 |
|
03.03.2023, 07:25 | #6 |
Участник
|
а ответ товарища SRF на исходный пост вам не помог? какой у вас в результате код с invokeGeneric вышел?
|
|
03.03.2023, 08:10 | #7 |
Участник
|
|
|
03.03.2023, 08:15 | #8 |
Участник
|
Цитата:
X++: runElement = new DocumentFormat.OpenXml.Wordprocessing.Run(new DocumentFormat.OpenXml.Wordprocessing.Text("рогаУндКопыта")); parameters = new Array(Types::Class); parameters.value(1, runElement); parameters.value(2, bookmarkStart); OXML_RU::invokeGeneric(paragraph, "InsertAfter", runElement.GetType(), parameters); |
|
03.03.2023, 08:40 | #9 |
Участник
|
Цитата:
Размер, скажем, и дата изменения в файле если его открыть, запустить только ваш код и сохранить потом - остаются прежними? Распаковывать файл в xml и сравнивать до/после не пробовали? |
|
03.03.2023, 08:43 | #10 |
Участник
|
Дата изменения обновляется, то есть файл сохранается, но не визуально в ворде, ни через архив XML изменений нет
|
|
07.03.2023, 23:19 | #11 |
Участник
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: Logger (3). |
Теги |
generic |
|
|