【发布时间】:2021-05-10 18:36:15
【问题描述】:
我有一个需要生成 DOCX 的新项目。 我的客户为我提供了一个现有的 DOCX,我需要用数据库中的一些客户数据替换一些占位符。 好像这还不够具有挑战性,根据使用客户数据的某些条件,某些部分是可选的。所以我必须提供一些逻辑来完全省略 DOCX 的某些部分。
经过大量研究和一些 POC,我发现了一种新方法。 我已将 DOCX 保存为 Word XML 文档。这将创建一个包含所有内容的大型 XML 文件,甚至图像也被编码为 base64。之后,我将 XML 文件的内容复制到 T4 模板。这样做可以让我根据客户数据添加动态内容,并在我的代码中生成一个 Word XML 文档作为一个大字符串。
但现在我仍然坚持基于 Word XML 文档字符串再次创建 Docx。 我尝试过使用 OpenXml Sdk,但找不到任何关于如何执行此操作的真实文档。 经过一些实验,我最终得到了下面的代码,但它不解析 XML(根级别的数据无效。第 1 行,位置 1)。
作为第二次尝试,我尝试了another post 的一些建议,但这会导致另一个异常(XML 的内容无效,无法构造为元素。(参数'outerXml'))
有没有办法做到这一点,还是我应该离开 T4 模板并尝试另一种方法? T4 模板的另一个问题是一些图像的大小,它会导致一个长的 base64 字符串生成太多的行。我想我可以用占位符替换图像并在创建 XML 之前交换它们......
public FileData CreateDocx(string title, string xml)
{
using (MemoryStream generatedDocument = new MemoryStream())
{
using (WordprocessingDocument package =
WordprocessingDocument.Create(generatedDocument, WordprocessingDocumentType.Document))
{
var mainPart = package.AddMainDocumentPart();
//First attempt
//new Document(xml).Save(mainPart);
var doc = new XmlDocument();
doc.LoadXml(xml);
new Document(doc.OuterXml).Save(mainPart);
}
return new FileData(title, generatedDocument.ToArray());
}
}
【问题讨论】:
-
我认为microsoft.office.interop.word 拥有您需要的所有东西。
-
也许可以试试 DocX:github.com/xceedsoftware/DocX 它的 API 比微软干净得多
-
不鼓励在网络服务器上使用它吗?我必须在上面安装办公许可证才能使用图书馆。
-
@Thomas 我可以尝试一下,因为它可以解决一些问题,但我如何能够根据条件从文档中删除部分?你有我可以使用的例子吗?
-
这解释了如何准备你的模板:ericwhite.com/blog/… 这个展示了如何转换模板:github.com/EricWhiteDev/Open-Xml-PowerTools/blob/vNext/…
标签: c# openxml docx t4 openxml-sdk