zoukankan      html  css  js  c++  java
  • 为Dynamics CRM的Office附件注释定制个无需下载即可在线查看的功能

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复164或者20151021可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!
    上一篇博客:为Dynamics CRM注释的图片附件做个预览功能 发布后,有读者问,可以为其他类型附件做个预览功能吗?可以得,我这里提供主要的Office文件类型(Office 2007或者更高版本的Word,Excel,PowerPoint文档)的在线查阅功能,follow me。
    为了更加好的显示效果,更方便的开发,我这里利用微软Office官方网站提供的联机查看Office文档功能,网址是 https://products.office.com/zh-CN/office-online/view-office-documents-online ,如果你的office文档有个可以通过http 或者Https 访问的url,就可以利用的官方的这个功能,这个就是Office Online的部分功能吧。支持的浏览器包括 Internet Explorer 7 或更高版本、Safari 4 或更高版本、Firefox 3.5 或更高版本以及 Chrome。 支持的 Office Online 手机查看器包括 iPhone? 上的 Safari 以及 Windows Phone 上的 Internet Explorer。  官方的支持,无需插件,无需自己电脑安装Office软件,可以联机查看,下载,查找,打印,以PDF形式下载等功能,我估摸着,以后功能会更加强大,就选它,我看行。
    由于需要一个可以公开访问的文档URL,所以我这里建立了一个辅助的网站,这个网站我部署在Microsoft Azure上面,网站的首页地址是 http://mvpluoyong.azurewebsites.net ,主要用到的一个文件是 GetAnnotationDocument.ashx ,主要代码如下:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using LuoYong.CRMOperation;
    {
        /// <summary>
        /// Summary description for GetAnnotationDocument
        /// </summary>
        public class GetAnnotationDocument : IHttpHandler
        {
    
            public void ProcessRequest(HttpContext context)
            {
                try {
                    string AnnotationId = context.Request.QueryString["AnnotationId"];
                    CRMAnnotationMgr annotationMgr = new CRMAnnotationMgr();
                    if (!string.IsNullOrEmpty(AnnotationId))
                    {
                        var annotation = annotationMgr.GetAnnatationAttachementBody(new Guid(AnnotationId));
                        context.Response.ContentType = annotation.MimeType;
                        byte[] mybyte = Convert.FromBase64String(annotation.DocumentBody);
                        context.Response.BinaryWrite(mybyte);
                        context.Response.Flush();
                        context.Response.End();
                    }
                    else
                    {
                        throw new Exception("AnnotationId没有提供!");
                    }
                }
                catch (Exception ex)
                {
                    context.Response.ContentType = "text/plain";
                    context.Response.Write("Error." + ex.Message);
                }
            }
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    }
     
    然后还是稍微修改前面文章的 HTML Web资源后如下,代码优化了一下,点击链接的反映速度会些了,因为不一定都去查询附件的内容了:
    <!DOCTYPE HTML>
    <html>
     <head>
      <title>微软MVP罗勇测试注释</title>
            <style type="text/css">
                table {
                    border:1px solid #666666;
                    border-collapse:collapse;
                }
                table thead th {
                     padding: 8px;
                        border:1px solid #666666;
                     background-color: #dedede;
                }
                table tbody td {
                    border: 1px solid  #666666;
                 padding: 8px;
                 background-color: #ffffff;
                }
                table thead tr th {
                    font-family:Microsoft YaHei,SimSun,Tahoma,Arial;
                    font-size:12px;
                    font-weight:bold;
                    color:#000000;
                }
                table tbody tr td {
                    color:#444444;
                    font-family:Microsoft YaHei,SimSun,Tahoma,Arial;
                    font-size:12px;
                }
                .web_dialog_overlay
                {
                   position: fixed;
                   top: 0;
                   right: 0;
                   bottom: 0;
                   left: 0;
                   height: 100%;
                   width: 100%;
                   margin: 0;
                   padding: 0;
                   background: #000000;
                   opacity: .15;
                   filter: alpha(opacity=15);
                   -moz-opacity: .15;
                   z-index: 101;
                   display: none;
                }
                .web_dialog
                {
                   display: none;
                   position: fixed;
                   width: 400px;
                   height: 450px;
                   top: 50%;
                   left: 50%;
                   margin-left: -190px;
                   margin-top: -100px;
                   background-color: #ffffff;
                   border: 1px solid #336699;
                   padding: 0px;
                   z-index: 102;
                   font-family: Verdana;
                   font-size: 10pt;
                }
                .web_dialog_title
                {
                   border-bottom: solid 2px #336699;
                   background-color: #336699;
                   padding: 4px;
                   color: White;
                   font-weight:bold;
                   height:20px;
                   width:100%;
                }
                .align_right
                {
                   text-align: right;
                }
            </style>
            <script type="text/javascript" src="../../ClientGlobalContext.js.aspx"></script>
            <script type="text/javascript" src="../common/jquery.min.js"></script>
            <script type="text/javascript" src="../common/XrmServiceToolkit.min.js"></script>
            <script type="text/javascript">
                Date.prototype.format = function (fmt) {
                    var o = {
                        "M+": this.getMonth() + 1,//月份   
                        "d+": this.getDate(),//
                        "h+": this.getHours(),//小时   
                        "m+": this.getMinutes(),//
                        "s+": this.getSeconds()//
                    };
                    if (/(y+)/.test(fmt))
                        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
                    for (var k in o)
                        if (new RegExp("(" + k + ")").test(fmt))
                            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ?
                                     (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
                    return fmt;
                }
    
                function ShowDialog(modal) {
                    $("#overlay").show();
                    $("#dialog").fadeIn(300);
    
                    if (modal) {
                        $("#overlay").unbind("click");
                    }
                    else {
                        $("#overlay").click(function (e) {
                            HideDialog();
                        });
                    }
                }
    
                function HideDialog() {
                    $("#overlay").hide();
                    $("#dialog").fadeOut(300);
                }
    
                function ShowAttachmentByNoteId(NoteId, MimeType) {
                    if (MimeType.indexOf("image") > -1) {
                        XrmServiceToolkit.Rest.Retrieve(
                            NoteId,
                            "AnnotationSet",
                            "DocumentBody",
                            null,
                            function (result) {
                                var DocumentBody = result.DocumentBody;
                                var img = $("<img />");
                                img.attr("alt", "Embedded Image");
                                img.attr("src", "data:" + MimeType + ";base64," + DocumentBody);
                                img.appendTo($("#dialog"));
                                ShowDialog(true);
                            },
                            function (error) {
                                alert(error.message);
                            },
                            true
                        );
                    }
                    else if (MimeType.indexOf("officedocument.presentationml.presentation") > -1 || MimeType.indexOf("officedocument.spreadsheetml.sheet") > -1 || MimeType.indexOf("officedocument.wordprocessingml.document") > -1) {//office文档
                        window.open("https://view.officeapps.live.com/op/view.aspx?src=" + encodeURIComponent("http://mvpluoyong.azurewebsites.net/GetAnnotationDocument.ashx?AnnotationId=" + NoteId));
                    }
                    else if (MimeType.indexOf("pdf") > -1) {
                        window.open("http://mvpluoyong.azurewebsites.net/GetAnnotationDocument.ashx?AnnotationId=" + encodeURIComponent(NoteId));
                    }
                    else{
                        alert("暂时不支持MimeType=" + MimeType + "类型附件的预览,敬请期待后续博文!");
                    }
                }
    
                $(function () {
                    var clientUrl = GetGlobalContext().getClientUrl();
                    //var id = window.parent.Xrm.Page.data.entity.getId(); //这种方法可以获取表单中的很多信息,包括id
                    var match = RegExp('[?&]id=([^&]*)').exec(window.location.search);//这里是外接通过url传递id的值过来
                    var id = match && decodeURIComponent(match[1].replace(/+/g, ' '));
                    match = RegExp('[?&]typename=([^&]*)').exec(window.location.search);
                    var typename = match && decodeURIComponent(match[1].replace(/+/g, ' '));
                    XrmServiceToolkit.Rest.RetrieveMultiple(
                    "AnnotationSet",
                    "?$select=AnnotationId,Subject,NoteText,MimeType,FileName,FileSize,IsDocument,CreatedOn,CreatedBy,ModifiedOn,ModifiedBy&$filter=ObjectTypeCode eq '" + typename + "' and ObjectId/Id eq guid'" + id + "'&$orderby=CreatedOn asc",
                    function (results) {
                        for (var i = 0; i < results.length; i++) {
                            var tr = $("<tr></tr>");
                            tr.appendTo($("#notestable tbody"));
                            var td = $("<td>" + (i+1) + "</td>");
                            td.appendTo(tr);
                            td = $("<td>" + (results[i].Subject == null ? "" : results[i].Subject) + "</td>");
                            td.appendTo(tr);
                            td = $("<td><a href='" + clientUrl + "/main.aspx?etn=annotation&pagetype=entityrecord&id=%7B" + results[i].AnnotationId + "%7D' target='_blank'>" + results[i].NoteText + "</a></td>");
                            td.appendTo(tr);
                            td = $("<td>" + results[i].CreatedBy.Name + "</td>");
                            td.appendTo(tr);
                            td = $("<td>" + results[i].CreatedOn.format('yyyy-MM-ddThh:mm:ssZ') + "</td>");
                            td.appendTo(tr);
                            td = $("<td>" + results[i].ModifiedBy.Name + "</td>");
                            td.appendTo(tr);
                            td = $("<td>" + results[i].ModifiedOn.format('yyyy-MM-ddThh:mm:ssZ') + "</td>");
                            td.appendTo(tr);
                            td = $("<td>" + (results[i].IsDocument ? "" : "") + "</td>");
                            td.appendTo(tr);
                            td = $("<td>" + (results[i].FileName == null ? "" : ("<a href='#' data-annotationid='" + results[i].AnnotationId + "' data-mimetype='" + results[i].MimeType + "'>" + results[i].FileName + "</a>") + "</td>"));
                            td.find("a").click(function() {
                                ShowAttachmentByNoteId($(this).attr("data-annotationid"),$(this).attr("data-mimetype"));
                            });
                            td.appendTo(tr);
                            td = $("<td>" + (results[i].FileSize == null ? "" : Math.round((results[i].FileSize)/1024)) + "</td>");
                            td.appendTo(tr);
                        }
                    },
                    function (error) {
                        alert(error.message);
                    },
                    function () {
                    },
                    true
                    );
                    $("#dialogclosebtn").click(function (e) {
                        HideDialog();
                        e.preventDefault();
                    });
                });
            </script>
     </head>
     <body>
            <table id="notestable">
                <thead>
                   <tr>
                       <th>序号</th>
                       <th>注释标题</th>
                       <th>注释内容</th>
                       <th>创建人</th>
                       <th>创建时间</th>
                       <th>修改人</th>
                       <th>修改时间</th>
                       <th>是否包含附件</th>
                       <th>附件名称</th>
                       <th>附件大小(KB)</th>
                   </tr>
                </thead>
                <tbody>
                </tbody>
            </table>
            <div id="overlay" class="web_dialog_overlay"></div>
            <div id="dialog" class="web_dialog">
                <div class="web_dialog_title"><span id="dialogtitle" style="float:left;">附件内容预览</span><span id="dialogclosebtn" style="float:right;">关闭</span></div>
            </div>
     </body>
    </html>
    我上传了几个Office文件,如下:
     
    测试点击Office文档的话会在新窗口中打开文档,当然是利用Office Online功能:
    1. Word文档, .docx 文档:
     
    2. Excel文档,.xlsx 文档:
     
    3.PPT文档,.pptx文档:可以看到还可以放映幻灯片呢,给力!
     
    4.pdf文档则会直接在浏览器中打开,如果你安装了PDF阅读软件也允许直接在浏览器中打开的话:
     
     
  • 相关阅读:
    float的使用
    前端事件绑定
    serializeJson、serializeArray、serializeObject
    代码走查
    Colorpicker前端插件
    库/robfig/cron
    python打包
    最小公倍数 golang + python
    goland工具
    JavaScript操作JSON总结
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_Note_File_Online_Preview_Function.html
Copyright © 2011-2022 走看看