利用XSD配合XSLT產出特定格式Word檔案 -摘自网络

利用類別產生XSD檔

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

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

1. 定義類別

01// 書籍資料
02public class Book
03{
04    public string BookId { get; set; }
05    public string Name { get; set; }
06    public string price { get; set; }
07}
08 
09// 訂單資料
10public 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

   image

 

利用XSD檔產生特定格式之Word檔

筆者是以Word 2010進行實作,相關實作畫面如下。另外,若使用Word 2013的朋友是無法透過此方法自行定義XML標記的,因為移除自訂 XML 標記是2009年12月22日美國法院的判決結果,購買或取得 Word 2013 授權的客戶會發現此軟體不含特定的自訂 XML 標記實作;所以請使用非Word2013版本來實作此步驟。

http://support.microsoft.com/kb/2761189/zh-tw

 

1. 加入開發人員工具列

   image

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

   image

3. 選擇剛產生之XSD檔案

   image

   image

   image

4. 開始編輯畫面與資料關聯

   目前希望呈現的樣式(黃色是隨資料異動部分)

   image

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

   imageimage

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

   image

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

   image

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

  image

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

  image

  此時若發現有錯誤發生

  image

   調整一下XML選項設定即可

   image

   image

   調整完畢後儲存為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

   image

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

   image

   點選所需的namespace即可

   image

 

組合資料產生Word檔

資料 + 顯示樣式

    = 資料物件序列化(XML) + XSLT

    = 產生具有資料及指定樣式Word檔

 

01private 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 
38public 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 
56public 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檔中

image

 

期望效益

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

转载于:https://www.cnblogs.com/haoliansheng/p/4338542.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<xsd:element> 元素是 XML 模式语言(XSD)中的一个重要元素,用于定义 XML 文档中的元素。下面是一些 <xsd:element> 元素的详细说明: 1. name 属性:该属性用于指定元素的名称。必须是一个有效的 XML 名称,不能包含空格或特殊字符。 2. type 属性:该属性用于指定元素的数据类型。可以是内置的数据类型,如 string、int、boolean 等,也可以是自定义的复杂类型。 3. minOccurs 和 maxOccurs 属性:这两个属性用于指定元素的出现次数。minOccurs 属性指定元素的最小出现次数,maxOccurs 属性指定元素的最大出现次数。默认情况下,minOccurs 属性的值为 1,maxOccurs 属性的值为 1。 4. default 和 fixed 属性:这两个属性用于指定元素的默认值和固定值。default 属性指定元素的默认值,fixed 属性指定元素的固定值。如果指定了 fixed 属性,则不能指定 default 属性。 5. nillable 属性:该属性用于指定元素是否可以为 null。如果该属性的值为 true,则元素可以为 null;否则,元素不可以为 null。 6. abstract 属性:该属性用于指定元素是否是抽象的。如果该属性的值为 true,则元素是抽象的,不能被实例化。 7. substitutionGroup 属性:该属性用于指定元素的替代组。指定元素的替代组意味着可以使用替代组中的任何元素来代替该元素。 总之,<xsd:element> 元素是 XSD 中非常重要的元素之一,它定义了 XML 文档中的元素,并且可以指定元素的名称、数据类型、出现次数、默认值、固定值等属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值