利用類別產生XSD檔
產出XSD檔的目的在於提供Word樣板設計之資料框架
在此使用微軟提供之XML Schema Definition Tool (Xsd.exe)工具產生XSD檔
1. 定義類別
04 |
public string BookId { get; set; } |
05 |
public string Name { get; set; } |
06 |
public string price { get; set; } |
12 |
public string BuyerName { get; set; } |
13 |
public List<Book> Books { get; set; } |
14 |
public int TotalPrice { get; set; } |
2. 使用Xsd.exe工具產生XSD檔案
工具位置: C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools
工具語法: xsd D:\Projects\WordGenerator.exe /language:CS /outputdir:d:\Projects\Xsd /type:Order
3. XSD內容如下
01 |
<?xml version="1.0" encoding="utf-8"?> |
03 |
<xs:element name="Order" nillable="true" type="Order" /> |
04 |
<xs:complexType name="Order"> |
06 |
<xs:element minOccurs="0" maxOccurs="1" name="BuyerName" type="xs:string" /> |
07 |
<xs:element minOccurs="0" maxOccurs="1" name="Books" type="ArrayOfBook" /> |
08 |
<xs:element minOccurs="1" maxOccurs="1" name="TotalPrice" type="xs:int" /> |
11 |
<xs:complexType name="ArrayOfBook"> |
13 |
<xs:element minOccurs="0" maxOccurs="unbounded" name="Book" nillable="true" type="Book" /> |
16 |
<xs:complexType name="Book"> |
18 |
<xs:element minOccurs="0" maxOccurs="1" name="BookId" type="xs:string" /> |
19 |
<xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" /> |
20 |
<xs:element minOccurs="0" maxOccurs="1" name="price" type="xs:string" /> |
4. 加上Namespace
targetNamespace=http://schemas.chris.com/WordGenerator/Order.xsd
xmlns=http://schemas.chris.com/WordGenerator/Order.xsd

利用XSD檔產生特定格式之Word檔
筆者是以Word 2010進行實作,相關實作畫面如下。另外,若使用Word 2013的朋友是無法透過此方法自行定義XML標記的,因為移除自訂 XML 標記是2009年12月22日美國法院的判決結果,購買或取得 Word 2013 授權的客戶會發現此軟體不含特定的自訂 XML 標記實作;所以請使用非Word2013版本來實作此步驟。
http://support.microsoft.com/kb/2761189/zh-tw
1. 加入開發人員工具列

2. 點選開發人員工具列之結構描述

3. 選擇剛產生之XSD檔案



4. 開始編輯畫面與資料關聯
目前希望呈現的樣式(黃色是隨資料異動部分)

點選結構後,產生XML結構工具


圈選Order對應部分後,點選Order

此時會出現選取範圍,就選擇僅套用至選取範圍即可

此時就完成了第一次的資料對應關係

然後依序處理其他部分,結果如下

此時若發現有錯誤發生

調整一下XML選項設定即可


調整完畢後儲存為DOC檔案供下次修改使用
利用特定格式之Word檔產生XSLT檔
1. 下載安裝 Word 2003: XML SDK
http://www.microsoft.com/downloads/details.aspx?familyid=ca83cb4f-8dee-41a3-9c25-dd889aea781c&displaylang=en
2. 將Word檔另存為XML

3. 利用WML2XSLT.exe 將 Order.xml 轉換成 Order.xslt

點選所需的namespace即可

組合資料產生Word檔
資料 + 顯示樣式
= 資料物件序列化(XML) + XSLT
= 產生具有資料及指定樣式Word檔
01 |
private void CreateWord() |
04 |
string xsltLocation = @"D:\Order.xslt"; |
05 |
string outputPath = @"D:\Order.doc"; |
08 |
Order order = new Order() |
10 |
BuyerName = "Chris Chen", |
12 |
Books = new List<Book>() |
14 |
new Book(){BookId="B001", Name="Name01", price="100"}, |
15 |
new Book(){BookId="B002", Name="Name02", price="200"}, |
16 |
new Book(){BookId="B003", Name="Name03", price="300"}, |
20 |
// Data XML (一定要namespace) |
22 |
XmlTextReader xmlReader = new XmlTextReader(new System.IO.StringReader(szInputXml)); |
25 |
XmlReader xsltReader = XmlReader.Create(xsltLocation); |
28 |
byte[] wordDoc = GetWord(xmlReader, xsltReader); |
30 |
// Write resulting array to HDD, show process information |
31 |
using (FileStream fs = new FileStream(outputPath, FileMode.Create)) |
32 |
fs.Write(wordDoc, 0, wordDoc.Length); |
34 |
// Display resulting report in Word |
35 |
Process.Start(new ProcessStartInfo(outputPath)); |
38 |
public string Serialize(object obj, string defaultNamespace) |
40 |
// encoding issue: utf-16 => utf-8 |
43 |
XmlSerializer xs = new XmlSerializer(obj.GetType(), defaultNamespace); |
45 |
MemoryStream stream = new MemoryStream(); |
46 |
XmlWriterSettings setting = new XmlWriterSettings(); |
47 |
setting.Encoding = new UTF8Encoding(false); |
48 |
setting.Indent = true; |
50 |
using (XmlWriter writer = XmlWriter.Create(stream, setting)) |
51 |
{ xs.Serialize(writer, obj); } |
53 |
return Encoding.UTF8.GetString(stream.ToArray()); |
56 |
public static byte[] GetWord(XmlReader xmlData, XmlReader xsltReader) |
58 |
XslCompiledTransform xslt = new XslCompiledTransform(); |
59 |
XsltArgumentList args = new XsltArgumentList(); |
61 |
using (MemoryStream swResult = new MemoryStream()) |
63 |
// Load XSLT to reader and perform transformation |
64 |
xslt.Load(xsltReader); |
65 |
xslt.Transform(xmlData, args, swResult); |
67 |
return swResult.ToArray(); |
結果如同我們所預期的將資料都填入Word檔中

