通过API和文本操作修改OpenXML Word文档



我正在开发原型,以取代现有的基于单词自动化的模板渲染系统,目前正在评估OpenXML SDK。模板库相当广泛(150-200个模板,由非技术资源维护),所以我希望避免任何模板更改,而不是从1997-2003单词格式升级。

当前嵌入的标签有时需要用文本替换,有时需要用图像/图表等替换。。。(现在假设所有图表都将在插入之前渲染为图像)。

我能够使用与MSDN文章中描述的技术类似的技术来进行直接文本替换。我的场景稍微复杂一些,但看起来像这样:

    public void ReplaceFirstOccurrenceWithText(string tagBody, string replacement)
    {
        var modifiedText = GetCurrentText();
        modifiedText = modifiedText.ReplaceFirst(tagBody, XmlEncoder.Encode(replacement));
        using (var sw = new StreamWriter(document.MainDocumentPart.GetStream(FileMode.Create)))
        {
            sw.Write(modifiedText);
        }
    }
    public string GetCurrentText()
    {
        using(var reader = new StreamReader(document.MainDocumentPart.GetStream()))
        {
            return reader.ReadToEnd();
        }
    }

我之所以不保存字符串,是因为我希望基础文档保持最新,这样我就可以通过普通的API添加图像。使用MSDN另一篇文章中描述的技术:

    public void ReplaceFirstOccurrenceWithImage(string tagBody, byte[] replacement)
    {
        ReplaceFirstOccurrenceWithText(tagBody, "IMAGE TAG WAS HERE!");
        var main = document.MainDocumentPart;
        var imagePart = main.AddImagePart(ImagePartType.Gif);//sniff this by loading bytes into a bitmap
        using(var imageStream = new MemoryStream(replacement))
        {
            imagePart.FeedData(imageStream);
        }
        ImageInserter.AddImageToBody(document, main.GetIdOfPart(imagePart));
    }

ImageInserter实际上是这篇文章中代码的复制/粘贴(我意识到这些抽象并不是最好的,但我只是想在这一点上让任何东西发挥作用)。

现在是它变得棘手的地方——文档看起来保持同步。图像是第一个被替换的标记,标记的文本替换和在文档底部添加图像一样有效。我的问题是,在这一点之后,后续的文本替换似乎根本不起作用——所有其他标记都保留在文档中。然而,如果我在文本替换函数中设置了一个断点,那么每次调用.GetCurrentText()都会返回正确的结果(到该点为止带有标记的文本已被替换)。但当我保存文档时,它只保存了第一次替换。

有人遇到过这样的事吗?下一步将尝试分阶段的方法(解决所有标签,首先运行直接文本替换,然后进行所有图像替换),但我觉得无论顺序如何,当前出现的问题都将是一个问题。

如果我在哪里,我会查看

http://docx.codeplex.com

对于一般的东西来说,它要直接得多。。也许你正在做一些比库所能处理的更复杂的事情,但我会去看看。

最新更新