思路
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编程啊。明天再更新吧。