期望效益
1. 開發過程可集中於資料模型的設計(類似ViewModel概念)
2. Word樣式可供客戶自行調整 (不變更資料項目為前提下,僅需自動轉為XSLT檔即可)
3. 資料自動綁定至Word並產生檔案輸出
參考資料
http://www.codeproject.com/Articles/20287/Generating-Word-Reports-Documents
http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx
http://blogs.msdn.com/b/williamcornwill/archive/2007/01/17/document-generation-using-wordml-word-2003.aspx
- 第四十二节,configparser特定格式的ini配置文件模块
configparser用于处理特定格式的文件,其本质上是利用open来操作文件. 特定格式的ini配置文件模块,用于处理ini配置文件,注意:这个ini配置文件,只是ini文件名称的文本文件,不是后 ...
- 使用 FOR XML PATH 產生 XML 格式時,遇到 NULL 該如何處理?
當您嘗試利用 FOR XML PATH 產生 XML 格式時,若遇到 Result Set 為 Null 時,會導致整個查詢結果為 Null ,若您想要在查不到資料時,可以顯示自訂的內容,本文將提供可 ...
- JS利用正则配合replace替换指定字符
替换指定字符的方法有很多,在本文为大家详细介绍下,JS利用正则配合replace是如何做到的,喜欢的朋友可以参考下 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一 ...
- 使用jmeter+ant进行接口自动化测试(数据驱动)之二:利用apache-ant执行测试用例并生成HTML格式测试报告
在 使用jmeter+ant进行接口自动化测试(数据驱动)之一 介绍了如何使用csv文件来批量管理接口 本次接着介绍如何利用apache-ant执行测试用例并生成HTML格式测试报告 ①下载安装 ap ...
- 利用vue-cli配合vue-router搭建一个完整的spa流程
好文章备忘录: 转自:https://segmentfault.com/a/1190000009160934?_ea=1849098 demo源码:https://github.com/1590123 ...
- Microsoft Tech Summit 2018 课程简述:利用 Windows 新特性开发出更好的手绘视频应用
概述 Microsoft Tech Summit 2018 微软技术暨生态大会将于10月24日至27日在上海世博中心举行,这也会是国内举办的最后一届 Tech Summit,2019 年开始会以 Mi ...
- kubernetes 利用label标签来绑定到特定node运行pod
利用label标签来绑定到特定node运行pod: 不如将有大量I/O的pod部署到配置了ssd的node上或者需要使用GPU的pod部署到某些安装了GPU的节点上 查看节点的标签: kubectl ...
- linux中date命令显示昨天的日期信息?以特定格式显示时间?
需求描述: linux环境中,在使用date命令的时候,可以通过-d指定日期的字符串来显示日期 操作过程: 1.通过date显示昨天的日期 [root@redhat6 ~]# date -d 'yes ...
- 请给出如下格式的date命令 例:11-02-26.再给出实现按周输出 比如:周六输出为6,请分别给出命令。
请给出如下格式的date命令 例:19-01-18.再给出实现按周输出 比如:周六输出为6,请分别给出命令. 解答: 方法1: [root@zhaokang ~]# date2019年 01月 17日 ...
随机推荐
- Android支付接入(五):机锋网
原地址:http://blog.csdn.net/simdanfeg/article/details/9012083 前边已经陆续跟大家走了一遍运营商和支付宝付费接入,今天跟大家一起看看机锋网的支付接 ...
- 数据聚合 & 分组:新一代系统监控的核心功能
遥想 2015 年 8 月 17 日,Cloud Insight 还在梳理功能原型,畅想 Cloud Insight 存在的意义:为什么阿里云用户需要使用 Cloud Insight 来加强管理. 而 ...
- eclipse代码自动提示功能设置
一 般默认情况下,Eclipse ,MyEclipse的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项是默认关闭的, ...
- java thread类和runable
java thread 类其实和其他类是一样的.有自己的属性和方法.以及有一个重写的run方法 不同的是:必须重写run()方法. run()方法是线程thread启动后cpu调用运行的程序代码. r ...
- windows8 64位 IIS8 PHP5.5 安装 Imagemagick 组件
为什么这里一定要说 windows 系统是64位呢,因为如果是系统是64位,那么PHP5.5 一般都会选择64的, Imagemagick 组件也会选择64位的, 但是操蛋的是 64位的Imagema ...
- xcode 预编译头文件
xcode 预编译头文件 cocos2d-prefix.pch #import <Foundation/Foundation.h>
- 【HDOJ】3727 Jewel
静态区间第K大值.主席树和划分树都可解. /* 3727 */ #include <iostream> #include <sstream> #include <stri ...
- C语言字符串查找函数
#include <string.h> #include <stdio.h> char * string_search(char long_str[], char short_ ...
- java的Serialization 机制
基本使用方法 Serialization是指把类或者基本的数据类型持久化(persistence)到数据流(Stream)中,包括文件.字节流.网络数据流. ...
- freemarker得到数组的长度
取得list的长度:${fields?size}.用?size不是用?length,代码如下所示: <#list properties as item> <#assign layer ...