使用XSLT实现Word下载
Xslt是Extensible Stylesheet Language Transformations的缩写,用来将XML 文档转换到其它文档类型。XSLT的使用包括两个输入文件:
– 包含实际数据的XML 文档
– 包含要插入数据与XSLT 命令架构的XSL文档
xml文档,包含的是Word中要填充的动态数据。XSLT文档,是Word中这些数据以及整个文档的格式。如果没有xml文件,Word文档每次生成就是一个静态的文件。如果没有XSLT,数据就不能转为为Word格式。
所以,利用XSLT结合XML生成Word的步骤为:
- 创建word模板
- 创建xml数据结构
- 生成xsd架构
- 给word模板绑定xml架构
- 生成xslt文件
- 修改xslt文件
- 通过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下载的更多相关文章
- Spring Boot 系列教程10-freemarker导出word下载
freemarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个 ...
- mvc中html导出成word下载-简单粗暴方式
由于工作需求,需要把html简历页导出成word下载.网上搜索了很多解决方案,基本都是用一些插件,然后写法也很麻烦,需要创建模板什么的. 固定替换值 代码一大堆.但是对于我的需求来说 并没有什么用 ...
- 在IIS上Office Word下载失败,检索 COM 类工厂中 CLSID 为000209FF的组件失败,80070005 拒绝访问。
最近在做一个网站时,有一个下载word文档功能,在本地直接调试是可以下载的,但部署到IIS上就出现问题了. 出现问题如下:Error:下载简历方法出错:检索 COM 类工厂中 CLSID 为 {000 ...
- 百度文库Word下载器
最近我妈的文库VIP用完了,但还有很多资源要下载,于是我便在网上找下载工具. 总算找到个完美的!(虽然没界面) 既然没界面,那就自己写一个呗! 原作者 该程序的下载和写入部分由地球守卫者制作 原文链接 ...
- html格式的文档转成word下载
当我们前端使用ueditor插件来让用户输入数据,保存至数据库.在另一个地方需要打印用户输入的内容的时候可以用到.因为要将ueditor带格式保存下来保存的就是html格式的内容,后台转化如下: @R ...
- jsp下载word
<%@ page language="java" contentType="application/msword;charset=utf-8"%> ...
- 百度文库下载器 V2.3.4.3 支持豆丁百度文库道客巴巴
支持豆丁百度文库道客巴巴免下载劵财富值导出word 下载地址: http://pan.baidu.com/s/1qYCmQde
- 利用html模板生成Word文件(服务器端不需要安装Word)
利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端 ...
- .NET通过调用Office组件导出Word文档
.NET通过调用Office组件导出Word文档 最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word ...
随机推荐
- poj 1811 Pallor Rho +Miller Rabin
/* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...
- group by、order by 先后顺序问题
今天遇到个小问题 本来是很基础的问题 应该说 基础知道掌握的不牢 好了不说 错误 语句 : select a.a1 from table a where order by a.a1 gro ...
- 突然想写点东西,关于web新人的。采用问答方式
我自己是会计专业,转行自学web的,学习有一两年了,也还是新人一个,只不过不是那种超级“新”的,所以有什么话说得不对,请轻喷.欢迎大家来和我交流. 1.我能不能转行学web? 能不能学web这个不是别 ...
- css.day01.eg
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Android客户端采用Http 协议Post方式请求与服务端进行数据交互(转)
http://blog.csdn.net/javanian/article/details/8194265
- c#求slope线性回归斜率
public class mySlope { // public List<double> Values { get; set; } public double SlopeResult { ...
- 13 Roman to Integer(罗马数字转int Easy)
题目意思:罗马数字转int 思路:字符串从最后一位开始读,IV:+5-1 class Solution { public: int romanToInt(string s) { map<char ...
- 如何使一个你没有源代码的DLL文件变为强命名的DLL
转载: 有时候你会需要一个DLL是强命名的,比如你想把这个文件放到GAC里面.如果这是一个第三方的DLL,你没有源代码,这会是一件比较麻烦的事情.有一个方法可以解决这个问题. 在VS.NET的命名行窗 ...
- getUrlParam,jQuery中的URL参数获取
大家经常会需要在一段URL中截取到自己所需参数的值,下面的方法也许能帮到您: $.getUrlParam = function(name){ var reg = new RegExp("(^ ...
- DeDe内容调用img
文章内容页调用缩略图方法如下两种.第一种没有大小设置.原图显示.第二种.可以设大小, {dede:field.image/} <img src="{dede:field.litpic ...