C# OpenXML在Word文档中查找变量并替换它们
我需要搜索文档中包含的字符串。因此,如果应用程序在文档中找到该变量,它将用DateTime.Today.ToSortDateString替换该变量。例如:C# OpenXML在Word文档中查找变量并替换它们,c#,asp.net,openxml,openxml-sdk,C#,Asp.net,Openxml,Openxml Sdk,我需要搜索文档中包含的字符串。因此,如果应用程序在文档中找到该变量,它将用DateTime.Today.ToSortDateString替换该变量。例如: string filename = "C:\\Temp\\" + appNum + "_ReceiptOfApplicationLtr.docx"; if (File.Exists((string)filename)) { using (WordprocessingDocument wordDoc = WordprocessingDo
string filename = "C:\\Temp\\" + appNum + "_ReceiptOfApplicationLtr.docx";
if (File.Exists((string)filename))
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(filename, true))
{
var body = wordDoc.MainDocumentPart.Document.Body;
foreach (var text in body.Descendants<Text>())
{
if (text.Text == "<TodaysDate>")
{
text.Text = text.Text.Replace("<TodaysDate>", DateTime.Today.ToShortDateString());
}
}
using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
{
sw.Write(filename);
}
}
}
当它搜索后代文本时,它会找到第一个。问题是它找不到字符串。有人能帮我吗?Open XML可以在同一次运行中以不同的文本标记存储文本。如果我是您,我会做的就是找到存储字符串的运行,并使用InnerText属性查找该运行中的所有文本。 例如:
Run runToFind = body.Descendants<Run>()
.FirstOrDefault(r => r.Innertext.Contains("<TodaysDate>");
对于仍在努力解决此问题的任何人,您可以查看此库 使用它,您可以在文档中添加内容控件,并在内容控件的标记名中指定要替换的变量的名称,而不是因为Thomas Barnekow的注释中指定的问题而在文本中搜索特殊标记 然后,您可以提供JSON数据或常规的C字典对象,文本将被替换
注意-我是该库的创建者,但我没有从中获得任何财务收益-它是开源的,正在积极开发中,并且始终在寻找贡献者 例如,如果您希望将其用于由Microsoft Word生成或使用Microsoft Word编辑的文档,则此答案不正确。虽然标准允许w:r元素运行实例包含多个w:t元素文本实例,但w:r元素通常最多包含一个w:t元素。因此,如果文本被拆分为多个w:t元素,那么它很可能也被拆分为多个w:r元素。请查看Microsoft Word生成的标记以确认这一点。
runToFind.Parent.Replace(new Run(new Text(DateTime.Now.ToShortDateString())),runToFind);