在OPENXML中搜索并替换文本(添加文件)

时间:2015-05-17 10:33:08

标签: c# ms-word openxml openxml-sdk

我知道它上面有很多帖子,但是我的问题没有任何效果: 我使用OPENxml创建word文档,我在创建过程中向文档中添加了一些现成文件。我想在文档准备好后更改我添加的文件中的一些文本。这就是我的尝试: 首先创建文档:

fileName = HttpContext.Current.Server.MapPath("~/reports/"+fileName+".docx");
using (var doc = WordprocessingDocument.Create(
    fileName, WordprocessingDocumentType.Document))
{
    ///add files and content inside the document
    addContentFile("template1part1", HttpContext.Current.Server.MapPath("~/templates/template1part1.docx"), mainPart);
}

这就是我添加文件的方式:

private static void addContentFile(string id,string path, MainDocumentPart mainPart){
    string altChunkId = id;
    AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(
        AlternativeFormatImportPartType.WordprocessingML, altChunkId);
    using (FileStream fileStream = File.Open(path, FileMode.Open))
    {
        chunk.FeedData(fileStream);
        fileStream.Close();
    }
    AltChunk altChunk = new AltChunk();
    altChunk.Id = altChunkId;
    mainPart.Document.Body.Append(altChunk);
    mainPart.Document.Save();
}

这就是我在创建文件后尝试替换文本的方法(在我完成使用WordprocessingDocument之后)

首先尝试:

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
    string docText = null;
    using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
        docText = sr.ReadToEnd();

    docText = new Regex(findText, RegexOptions.IgnoreCase).Replace(docText, replaceText);

    using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
        sw.Write(docText);
}

第二次尝试:

using ( WordprocessingDocument doc =
    WordprocessingDocument.Open(@"yourpath\testdocument.docx", true))
    {
        var body = doc.MainDocumentPart.Document.Body;
        var paras = body.Elements<Paragraph>();

        foreach (var para in paras)
        {
            foreach (var run in para.Elements<Run>())
            {
                foreach (var text in run.Elements<Text>())
                {
                    if (text.Text.Contains("text-to-replace"))
                    {
                        text.Text = text.Text.Replace("text-to-replace", "replaced-text");
                    }
                }
            }
        }
    }
}

他们都没有工作,我尝试了更多。 它适用于我手动添加到文档中的文本,但它现在正在处理我从ready文件中添加的文本。  还有办法吗?

1 个答案:

答案 0 :(得分:0)

添加文件的方式是使用altchunck s。但是,您正在尝试替换内容,就好像您要修改生成的文档openxml一样。

将文档合并为altchuncks时,基本上将它们作为嵌入式外部文件添加到原始文档中,而不是openxml标记。这意味着您无法将其他附加文档视为openxml文档。

如果您想要实现您正在尝试的目标,您必须按照我在此处的答案中所述合并文档 - https://stackoverflow.com/a/18352219/860243,这会使得到的文档成为正确的openxml文档。这允许您随后根据需要进行修改。