通过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编程啊。明天再更新吧。
通过XML标记生成word的更多相关文章
- java 根据word xml模板生成word
这里用的是poi相关jar包以及freemarker插值技术实现,poi相关jar包这里不再述说 1,编辑word并保存为xml 2,把xml后缀改为ftl文件 3,前端代码 // alert(jso ...
- 通过xml生成word文档
Xml生成word总结 使用xml生成word的基本步骤在<使用xslt转化xml数据形成word文档导出.doc>中说明比较清楚了.但是其中的细节并未说到,因此自己折腾了两天总算成功了. ...
- php 备份数据库代码(生成word,excel,json,xml,sql)
单表备份代码: 复制代码代码如下: <?php class Db { var $conn; function Db($host="localhost",$user=" ...
- FreemarkerJavaDemo【Android将表单数据生成Word文档的方案之一(基于freemarker2.3.28,只能java生成)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个方案只能在java中运行,无法在Android项目中运行.所以此方案是:APP将表单数据发送给后台,后台通过freemarker ...
- java生成word的几种方案
http://blog.sina.com.cn/s/blog_a5e968370101crtl.html 1. Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建 ...
- JAVA生成word的几种方法对比
首先介绍几种java导出word方案 1.Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过JNI的方式实现 ...
- 使用Java生成word文档(附源码)
当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档.但是当我们需要动态生成word时,通常不 ...
- Aspose.Words简单生成word文档
Aspose.Words简单生成word文档 Aspose.Words.Document doc = new Aspose.Words.Document(); Aspose.Words.Documen ...
- POI生成WORD文档
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
- 使用freemarker生成word,步骤详解并奉上源代码
1. 步骤 1. 用word编辑好模板 1. 普通字符串替换为 ${string} 2. 表格循环用标签 <#list userList as user> 姓名:${user.u ...
随机推荐
- Qt:Qt自适应高分辨率屏幕
现在的电脑分辨率越来越高,DPI也越来越大,使用Qt创建出来的界面,在小分辨率电脑上显示的很好,但是在大分辨率电脑上显示异常,感觉边框被压缩了,看起来很不协调. 从Qt 5.6 还是从Qt 5.14 ...
- 2019.2版本的idea没有忽略提交图标-configure ignored files
在SVN面板中 没有-configure ignored files 解决 1.打开 Settings→Editor→File Types2.在下方 Ignore files and folders ...
- Spring Boot 版本 GA、RC、beta等含义
GA General Availability,正式发布的版本,官方开始推荐广泛使用,国外有的用GA来表示release版本. RELEASE 正式发布版,官方推荐使用的版本,有的用GA来表示.比如s ...
- c# 优化代码的一些规则——什么情况下应该使用new[七]
前言 new 在重构这本书中写道new就是坏代码的味道,说明使用new的情况并不多. 在这里我指的new 是方法修饰符,而不是指实例. 正文 看下new的作用: new 修饰符可以重新定义从基类继承下 ...
- szfpga Lattice高速下载器HW-USBN-2B 常见问题解答
.产品特点 1). 支持windows7,Windows10 操作系统,两个操作系统非常稳定不断线. 2). 支持JTAG 模式,速度快,最高30Mb/s,调试serdes core,不会像hw-us ...
- Web Audio API 第5章 音频的分析与可视化
到目前为止,我们仅讨论了音频的合成与处理,但这仅是 Web Audio API 提供的一半功能.另一半功能则是音频的分析,它播放起来应该是什么样子的.它最典型的例子就是音频可视化,但其实有更多的其它应 ...
- 力扣585(MySQL)-2016年的投资(中等)
题目: 写一个查询语句,将 2016 年 (TIV_2016) 所有成功投资的金额加起来,保留 2 位小数. 对于一个投保人,他在 2016 年成功投资的条件是: 他在 2015 年的投保额 (TIV ...
- 力扣451(java)-根据字符出现频率排序(中等)
题目: 给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 .一个字符出现的 频率 是它出现在字符串中的次数. 返回 已排序的字符串 .如果有多个答案,返回其中任何一个. 示例 1: 输入 ...
- 链栈的实现 C语言/C++
堆栈的链式存储C/C++实现--链栈 与顺序栈相比,链栈的优点在于不存在栈满上溢的问题.链栈通常使用单链表实现,进栈.出栈操作就是在单链表表头的 插入.删除操作.用单链表实现链栈时,使用不带头结点的单 ...
- 用积木讲运维,这样的IT人太会了
简介: 日志服务SLS提供数据采集.加工.分析.告警可视化与投递功能,为AIOps.大数据分析.运营服务.大数据安全等场景提供支撑,并能以搭积木的方式适配各类运维场景,辅助企业的IT决策.近日,日志服 ...