【发布时间】:2012-11-23 03:07:02
【问题描述】:
TL;DR 我可以使用 .NET 生成 Word 文档,例如 XAML ItemTemplates 吗?
我发现很难想出一个满足我所有要求的解决方案,所以我想我会把它扔到 stackoverflow 中,希望有人可以指导我。非常感谢。
简单地说,我需要根据数据库中的数据生成 Word 文档。
我的理想解决方案:我希望它像 DataTemplates 在 xaml 中一样工作。我发现了很多示例和解决方案,其中模板表示静态文档,需要替换一些(单个)动态内容。
问题是,我需要一个解决方案,我可以为层次结构的每个级别指定一个模板,并且文档生成器将使用这些项目级别模板来构建基于文档级别模板的最终文档。
我的具体要求是:
- 最好是.NET解决方案
- 服务器无需安装office
- 存在一个模板,它完全封装了文档的“视图”(不一定是 Word 模板),用户可以随意修改(当然在边界内)。这一点非常重要,因为用户需要通过直接修改 Word 模板来控制演示。
- 最好在每个数据层次结构中都有一个随附的模板。
- 页眉和页脚
- 目录
假设数据层次结构是这样的
class Country
{
public string Name { get; set; }
public IList<City> { get; set; }
}
class City
{
public string Name { get; set; }
public IList<Suburb> { get; set;}
}
class Suburb
{
public string Name { get; set; }
public int Postcode { get; set; }
}
在我看来,解决方案将是一个函数调用,它接受国家列表。
// returns path to generated document
public static string GenerateDocument(IList<Country> countries);
此函数将接受国家列表,并针对每个国家
- 使用为国家准备的模板来呈现国家数据。
- 对于国家/地区的每个城市,使用为城市准备的模板在国家/地区模板中显示城市数据
- 对于城市中的每个郊区,使用为郊区准备的模板在城市模板中呈现郊区数据。
最后,这些生成的文档“片段”将使用文档级模板累积到一个最终的 Word 文档中,该模板将指定标题页、页眉/页脚、TOC。
【问题讨论】:
-
docx文档是普通旧 XML 的 ZIP 存档。没有限制,你可以随意操作XML,甚至不需要安装Office,也不需要第三方库;只需在 Word 模板中围绕要充当 Country-、City-、Suburb-子模板的部分设置书签,手动打开docx以查看 XML 中的内容,然后以编程方式打开模板 XML,拉出带书签的部分,并将它们复制到尽可能多的国家/城市/等。你有。 -
好的,所以理论上我可以拥有这些项目级别的模板?所以在我看来,我认为您所说的是使用 OpenXMl 来加载节点,就像任何其他 XML 一样,并以编程方式查找并用内容替换“书签”存根?之后将节点插入到最终的文档模板中?
-
没错。如果您将
docx作为 zip 存档查看内部,您将看到word\document.xml,在那里您将看到例如<w:bookmarkStart w:id="0" w:name="country_template"/><w:p...><...>This is country #Country</...></w:p><w:bookmarkStart w:id="1" w:name="city_template"/><w:p...><...>This is city #City</...></w:p><w:bookmarkStart w:id="2" w:name="suburb_template"/><w:p...><...>This is suburb #Suburb</...></w:p><w:bookmarkEnd w:id="2"/><w:bookmarkEnd w:id="1"/><w:bookmarkEnd w:id="0"/> -
是的,正如@vladr 所说。您可能想花一些时间阅读 Eric White 在ericwhite.com/blog 和blogs.msdn.com/b/ericwhite 上的资料。另外,openxmldeveloper.org 也有很多文章。