通过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为

<xsl:value-of select="这里填文档里面对应标记的属性值"/>

一共要替换4个

 根据提示引入命名空间

并在最后面加上闭合标签</xsl:stylesheet>

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

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

四,定义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编程啊。明天再更新吧。

原文地址:https://www.cnblogs.com/ggtc/p/12770526.html