Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OpenXML在Word文档中查找变量并替换它们_C#_Asp.net_Openxml_Openxml Sdk - Fatal编程技术网

C# OpenXML在Word文档中查找变量并替换它们

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

我需要搜索文档中包含的字符串。因此,如果应用程序在文档中找到该变量,它将用DateTime.Today.ToSortDateString替换该变量。例如:

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);