使用XSLT实现Word下载

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();
                    }

 

 

    

 

 

 

转载于:https://www.cnblogs.com/tech-bird/p/3619319.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值