|
|||||||
Замена слов в 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))); } } } } } } } |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|