Как Вы изменяете содержание довольного управление в Word 2007 с OpenXml SDK 2.0?

Собираясь сойти с ума с этой проблемой. Я уверен, что это настолько просто, я просто пропускаю его, но я не могу ни за что в жизни узнать, как изменить содержание довольного управление в Word 2007 с OpenXml SDK v2.0 в C#.

Я создал документ Word с управлением содержанием простого текста. Тег для этого управления является "FirstName". В коде я хотел бы открыть документ Word, найти этот довольным управление и изменить содержание, не теряя форматирование.

Решение я наконец взялся за работу включенное нахождение довольного управление, вставив бежавший это, затем удалив довольное управление как таковое:

using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(filePath, true)) {
MainDocumentPart mainDocumentPart = wordProcessingDocument.MainDocumentPart;
SdtRun sdtRun = mainDocumentPart.Document.Descendants<SdtRun>()
 .Where(run => run.SdtProperties.GetFirstChild<Tag>().Val == "FirstName").Single();

if (sdtRun != null) {
 sdtRun.Parent.InsertAfter(new Run(new Text("John")), sdtRun);
 sdtRun.Remove();
}

Это действительно изменяет текст, но я теряю все форматирование. Кто-либо знает, как я могу сделать это?

7
задан Jason 15 January 2010 в 23:51
поделиться

4 ответа

Я нашел лучший способ сделать вышеупомянутое использование http://wiki.threewill.com/display/enterprise/sharepoint =+Open+xml#sharepointandOpenxml-ussword2007ContententControls в качестве ссылки. Ваши результаты могут отличаться, но я думаю, что это уйдет вас к хорошему статую:

using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(filePath, true)) {
    var sdtRuns = mainDocumentPart.Document.Descendants<SdtRun>()
        .Where(run => run.SdtProperties.GetFirstChild<Tag>().Val.Value == contentControlTagValue);

    foreach (SdtRun sdtRun in sdtRuns) {
        sdtRun.Descendants<Text>().First().Text = replacementText;
    }

    wordprocessingDocument.MainDocumentPart.Document.Save();
}

Я думаю, что вышеприведенное будет работать только для элементов управления контентами. К сожалению, он не избавляется от контроля контента в окончательном документе. Если я получу эту работу, я опубликую это.

http://msdn.microsoft.com/en-us/library/cc197932.aspx также является хорошим ссылкой, если вы хотите найти богатый контроль контента текста. Этот разговаривает о добавлении рядов в таблицу, которая была помещена в богатый контроль контента текста.

7
ответ дан 6 December 2019 в 14:04
поделиться

Ваш код не делает то, что я думаю, вы думаете, что это делает. Строка для элемента в Z: будет осуществляться через Z , каждый раз, когда разрабатывает элемент , равный одному элементу Z . Поэтому оригинал пункт , поэтому перезаписывается до того, как вы что-либо сделаете с ним.

Я думаю, что вы хотите что-то вроде этого:

item = [0,1,2,3,4,5,6,7,8,9]

for element in item:
    if element not in z:
        print element

, но вы могли бы легко сделать это, как:

[x for x in item if x not in z]

или (если вы не возражаете в том, чтобы потерять дубликаты не уникальных элементов):

set(item) - set(z)
-121--982926-

Мне также пришлось найти и заменить текст в нижних колонтитулах. Вы можете найти их, используя следующий код:

using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(file.PhysicalFile.FullName, true)) {
    foreach (FooterPart footerPart in wordprocessingDocument.MainDocumentPart.FooterParts) {
        var footerPartSdtRuns = footerPart.Footer.Descendants<SdtRun>()
            .Where(run => run.SdtProperties.GetFirstChild<Tag>().Val.Value == contentControlTag);

        foreach (SdtRun sdtRun in footerPartSdtRuns) {
           sdtRun.Descendants<Text>().First().Text = replacementTerm;
        }
    }

    wordprocessingDocument.MainDocumentPart.Document.Save();
}
1
ответ дан 6 December 2019 в 14:04
поделиться

Одним из превосходных способов выработки того, как добиться желаемого результата - использовать инструмент рефлектора документов, который поставляется с открытым XML SDK 2.0 ....

Например, вы можете:

  1. В диалоговом окне свойств для каждого элемента управления контентами в вашем документе проверьте «Удалить элемент управления контентом при редактировании содержимого».
  2. Заполните их и сохраните его как новый документ.
  3. Используйте отражатель для сравнения оригинала и сохраненной версии.
  4. Нажмите кнопку Show / Hide Code, и она покажет вам код, необходимый для поворота оригинала в заполненную версию.

Это не идеально, но это удивительно полезно. Вы также можете просто посмотреть непосредственно на разметку любого документа и увидеть изменения, вызванные наполнением элементов управления.

Это несколько хрупкий способ сделать это, потому что словопроцессирующее ML может быть сложно; Легко испортить это. Для простых текстовых элементов управления я просто использую этот метод:

private void FillSimpleTextCC(SdtRun simpleTextCC, string replacementText)
    {
        // remove the showing place holder element      
        SdtProperties ccProperties = simpleTextCC.SdtProperties;
        ccProperties.RemoveAllChildren<ShowingPlaceholder>();

        // fetch content block Run element            
        SdtContentRun contentRun = simpleTextCC.SdtContentRun;
        var ccRun = contentRun.GetFirstChild<Run>();

        // if there was no placeholder text in the content control, then the SdtContentRun
        // block will be empty -> ccRun will be null, so create a new instance
        if (ccRun == null)
        {
            ccRun = new Run(
                new RunProperties() { RunStyle = null },
                new Text());
            contentRun.Append(ccRun);
        }

        // remove revision identifier & replace text
        ccRun.RsidRunProperties = null;
        ccRun.GetFirstChild<Text>().Text = replacementText;

        // set the run style to that stored in the SdtProperties block, if there was
        // one. Otherwise the existing style will be used.            
        var props = ccProperties.GetFirstChild<RunProperties>();
        if (props != null)
        if (props != null)
        {
            RunStyle runStyle = props.RunStyle;
            if (runStyle != null)
            {
                // set the run style to the same as content block property style.
                var runProps = ccRun.RunProperties;
                runProps.RunStyle = new RunStyle() { Val = runStyle.Val };
                runProps.RunFonts = null;
            }
        }
    }

Надеюсь, что это каким-то образом помогает. : D

3
ответ дан 6 December 2019 в 14:04
поделиться

Ваш первый подход Чтобы удалить SDTRUN и добавление нового, очевидно, удалит форматирование, поскольку вы добавляете только бега, но не RunStyle. Чтобы сохранить форматирование, вы должны создавать элементы запуска, такие как

new Run( new RunProperties(new RunStyle(){ Val = "MyStyle" }),
                            new Text("Replacement Text"));

Ваш второй подход к замене всех , заменители будут работать на элемент управления контентом простого текста, только потому, что насыщенное управление контентом для текста не имеет элемента SDTRUN. Богатый контроль контента текста - SDTBLOCK с элементами SDTContent. Богатый контроль контента текста может иметь несколько абзацев, несколько прогонов и несколько текстов. Итак, ваш код SDTRUN.DESCENDANTANTS (). First (). Text = stextext , будет ошибочно для богатого элемента управления контентом текста. Нет ни одного строкового кода для замены всего текста богатого контроля контента и еще сохраняет все форматирование.

Я не понял, что вы подразумеваете под «оно не избавляется от контроля контента в окончательном документе»? Я думал, что ваше требование здесь состоит в том, чтобы изменить текст (контент) только путем сохранения контроля контента и форматирования.

3
ответ дан 6 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: