利用類別產生XSD檔

產出XSD檔的目的在於提供Word樣板設計之資料框架

在此使用微軟提供之XML Schema Definition Tool (Xsd.exe)工具產生XSD檔

1. 定義類別

01 // 書籍資料
02 public class Book
03 {
04     public string BookId { get; set; }
05     public string Name { get; set; }
06     public string price { get; set; }
07 }
08  
09 // 訂單資料
10 public class Order
11 {
12     public string BuyerName { get; set; }
13     public List<Book> Books { get; set; }
14     public int TotalPrice { get; set; }
15 }

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"?>
02 <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
03   <xs:element name="Order" nillable="true" type="Order" />
04   <xs:complexType name="Order">
05     <xs:sequence>
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" />
09     </xs:sequence>
10   </xs:complexType>
11   <xs:complexType name="ArrayOfBook">
12     <xs:sequence>
13       <xs:element minOccurs="0" maxOccurs="unbounded" name="Book" nillable="true" type="Book" />
14     </xs:sequence>
15   </xs:complexType>
16   <xs:complexType name="Book">
17     <xs:sequence>
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" />
21     </xs:sequence>
22   </xs:complexType>
23 </xs:schema>

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()
02 {
03  
04     string xsltLocation = @"D:\Order.xslt";
05     string outputPath = @"D:\Order.doc";
06  
07     // Data
08     Order order = new Order()
09     {
10         BuyerName = "Chris Chen",
11         TotalPrice = 600,
12         Books = new List<Book>()
13         {
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"},
17         }
18     };
19  
20     // Data XML (一定要namespace)
21     string szInputXml = Serialize(order, "http://schemas.chris.com/WordGenerator/Order.xsd");
22     XmlTextReader xmlReader = new XmlTextReader(new System.IO.StringReader(szInputXml));
23  
24     // XSLT
25     XmlReader xsltReader = XmlReader.Create(xsltLocation);
26  
27     // Create Word
28     byte[] wordDoc = GetWord(xmlReader, xsltReader);
29  
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);
33  
34     // Display resulting report in Word
35     Process.Start(new ProcessStartInfo(outputPath));
36 }
37  
38 public string Serialize(object obj, string defaultNamespace)
39 {
40     // encoding issue: utf-16 => utf-8
42  
43     XmlSerializer xs = new XmlSerializer(obj.GetType(), defaultNamespace);
44  
45     MemoryStream stream = new MemoryStream();
46     XmlWriterSettings setting = new XmlWriterSettings();
47     setting.Encoding = new UTF8Encoding(false);
48     setting.Indent = true;
49     
50     using (XmlWriter writer = XmlWriter.Create(stream, setting))
51     { xs.Serialize(writer, obj); }
52  
53     return Encoding.UTF8.GetString(stream.ToArray());
54 }
55  
56 public static byte[] GetWord(XmlReader xmlData, XmlReader xsltReader)
57 {
58     XslCompiledTransform xslt = new XslCompiledTransform();
59     XsltArgumentList args = new XsltArgumentList();
60  
61     using (MemoryStream swResult = new MemoryStream())
62     {
63         // Load XSLT to reader and perform transformation
64         xslt.Load(xsltReader);
65         xslt.Transform(xmlData, args, swResult);
66  
67         return swResult.ToArray();
68     }
69 }

結果如同我們所預期的將資料都填入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

利用XSD配合XSLT產出特定格式Word檔案 -摘自网络的更多相关文章

  1. 第四十二节,configparser特定格式的ini配置文件模块

    configparser用于处理特定格式的文件,其本质上是利用open来操作文件. 特定格式的ini配置文件模块,用于处理ini配置文件,注意:这个ini配置文件,只是ini文件名称的文本文件,不是后 ...

  2. 使用 FOR XML PATH 產生 XML 格式時,遇到 NULL 該如何處理?

    當您嘗試利用 FOR XML PATH 產生 XML 格式時,若遇到 Result Set 為 Null 時,會導致整個查詢結果為 Null ,若您想要在查不到資料時,可以顯示自訂的內容,本文將提供可 ...

  3. JS利用正则配合replace替换指定字符

    替换指定字符的方法有很多,在本文为大家详细介绍下,JS利用正则配合replace是如何做到的,喜欢的朋友可以参考下 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一 ...

  4. 使用jmeter+ant进行接口自动化测试(数据驱动)之二:利用apache-ant执行测试用例并生成HTML格式测试报告

    在 使用jmeter+ant进行接口自动化测试(数据驱动)之一 介绍了如何使用csv文件来批量管理接口 本次接着介绍如何利用apache-ant执行测试用例并生成HTML格式测试报告 ①下载安装 ap ...

  5. 利用vue-cli配合vue-router搭建一个完整的spa流程

    好文章备忘录: 转自:https://segmentfault.com/a/1190000009160934?_ea=1849098 demo源码:https://github.com/1590123 ...

  6. Microsoft Tech Summit 2018 课程简述:利用 Windows 新特性开发出更好的手绘视频应用

    概述 Microsoft Tech Summit 2018 微软技术暨生态大会将于10月24日至27日在上海世博中心举行,这也会是国内举办的最后一届 Tech Summit,2019 年开始会以 Mi ...

  7. kubernetes 利用label标签来绑定到特定node运行pod

    利用label标签来绑定到特定node运行pod: 不如将有大量I/O的pod部署到配置了ssd的node上或者需要使用GPU的pod部署到某些安装了GPU的节点上 查看节点的标签: kubectl ...

  8. linux中date命令显示昨天的日期信息?以特定格式显示时间?

    需求描述: linux环境中,在使用date命令的时候,可以通过-d指定日期的字符串来显示日期 操作过程: 1.通过date显示昨天的日期 [root@redhat6 ~]# date -d 'yes ...

  9. 请给出如下格式的date命令 例:11-02-26.再给出实现按周输出 比如:周六输出为6,请分别给出命令。

    请给出如下格式的date命令 例:19-01-18.再给出实现按周输出 比如:周六输出为6,请分别给出命令. 解答: 方法1: [root@zhaokang ~]# date2019年 01月 17日 ...

随机推荐

  1. POJ2526+简单几何

    题意:给定的这些点是否有一个对称中心. PS:我写得有点啰嗦.. 就是把小的x和大的x进行匹配. #include<stdio.h> #include<algorithm> # ...

  2. SaaS系列介绍之六: SaaS模式分析(上)

    1 引言 如果我们想要更多的玫瑰花,就必须种植更多的玫瑰树.                            ________姚群<成功激励格言精选> SaaS模式是个新兴的话题,有 ...

  3. Servlet 下载文件

    这几天有点懒散,还好没有忘记看书,上周去了国家图书馆翻阅了一些和Java相关的书籍,其实这些书都是自己以前看过或者听过,按理来说,不应该看自己已经看过的书籍,应该找一些最新的书籍去看,但是每次走到书架 ...

  4. 对C#中的web访问mysql数据库的一些知识点进行了整理归纳总结

    基本对比 使用方式 使用场合 优缺点 是否需要安装 需要的dll网址 引用方式 程序内引用 程序初期确定使用MySql,前期添加引用 大多数情况下使用在类文件内,多数使用于aspx,ashx等带有后置 ...

  5. HTML5学习(四)---Canvas绘图

    参考教程地址:http://www.w3school.com.cn/html5/html_5_canvas.asp canvas 元素用于在网页上绘制图形. 什么是 Canvas? HTML5 的 c ...

  6. poj3254

    还是那句老话:dp关键在状态: 求有多少种排布方式,是任意两头牛不相邻(有些地方不能放): 不用心,一开始还纠结了半天 和之前USACO上某题方法是一样的,每一行放或不放只有两种情况 把它当作一个二进 ...

  7. poj2828

    很容易想到一种动态的做法:平衡树…… 或者是二分+树状数组 但,前者编程复杂度较大,而且据说会被卡(没试过):后者理论上超时(据说可以擦边过?): 所以要尝试新的算法: 倒着考虑,显然最后一个对象的位 ...

  8. NOI2002银河英雄传说

    原先就看过这道题,觉得很复杂. 不知道为什么今天一看觉得好水啊…… 难道这就是并查集的启发式合并? 数组d[i]表示i到其父节点的距离,即中间隔了多少船舰. 数组sum[i]记录以i为根的集合总共有多 ...

  9. [POJ 2429] GCD & LCM Inverse

    GCD & LCM Inverse Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10621   Accepted: ...

  10. [转] web.xml文件详解

    转自:http://www.cnblogs.com/hellojava/archive/2012/12/28/2835730.html 前言:一般的web工程中都会用到web.xml,web.xml主 ...