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. retrofit2 okhttp3 RxJava butterknife 示例

    eclipse的jar包配置 eclipse中貌似用不了butterknife buildToolsVersion "23.0.2" defaultConfig { applica ...

  2. poj 1201 Interval (查分约束)

    /* 数组开大保平安. 查分约束: 输入的时候维护st和end 设每个点取元素di个 维护元素个数前缀和s Sbi-Sai-1>=ci 即:建立一条从ai-1到bi的边 权值为ci 表示ai到b ...

  3. C#解leetcode 11. Container With Most Water

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...

  4. 基于bootstrap的轮播广告页,带图片和文字

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...

  5. 【转载】ASP.NET线程安全与静态变量的生命周期浅谈

    ASP.NET线程安全所涉及的是什么呢?让我们先来看看静态变量的生命周期问题,下面是我理解的静态变量的生命周期: void Application_Start开始 void Application_E ...

  6. (转)模板引擎类dedetemplate.class.php使用说明

    1.概述 织梦的模板标签类似于XML格式,所有的模板都含有定界符,默认情况下是{dede:*}和{/dede:*},“*”代表模板标记名称. 一般情况下{dede:*}和{/dede:*}是成对出现的 ...

  7. XCode的一些调试技巧

    XCode 内置GDB,我们可以在命令行中使用 GDB 命令来调试我们的程序.下面将介绍一些常用的命令以及调试技巧. po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 ...

  8. A simple stack

    // simple stack.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include<iostream>using na ...

  9. FindBugs的Eclipse插件安装与使用

    1.FindBugs介绍 FindBugs是一款Java静态代码分析工具,与其他静态分析工具(如Checkstyle和PMD)不同,FindBugs 不注重样式或者格式,它专注于寻找真正的缺陷或者潜在 ...

  10. Entity Framework中实现指定字段更新

    foreach (var entity in databasePatents) { var patentTmp = sourcePClist.FirstOrDefault(p => p.Oid ...