通过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 ...
随机推荐
- OpenHarmony应用开发—ArkUI组件集合
介绍 本示例为 ArkUI 中组件.通用.动画.全局方法的集合. 效果预览 使用说明: 1.点击组件.通用.动画.全局方法四个按钮或左右滑动切换不同视图. 2.点击二级导航(如通用属性.通用事件等), ...
- 如何实现OpenHarmony的OTA升级
OTA简介 随着设备系统日新月异,用户如何及时获取系统的更新,体验新版本带来的新的体验,以及提升系统的稳定性和安全性成为了每个厂商都面临的严峻问题.OTA(Over the Air)提供对设备远程升级 ...
- C++ 多线程编程和同步机制:详解和实例演示
C++中的多线程编程和同步机制使得程序员可以利用计算机的多核心来提高程序的运行效率和性能.本文将介绍多线程编程和同步机制的基本概念和使用方法. 多线程编程基础 在C++中,使用<thread&g ...
- HMS Core机器学习服务实现同声传译,支持中英文互译和多种音色语音播报
当用户有跨语种交流或音频内容翻译的需求时,应用需要能自动检测语音内容再输出为用户需要的语言文字. HMS Core机器学习服务提供同声传译能力,同声传译实现将实时输入的长语音实时翻译为不同语种的文本以 ...
- Godot UI线程,Task异步和消息弹窗通知
目录 前言 线程安全 全局消息IOC注入 消息窗口搭建 最简单的消息提示 简单使用 仿Element UI ElementUI 效果 简单的Label样式 如何快速加载多个相同节点 修改一下,IOC按 ...
- Leetcode-最小覆盖子串
题目描述 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意:如果 s 中 ...
- redis 简单整理——bitmaps[十二]
前言 简单介绍一下bitmaps这个东西. 正文 我们都知道bitmaps 翻译过来就是二进制. 那么二进制可以存一些什么呢? 图片.视频,还可也存些什么呢? 现代计算机用二进制(位)作为信息的基础单 ...
- ImportError: Cannot load backend 'TkAgg' which requires the 'tk' interactive framework, as 'headless' is currently running
MMdetection多卡训练常遇到的两个错误,百度无果,没解决,去github里mmdetection的issue模块搜索了一下找到正解. 这里记录一下,方便后者. 1️⃣ ImportError: ...
- Pytorch-实战之对Himmelblau函数的优化
1.Himmelblau函数 Himmelblau函数: F(x,y)=(x²+y-11)²+(x+y²-7)²:具体优化的是,寻找一个最合适的坐标(x,y)使得F(x,y)的值最小. 函数的具体图像 ...
- ORA-29277:invalid SMTP operation
ORA-29277:invalid SMTP operation 邮件发送的时候出现报错 ORA-29277:invalid SMTP operation 官方解释就很简单 但是实际上重试是不行的,几 ...