OpenXml - итерация прогонов абзаца и поиск, есть ли в бегах курсив или полужирный текст

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

Какой лучший метод с точки зрения производительности.

2 ответа

Решение

Если вас интересуют только встроенные теги, следующий код может помочь. Просто измените метод Convert() на любой другой.

using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

class Program
{
    static void Main(string[] args)
    {
        using (var doc = WordprocessingDocument.Open(@"c:\doc1.docx", true))
        {
            foreach (var paragraph in doc.MainDocumentPart.RootElement.Descendants<Paragraph>())
            {
                foreach (var run in paragraph.Elements<Run>())
                {
                    if (run.RunProperties != null &&
                        (run.RunProperties.Bold != null && (run.RunProperties.Bold.Val == null || run.RunProperties.Bold.Val) ||
                        run.RunProperties.Italic != null && (run.RunProperties.Italic.Val == null || run.RunProperties.Italic.Val)))
                        Process(run);
                }
            }
        }
    }

    static void Process(Run run)
    {
        string text = run.Elements<Text>().Aggregate("", (s, t) => s + t.Text);
        run.RemoveAllChildren<Text>();
        run.AppendChild(new Text(Convert(text)));

    }

    static string Convert(string text)
    {
        return text.ToUpper();
    }
}

Это зависит от того, хотите ли вы считать унаследованные жирным шрифтом / курсивом из стилей или просто интересует встроенные теги жирным шрифтом / курсивом.

Другие вопросы по тегам