AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.10.2020, 14:40   #1  
decoder is offline
decoder
Участник
Аватар для decoder
 
63 / 15 (1) ++
Регистрация: 19.12.2008
Адрес: Москва
OpenXml. C# -> X++
Всем привет!
Вопрос чайника знатокам C#. Пытаюсь конвертировать следующий условно рабочий код:
X++:
private void InsertBookmarkText(BookmarkStart bookmark, string value)
{
     bookmark.Parent.InsertAfter(new Run(new Text(value)), bookmark);
}
Но в X++ получаю ошибку:
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  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Посмотрите на использование 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);
}
...
Есть правда один момент - почему то стандартный код у нас валился при выполнении в CIL из за типа элемента массива, пришлось слегка поправить, добавив строку в начале метода

X++:
...
if (xSession::isCLRSession())
{
    parameters = new Array(Types::AnyType);
}
...
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: decoder (1), Logger (5), gl00mie (5).
Старый 23.10.2020, 10:05   #3  
decoder is offline
decoder
Участник
Аватар для decoder
 
63 / 15 (1) ++
Регистрация: 19.12.2008
Адрес: Москва
Еще вопрос.

Как имея имя метки (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  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Судя по ссылкам вроде 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  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от decoder Посмотреть сообщение
Всем привет!
Вопрос чайника знатокам C#. Пытаюсь конвертировать следующий условно рабочий код:
X++:
private void InsertBookmarkText(BookmarkStart bookmark, string value)
{
     bookmark.Parent.InsertAfter(new Run(new Text(value)), bookmark);
}
Но в X++ получаю ошибку:
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
В итоге как получилось реализовать вставку текста по bookMark?
Старый 03.03.2023, 07:25   #6  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
а ответ товарища SRF на исходный пост вам не помог? какой у вас в результате код с invokeGeneric вышел?
Старый 03.03.2023, 08:10   #7  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Pandasama Посмотреть сообщение
а ответ товарища SRF на исходный пост вам не помог? какой у вас в результате код с invokeGeneric вышел?
код отрабатывает, но файл не меняется. То есть изменений нет. Хотя файл сохраняется
Старый 03.03.2023, 08:15   #8  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Pandasama Посмотреть сообщение
а ответ товарища SRF на исходный пост вам не помог? какой у вас в результате код с invokeGeneric вышел?
а код получился такой:
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  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Цитата:
Сообщение от IvanS Посмотреть сообщение
код отрабатывает, но файл не меняется. То есть изменений нет. Хотя файл сохраняется
Изменений нет или их не видно в офисе?
Размер, скажем, и дата изменения в файле если его открыть, запустить только ваш код и сохранить потом - остаются прежними?
Распаковывать файл в xml и сравнивать до/после не пробовали?
Старый 03.03.2023, 08:43   #10  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Pandasama Посмотреть сообщение
Изменений нет или их не видно в офисе?
Размер, скажем, и дата изменения в файле если его открыть, запустить только ваш код и сохранить потом - остаются прежними?
Распаковывать файл в xml и сравнивать до/после не пробовали?
Дата изменения обновляется, то есть файл сохранается, но не визуально в ворде, ни через архив XML изменений нет
Старый 07.03.2023, 23:19   #11  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от IvanS Посмотреть сообщение
Дата изменения обновляется, то есть файл сохранается, но не визуально в ворде, ни через архив XML изменений нет
Посмотрите ваш результирующий файл в... архиваторе, т.е. откройте \word\document.xml из файла docx как из zip-архива в текстовом редакторе/блокноте/notepad++ и посмотрите, правильные ли там namespace-ы у XML-тегов. Это можно определить по префиксам из заголовка XML-файла, у правильных тегов должен быть namespace http://schemas.openxmlformats.org/wo...ngml/2006/main. Если namespace по каким-либо причинам неправильный (т.е. теги Word-документа имеют префикс xmlns, относящийся к другому namespace-у), то Word эти данные "не увидит".
За это сообщение автора поблагодарили: Logger (3).
Теги
generic

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
palleagermark: OpenXML teaser Blog bot DAX Blogs 0 21.08.2015 16:11
emeadaxsupport: Documentation collection: Inplace upgrade MS Dynamcis AX 2012 RTM --> AX 2012 R2 CU7 Blog bot DAX Blogs 0 22.06.2014 01:19
AX2009 -> RU5 -> RU6 -> RU7 Pustik DAX: Прочие вопросы 8 21.05.2011 15:25
Dynamics AX Sustained Engineering: Sale Order Batch Invoicing reprints invoices from prior runs, when “Print” is set to ‘After’ on AR >> Periodic >> Sales Update >> Invoice form Blog bot DAX Blogs 0 24.03.2010 02:06
Заказов -> Строки заказов -> Запросы -> Пункт "Производство" Андре DAX: Программирование 1 20.09.2002 10:43

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:07.