Xslt是Extensible Stylesheet Language Transformations的缩写,用来将XML 文档转换到其它文档类型。XSLT的使用包括两个输入文件:

– 包含实际数据的XML 文档

– 包含要插入数据与XSLT 命令架构的XSL文档

xml文档,包含的是Word中要填充的动态数据。XSLT文档,是Word中这些数据以及整个文档的格式。如果没有xml文件,Word文档每次生成就是一个静态的文件。如果没有XSLT,数据就不能转为为Word格式。

所以,利用XSLT结合XML生成Word的步骤为:

  1. 创建word模板
  2. 创建xml数据结构
  3. 生成xsd架构
  4. 给word模板绑定xml架构
  5. 生成xslt文件
  6. 修改xslt文件
  7. 通过C#生成word文档并下载

创建xml数据结构的时候,如果手写的话,会很麻烦。可以根据数据库中的表直接生成。生成的过程就是根据表之间的关系生成xml各级节点和属性。

1. 一个Word中所有表(也就是对应的模型类)之间的关系可以写成一个配置文件(配置文件可以包含表名,外键,主键,关键字,有外键关系的表等等。)。生成的过程中读取这个配置文件,根据各个模型类对应的关系生成xml中的层次关系。

2. 比如说模型分为多级。那么最终的mxl文件也要对应多级。

3. 自定义一个转化方法,然后实现转化过程

4. 模型的名称是从配置文件中读取,而读取数据库的过程是在转化方法中实现的,比如使用entityframe操作数据库,自己配置读取字符串

string sqlstring = string.Format(" SELECT * FROM {0} WHERE {1}={2}", modelName, keyName, keyValue);
var modelDatas = db.Database.SqlQuery<T>(sqlstring).ToList();

5. xml文件生成后,就得到了Word中的动态数据,然后就是XSLT和XML的结合

6. 我们下载的过程一般是通过XSLT和XML结合后直接在浏览器上下载,但是这样的话每次点击下载按钮都要执行一次转化。如果在提交之后数据不再改变,而且使用到了文档数据库,我们可以在提交之后先上传至文档数据库,然后可以随时在文档数据库上下载。

       //参数是XSLT的路径和要形成文档的名称 
public string UpLoadDoc(string xsltFilePath,string FileName)
{
string path = xsltFilePath;
XmlDocument xmlDoc = StoXmlDoc(); //得到xml文件
byte[] data = GetWordData(xmlDoc, path); //通过xml和XSLT的结合,得到最终文件的二进制流
string DocID = GridFsFactory.GetGridfs().UploadFile(data, "print", FileName); //把文件二进制流上传至文档数据库,并返回存储ID
return DocID;
} /// <summary>
/// 得到xmlDocument文件
/// </summary>
/// <returns></returns>
public XmlDocument StoXmlDoc()
{
StringBuilder builder = new StringBuilder(); //得到xml字符串
builder.AppendLine("<?xml version='1.0' encoding='utf-8'?>");
builder.Append(e.ToString());
string str = builder.ToString(); XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(str);
return xmlDocument;
} public byte[] GetWordData(XmlDocument xmlDoc, string xsltFilePath)
{
IXPathNavigable xpath = xmlDoc;
if (xpath == null) return null;
XslCompiledTransform xslt = GetXslt(xsltFilePath);
if (xslt == null) return null;
using (MemoryStream swResult = new MemoryStream())
{
xslt.Transform(xpath, null, swResult);
return swResult.ToArray();
}
}

7.在上传好后,会返回从文档数据库存储后的ID(字符串),表示文档存储的位置

8.我们随时可以根据存储ID下载文件

                 MongoGridFSFileInfo fileInfo = fs.FindOne(new QueryDocument { { "_id", new ObjectId(fileId) } });

                    if (fileInfo.Exists)
{
context.Response.ContentType = "application/octet-stream";
//context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fileInfo.Name + "\"");
context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", context.Server.UrlEncode(fileInfo.Name))); fs.Download(context.Response.OutputStream, fileInfo);
context.Response.Flush();
context.Response.End();
}

