我正在开发原型以替换现有的基于文字自动化的模板渲染系统,目前正在评估 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() 都会返回正确的结果(到该点为止的标记的文本已被替换)。但是当我保存文档时,它只保存了第一次替换。
有没有人遇到过这样的事情?下一步将尝试分阶段的方法(解决所有标签,首先运行直接文本替换,然后进行所有图像替换),但我觉得目前的任何错误都将成为问题,无论顺序如何。