思路

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. Windows cmd命令 -- 记录

    # 清屏 >> cls # 查看进程 >> tasklist # 结束进程 >> tskill <pid> # 查询WIFI列表所有WIFI的信息 &g ...

  2. WPF 像CSS一样使用 Font Awesome 图标字体

    WPF 像CSS一样使用 Font Awesome 图标字体 编写目的 WPF中使用这种图标字体不免会出现可读性差的问题,现阶段网络上有的大部分实现方式都是建立枚举,我感觉这样后续维护起来有些麻烦,需 ...

  3. 打造美团外卖新体验,HarmonyOS SDK 持续赋能开发者共赢鸿蒙生态

    从今年 8 月起,所有升级到 HarmonyOS 4 的手机用户在美团外卖下单后,可通过屏幕上的一个"小窗口",随时追踪到"出餐.取餐.送达"等订单状态.这个能 ...

  4. HarmonyOS如何使用异步并发能力进行开发

      一.并发概述 并发是指在同一时间段内,能够处理多个任务的能力.为了提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰,HarmonyOS系统提供了异步并发和多线程并发两种处理策略. ● 异步 ...

  5. nginx重新整理——————热部署和日志切割[三]

    前言 简单演示热部署和日志切割. 正文 什么是热部署了,我们前文也说过了一个编译后的nginx 二进制. 热部署就是无需停止现有的nginx,替换正在运行的nginx. 步骤: 复制nginx 二进制 ...

  6. sql 语句系列(众数中位数与百分比)[八百章之第十五章]

    众数 众数就是出现最多的那个数. select sal,count(*) as cnt from emp where DEPTNO=20 group by sal 通过分组把他们的行数计算出来.那么最 ...

  7. redis 简单整理——慢查询[八]

    前言 简单整理一下redis的慢查询. 正文 什么是慢查询呢? 一般存储系统就是系统在命令执行前后计算每条命令的执行时间,当超出预设阀值,就将这条命令的相关信息记录下来. 但是有人可能没有看到慢查询日 ...

  8. 重新点亮linux 命令树————网络管理和网络配置文件[十一六]

    前言 简单整理一下网络管理和网络配置文件. 正文 网络服务程序分为两种:分别是SysV和systemd service network start|stop|restart chkconfig --l ...

  9. .NET开源免费的跨平台框架 - MAUI(附学习资料)

    前言 前几天分享了一个.NET MAUI开源免费的UI工具包 - Uranium,然后技术群有不少同学问.NET MAUI是不是免费的?能做什么?今天特意写这篇文章来介绍一下.NET开源.免费(基于M ...

  10. 力扣553(java)-最优除法(中等)

    题目: 给定一组正整数,相邻的整数之间将会进行浮点除法操作.例如, [2,3,4] -> 2 / 3 / 4 . 但是,你可以在任意位置添加任意数目的括号,来改变算数的优先级.你需要找出怎么添加 ...