TL;DR 我能否像XAML ItemTemplates一样使用.NET生成Word文档?
我发现很难找到一个满足所有需求的解决方案,所以我想在stackoverflow上问问,希望有人可以指导我。非常感谢。
简单来说,我需要根据数据库中的数据生成Word文档。
我的理想解决方案:我希望它的工作方式类似于XAML中的DataTemplates。我找到了很多示例和解决方案,其中模板表示静态文档,其中包含一些需要替换的(单个)动态内容。
问题在于,我需要一种解决方案,可以为层次结构的每个级别指定模板,文档生成器将使用这些项目级别模板基于文档级模板构建最终文档。
我的具体要求是:
- 最好使用.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);
这个函数将接受国家列表,并针对每个国家:
- 使用预设的“Countries”模板来呈现该国家的数据。
- 对于每个城市,在国家模板内使用预设的“Cities”模板来呈现城市数据。
- 对于每个郊区,在城市模板内使用预设的“Suburbs”模板来呈现郊区数据。
docx
文档是普通旧的XML的ZIP存档。天空是极限,您可以随意操纵XML,甚至无需安装Office,也无需第三方库;只需在Word模板中设置书签,围绕要作为国家、城市、郊区子模板的部分,手动打开docx
以查看在XML中的外观,然后以编程方式打开模板XML,提取书签部分,并为您拥有的所有国家/城市等复制它们。 - vladrdocx
文件дҢњдёғ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