zoukankan      html  css  js  c++  java
  • 使用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();
                        }

        

  • 相关阅读:
    spring-security原理
    win10忘记密码,重置密码
    ELK环境搭建
    Centos8.2安装docker
    pgsql重启
    什么是网站跳出率
    随记
    javascript中apply、call和bind的区别
    Android与Mysql服务器通信
    CentOS 7 最小化安装之后安装Mysql
  • 原文地址:https://www.cnblogs.com/tech-bird/p/3619319.html
Copyright © 2011-2022 走看看