|
|
#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 |
|
|
|
|
#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). | |
|
|
#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; } |
|
|
|
|
#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). | |
|
|
#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 |
|
|
|
|
#6 |
|
Участник
|
а ответ товарища SRF на исходный пост вам не помог? какой у вас в результате код с invokeGeneric вышел?
|
|
|
|
|
#7 |
|
Участник
|
|
|
|
|
|
#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); |
|
|
|
|
#9 |
|
Участник
|
Цитата:
Размер, скажем, и дата изменения в файле если его открыть, запустить только ваш код и сохранить потом - остаются прежними? Распаковывать файл в xml и сравнивать до/после не пробовали? |
|
|
|
|
#10 |
|
Участник
|
Дата изменения обновляется, то есть файл сохранается, но не визуально в ворде, ни через архив XML изменений нет
|
|
|
|
|
#11 |
|
Участник
|
Цитата:
|
|
|
|
| За это сообщение автора поблагодарили: Logger (3). | |
| Теги |
| generic |
|
|
|