思路

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的更多相关文章

  1. java 根据word xml模板生成word

    这里用的是poi相关jar包以及freemarker插值技术实现,poi相关jar包这里不再述说 1,编辑word并保存为xml 2,把xml后缀改为ftl文件 3,前端代码 // alert(jso ...

  2. 通过xml生成word文档

    Xml生成word总结 使用xml生成word的基本步骤在<使用xslt转化xml数据形成word文档导出.doc>中说明比较清楚了.但是其中的细节并未说到,因此自己折腾了两天总算成功了. ...

  3. php 备份数据库代码(生成word,excel,json,xml,sql)

    单表备份代码: 复制代码代码如下: <?php class Db { var $conn; function Db($host="localhost",$user=" ...

  4. FreemarkerJavaDemo【Android将表单数据生成Word文档的方案之一(基于freemarker2.3.28,只能java生成)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个方案只能在java中运行,无法在Android项目中运行.所以此方案是:APP将表单数据发送给后台,后台通过freemarker ...

  5. java生成word的几种方案

    http://blog.sina.com.cn/s/blog_a5e968370101crtl.html 1. Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建 ...

  6. JAVA生成word的几种方法对比

    首先介绍几种java导出word方案 1.Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过JNI的方式实现 ...

  7. 使用Java生成word文档(附源码)

    当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档.但是当我们需要动态生成word时,通常不 ...

  8. Aspose.Words简单生成word文档

    Aspose.Words简单生成word文档 Aspose.Words.Document doc = new Aspose.Words.Document(); Aspose.Words.Documen ...

  9. POI生成WORD文档

    h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...

  10. 使用freemarker生成word,步骤详解并奉上源代码

    1.   步骤 1.    用word编辑好模板 1. 普通字符串替换为 ${string} 2. 表格循环用标签 <#list userList as user> 姓名:${user.u ...

随机推荐

  1. 资讯速递 | ArkUI-X 预览版已正式开源!

     OpenHarmony项目群技术指导委员会(以下简称"TSC")-跨平台应用开发框架TSG所孵化项目 -- ArkUI-X,近期已正式开源 ,开发者基于一套主代码,就可以将在Op ...

  2. Go 项目依赖注入wire工具最佳实践介绍与使用

    目录 一.引入 二.控制反转与依赖注入 三.为什么需要依赖注入工具 3.1 示例 3.2 依赖注入写法与非依赖注入写法 四.wire 工具介绍与安装 4.1 wire 基本介绍 4.2 安装 五.Wi ...

  3. C# Replace方法

    例子: string tStw = "Run Status"; string tStw1 = tStw.Replace("Run Status", " ...

  4. SAST-数据流分析方法-理论

    引言 众所周知,数据流分析是实现污点分析的一种常用技术 数据流分析分为过程内的数据流分析与过程间的数据流分析.前者是对一个方法体内的数据流分析,主要是基于CFG分析,不涉及方法调用:后者是基于不同方法 ...

  5. 为什么使用gs_probackup执行全量备份时,提示无法连接到数据库?

    为什么使用 gs_probackup 执行全量备份时,提示无法连接到数据库? 背景介绍: 在使用 gs_probackup 执行全量备份时,提示无法连接到数据库. 报错内容: [ommdoc@host ...

  6. Unity 检测FPS工具

    检测FPS工具 public class FPS : MonoBehaviour { public float f_UpdateInterval = 0.5F; private float f_Las ...

  7. docker 应用篇————mysql容器[十二]

    前言 简单介绍一下mysql容器. 正文 这里简单介绍一下mysql的容器. hub.docker.io给了我们一个启动的示例. docker run --name some-mysql -e MYS ...

  8. uniapp中实现简易计算器

    uniapp中实现简易计算器主要问题:在计算器的实现过程中会遇到小数点计算精度:此计算器是依赖了uni-popup的弹出层插件,可在uniapp官方组件中查找扩展插件popup弹窗层下载,也可直接点击 ...

  9. vue登录3D效果

    实现的效果 登录动态效果很炫酷,话不多说直接上代码: 组件template <template> <div class="entrance"> <di ...

  10. 我们为什么要做 SoloPi

    SoloPi现状 去年(2019年)7月份,蚂蚁集团正式对外开源了客户端自动化测试工具 SoloPi ,其主要包括三大模块:录制回放(用于功能测试).性能工具(用于性能测试)以及一机多控(服务于兼容性 ...