使用XSLT实现Word下载的更多相关文章

  1. Spring Boot 系列教程10-freemarker导出word下载

    freemarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个 ...

  2. mvc中html导出成word下载-简单粗暴方式

    由于工作需求,需要把html简历页导出成word下载.网上搜索了很多解决方案,基本都是用一些插件,然后写法也很麻烦,需要创建模板什么的. 固定替换值  代码一大堆.但是对于我的需求来说  并没有什么用 ...

  3. 在IIS上Office Word下载失败,检索 COM 类工厂中 CLSID 为000209FF的组件失败,80070005 拒绝访问。

    最近在做一个网站时,有一个下载word文档功能,在本地直接调试是可以下载的,但部署到IIS上就出现问题了. 出现问题如下:Error:下载简历方法出错:检索 COM 类工厂中 CLSID 为 {000 ...

  4. 百度文库Word下载器

    最近我妈的文库VIP用完了,但还有很多资源要下载,于是我便在网上找下载工具. 总算找到个完美的!(虽然没界面) 既然没界面,那就自己写一个呗! 原作者 该程序的下载和写入部分由地球守卫者制作 原文链接 ...

  5. html格式的文档转成word下载

    当我们前端使用ueditor插件来让用户输入数据,保存至数据库.在另一个地方需要打印用户输入的内容的时候可以用到.因为要将ueditor带格式保存下来保存的就是html格式的内容,后台转化如下: @R ...

  6. jsp下载word

    <%@ page language="java" contentType="application/msword;charset=utf-8"%> ...

  7. 百度文库下载器 V2.3.4.3 支持豆丁百度文库道客巴巴

    支持豆丁百度文库道客巴巴免下载劵财富值导出word 下载地址: http://pan.baidu.com/s/1qYCmQde

  8. 利用html模板生成Word文件(服务器端不需要安装Word)

    利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端 ...

  9. .NET通过调用Office组件导出Word文档

    .NET通过调用Office组件导出Word文档 最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word ...

随机推荐

  1. Python开发【第十篇】:CSS (二)

    Python开发[前端]:CSS Kylin Zhang 发表于 2016-11-10 13:13:57 css样式选择器 标签上设置style属性: <body> <div sty ...

  2. python字符串replace()方法

    python字符串replace()方法 >>> help(str.replace)Help on method_descriptor:replace(...)    S.repla ...

  3. noi 7221 拯救公主 (状态压缩+bfs)

    /* 这题实在调糊了 借鉴的题解的一些判断方法 位运算大法好 - - 因为要集齐所有的宝石所以状态压缩一下 f[i][j][s]将s化为二进制 每一0表示该宝石没有 1表示该宝石有 有:到(i,j)这 ...

  4. Modernizr——为HTML5和CSS3而生!

    原文地址:http://www.alistapart.com/articles/taking-advantage-of-html5-and-css3-with-modernizr/ 堂主译文地址:ht ...

  5. jsonp Ajax跨域请求

    什么是JSONP? JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域 ...

  6. C# WebService 基础实例

    1.整个Demo结构:如下图: 2.新建项目--选择asp.net web服务应用程序TestWebService 3.重新命名Service1.asmx为MyService.asmx 4.右键MyS ...

  7. bitmap index

    bitmap index 说明: set echo on drop table t purge; create table t ( processed_flag ) ); create bitmap ...

  8. hdu1102 Constructing Roads (简单最小生成树Prim算法)

    Problem Description There are N villages, which are numbered from 1 to N, and you should build some ...

  9. JS笔记1

    1.每个函数对象都有一个length属性,表示该函数期望接收的参数个数.它与函数的arguments不同,arguments.length表示函数实际接收的参数个数. 2.javascript 中有五 ...

  10. Yii2的相关学习记录,后台模板和gii(三)

    前面已经可以正常登录,但我们需要体验下最常用的增删查改的操作.这里就需要gii,通过gii可以方便的生成表单.表格的框架,不需要我们再写重复的东西. gii访问地址:http://localhost/ ...