MyTetra Share
Делитесь знаниями!
Замена слов в docx
Время создания: 04.09.2019 18:55
Автор: stackoverflow.com
Текстовые метки: c#, парсер docx
Раздел: Компьютер - C# - MSWord - Open XML SDK
Запись: Kozlov-AE/Tetra/master/base/1563881446hznjlrghmt/text.html на raw.githubusercontent.com

Вариант через Open XML SDK 2.5 для .docx. Требуется ссылка на сборку WindowsBase и самSDK. Microsoft Office не требуется для работы. Проблема только в одном - InnerText элемента Paragraph менять напрямую нельзя, только через элементы Run, в которых и хранится сам текст, то есть при замене в данном случае теряется форматирование текста, которое хранится в RunProperties. Разбираться в коде и классах SDK проще всего через рефлектор файлов в код ссылка.


using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Text.RegularExpressions;

using DocumentFormat.OpenXml.Packaging;

using DocumentFormat.OpenXml.Wordprocessing;

using Paragraph = DocumentFormat.OpenXml.Wordprocessing.Paragraph;

using Run = DocumentFormat.OpenXml.Wordprocessing.Run;

using Text = DocumentFormat.OpenXml.Wordprocessing.Text;


namespace TestC

{

class Program

{

static void Main(string[] args)

{

string initialPath = @"C:\Users\User\Documents\TestDocument.docx";

string resultPath = @"C:\Users\User\Documents\TestDocument_result.docx";

File.Copy(initialPath, resultPath, overwrite: true);


Dictionary<string, string> marks = new Dictionary<string, string>()

{

{ "FirstName","Иван"},

{ "LastName","Иванов"},

{ "Date",DateTime.Now.ToLongDateString()},

{ "Initials","Иван И. И."},

{ "DateIssued",DateTime.Now.AddDays(5).ToLongDateString()}

};


using (WordprocessingDocument document = WordprocessingDocument.Open(resultPath, true)) {

Body documentBody = document.MainDocumentPart.Document.Body;

List<Paragraph> paragraphsWithMarks = documentBody.Descendants<Paragraph>().Where(x => Regex.IsMatch(x.InnerText, @".*\[\w+\].*")).ToList();

foreach (Paragraph paragraph in paragraphsWithMarks) {

foreach (Match markMatch in Regex.Matches(paragraph.InnerText, @"\[\w+\]", RegexOptions.Compiled)) {


string paragraphMarkValue = markMatch.Value.Trim(new[] { '[', ']' });

string markValueFromCollection;

if (marks.TryGetValue(paragraphMarkValue, out markValueFromCollection)) {

string editedParagraphText = paragraph.InnerText.Replace(markMatch.Value, markValueFromCollection);

paragraph.RemoveAllChildren<Run>();

paragraph.AppendChild<Run>(new Run(new Text(editedParagraphText)));

}

}

}

}

}

}

}






Так же в этом разделе:
 
MyTetra Share v.0.55
Яндекс индекс цитирования