OpenXML Удалить текст из шаблона - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть несколько шаблонов .docx, которые клиенты скачивают, но определенные слова необходимо изменить или удалить из документа для разных клиентов.Я не могу найти ничего о том, как удалить текст: -

using (WordprocessingDocument doc = WordprocessingDocument.Open(memoryStream, true))
{
  foreach (Text element in doc.MainDocumentPart.Document.Body.Descendants<Text>())
  {
   //This is fine
   element.Text = element.Text.Replace("DocumentDate", wordReferenceTemplatesMV.DocumentDate)

   //Need help on how to remove text 
   element.Text = element.Text.Remove???("TextToRemove")
}

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

Я не думаю, что это элемент абзаца, вызывающий пустую строку при удалении.

Клиенты отправляют через шаблон с адресным блоком как: -

[address1]

[адрес2]

[город]

[город]

[штат]

[почтовый индекс]

полязаполняется из базы данных функцией замены, но если адрес не содержит значение [address2], это то, что мне нужно удалить.Если я удалю текст, у меня все еще останется пустая строка между [адрес1] и [город].Поле [address2] не находится в собственном абзаце.

0 голосов
/ 19 сентября 2018

Если вам больше не нужен элемент, вы можете удалить весь элемент:

using (WordprocessingDocument doc = WordprocessingDocument.Open(memoryStream, true))
{
    foreach (Text element in doc.MainDocumentPart.Document.Body.Descendants<Text>())
    {
        if (element.Text == "TextToRemove")
            element.Remove();
    }
}

Редактировать

Если у вас осталосьпустая строка, скорее всего, у вас есть Paragraph, в котором содержится Text.В этом случае вы хотите удалить Paragraph, вместо этого вы можете сделать:

if (element.Text == "TextToRemove")
    element.Parent.Remove();
0 голосов
/ 19 сентября 2018

Большинство текстовых значений находятся в элементе Run.По сути, вы можете бегать по всем элементам Run и проверять их текст.это должно быть что-то вроде:

Body body = wordprocessingDocument.MainDocumentPart.Document.Body;
foreach (Run r in body.Descendants<Run>())
{
    string sText = r.InnerText ;
    //...compare the text with the value
    //note sometime, you could see the text be broken into two runs, you need to find a way based on your requirements and connect them.    }

, если вы хотите удалить текст, вы можете просто удалить прогон.вызовите метод run () remove ().

r.Remove();

Подробнее о прогонах и текстовом объекте,

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

if( r.RunProperties.Highlight.Val == DocumentFormat.OpenXml.Wordprocessing.HighlightColorValues.Yellow )
{
    string sText = r.InnerText ;
    ....
}

Надеюсь, это поможет.

0 голосов
/ 18 сентября 2018

Почему бы просто не заменить ее пустой строкой?

element.Text = element.Text.Replace("TextToRemove", string.Empty);
...