通过XML标记生成word


思路

word生成可以通过标签,也可以通过XML元素。

word文档实际上是由文档对象模型描述的,因此我们能够通过对文档对象进行操作去生成word。

由于word允许我们附加XML结构(元素),如下:(2003在工具中)

实际上就是允许我们向其中添加XML节点,因此我们可以利用XSD定义自己的XML元素,然后在word中附加XSD文档。

添加我们的元素后,将word转化为xslt样式表。

最后通过代码将XML数据装入样式表,并将其转化为XML或word,实现word生成。

步骤

一,定义XML元素

XSD定义XML元素教程

https://www.w3school.com.cn/schema/index.asp

XSD主要就是让我们可以自定义元素(element)和元素的类型(type)

我们定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="Simple" targetNamespace="Simple" elementFormDefault="qualified" attributeFormDefault="unqualified">   
 
   
    <xs:complexType name="CellClass" mixed="true">
        <xs:annotation>
            <xs:documentation>单元格类型xs:documentation>
        xs:annotation>
        <xs:attribute name="ColumnName" type="xs:string"/>     
        <xs:attribute name="DataType" type="dataType"/>
        <xs:attribute name="Format" type="xs:string">
            <xs:annotation>
                <xs:documentation>当DataType为number时有效xs:documentation>
            xs:annotation>
        xs:attribute>
    xs:complexType>
<xs:complexType name="AreaHClass" mixed="true"> <xs:annotation> <xs:documentation>行类型xs:documentation> xs:annotation> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element name="Cell" type="CellClass" minOccurs="0" maxOccurs="unbounded"/> xs:sequence> <xs:attribute name="TableName" type="xs:string"/> <xs:attribute name="MinRows" type="xs:int"/> xs:complexType>
<xs:simpleType name="dataType"> <xs:annotation> <xs:documentation>数据类型xs:documentation> xs:annotation> <xs:restriction base="xs:string"> <xs:enumeration value="date"/> <xs:enumeration value="string"/> <xs:enumeration value="number"/> xs:restriction> xs:simpleType>


    <xs:element name="Cell" type="CellClass">
        <xs:annotation>
            <xs:documentation>单元格节点xs:documentation>
        xs:annotation>
    xs:element>
<xs:element name="AreaH" type="AreaHClass"> <xs:annotation> <xs:documentation>行节点xs:documentation> xs:annotation> xs:element>

xs:schema>

二,构建word文档

1.在word中引入XSD

2.添加XML元素

 鼠标右键选择应用XML元素,对一行应用AreaH元素,为AreaH添加子元素Cell。

在Cell中添加0作为标识,后面要用。

 在各个标记右键属性,为各个元素添加属性值

三,将文档转化为模板

 保存为XML文档,之后用记事本编辑。

全选剪切后,到https://c.runoob.com/front-end/710,对字符串格式化

 在粘贴回记事本(也可以用vs打开).

找到我们标识为0的元素

 替换0为

一共要替换4个

 根据提示引入命名空间

并在最后面加上闭合标签

加上这两句,并在相应位置添加闭合标签

 将数据行放入循环,读取每一行数据

四,定义XML数据

<?xml version="1.0" encoding="utf-8"?>
  <Students>
    <tableName>
      <姓名>张三姓名>
      <年龄>20年龄>
      <性别>性别>
      <学号>201633362225学号>
    tableName>
    <tableName>
      <姓名>李四姓名>
      <年龄>21年龄>
      <性别>性别>
      <学号>201633362131学号>
    tableName>
    <tableName>
      <姓名>万五姓名>
      <年龄>21年龄>
      <性别>性别>
      <学号>201633362310学号>
    tableName>
  Students>

要注意tableName就是AreaH的属性值,其他类推

实际上这种XML文档可由 DataSet的WriteXml(要生成的数据文档的路径)方法得到。

五,将数据导入模板

using System.Xml.Xsl;
。
。
。
private void button3_Click(object sender, EventArgs e)
{
    XslCompiledTransform xslTrans = new System.Xml.Xsl.XslCompiledTransform();
    xslTrans.Load("学生.xml");//加载模板文件
    xslTrans.Transform("StudentsData.xml", "学生数据.doc");
    MessageBox.Show("生成");
 }

这里我用了一个Button控制,执行上述代码后即可看到已生成成功,去生成的地方找到它,打开。

 只是目前我还没研究如何去除XML标记,不过总的来说已经实现了生成word。

追加

这几天继续深入研究xslt和word,已经解决了XML标记的问题,实际上就是xslt编程啊。明天再更新吧。