注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

微软MVP罗勇的博客

微软MVP罗勇,www.luoyong.me

 
 
 

日志

 
 

为Dynamics CRM的Office附件注释定制个无需下载即可在线查看的功能  

2015-10-21 15:52:53|  分类: CRM探索 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
关注本人微信和易信公众号: 微软动态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文件,如下:
为Dynamics CRM的Office文件注释做个无需下载即可在线查看功能 - 罗勇 - 微软MVP-罗勇的博客
 
测试点击Office文档的话会在新窗口中打开文档,当然是利用Office Online功能:
1. Word文档, .docx 文档:
为Dynamics CRM的Office文件注释做个无需下载即可在线查看功能 - 罗勇 - 微软MVP-罗勇的博客
 
2. Excel文档,.xlsx 文档:
为Dynamics CRM的Office文件注释做个无需下载即可在线查看功能 - 罗勇 - 微软MVP-罗勇的博客
 
3.PPT文档,.pptx文档:可以看到还可以放映幻灯片呢,给力!
为Dynamics CRM的Office文件注释做个无需下载即可在线查看功能 - 罗勇 - 微软MVP-罗勇的博客
 
4.pdf文档则会直接在浏览器中打开,如果你安装了PDF阅读软件也允许直接在浏览器中打开的话:
为Dynamics CRM的Office文件注释做个无需下载即可在线查看功能 - 罗勇 - 微软MVP-罗勇的博客
 
素格格新疆特产店--做最好新疆特产的搬运工。 本店由博主的新疆老婆开设,搬运各种最好的新疆特产,是自用,送礼,年货,孝敬长辈特别是(岳)父母的首选!素格格新疆特产店淘宝网址是 http://sugege.taobao.com 欢迎自助购买。

实体状态字段(statecode,statuscode)介绍、插件注册及获取更改状态前后的值 - 罗勇 - 微软MVP-罗勇的博客

  评论这张
 
阅读(402)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018