为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阅读软件也允许直接在浏览器中打开的话:
 
 

猜你喜欢

转载自www.cnblogs.com/luoyong0201/p/Dynamics_365_Note_File_Online_Preview_Function.html
今日推荐