2012-07-20 115 views
0

我正在处理原型以取代现有的基于字词自动化的模板呈现系统,并且目前正在评估OpenXML SDK。模板库相当广泛(150-200个模板,由非技术资源维护),所以我希望避免任何模板更改,而不是从1997-2003文字格式升级。通过API和文本操作修改OpenXML Word文档

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

我能够使用类似于this MSDN article中描述的技术进行直接文本替换。我的情况稍微复杂一些,但看起来是这样的:

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添加图像。使用another MSDN article描述的技术:

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是字面上的代码复制/粘贴那篇文章(我知道这些抽象的不是最好的,但我只是试图让事情在这个工作点)。

现在它变得毛茸茸的 - 文件APPEARS保持同步。该图像是第一个被替换的标签,并且标签的文本替换工作,就像在文档底部添加图像一样。我的问题是,在这一点之后,后续的文本替换看起来没有任何作用 - 所有其他标签都保留在文档中。但是,如果我在文本替换函数中设置了断点,则每次调用.GetCurrentText()都会返回正确的结果(文本的标签已被替换)。但是,当我保存文档时,仅保留第一个替换文件即可保存文档。

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

回答

3

如果我我会去了解一下

http://docx.codeplex.com

,你的很多更直接用于一般的东西..也许你正在做的事情更复杂,则库可以处理,但我会高清拍摄看它。

+0

谢谢 - 我怀疑它可能无法处理一些更复杂的情况(我甚至没有尝试将图片插入文档中的正确位置),但它绝对值得研究。至少它会让我暂时摆脱OpenXML API的冲击 – AlexCuse 2012-07-20 18:42:24

+0

OpenXML API是一种野兽 – 2012-07-20 18:43:45

+0

是的,我注意到 - 自从我阅读您的评论后,它能够在DocX中获得文本替换的工作,并且它似乎*有一定的支持与图像处理,所以我越过我的手指,这将工作。由于质量保证问题,我仍然赞成aspose(会让我们随着时间的推移升级模板),但我很高兴有这样一个体面的包装! – AlexCuse 2012-07-20 19:30:29