officeweb 中文api_officeweb365 - CSDN
  • 目 录       一、工作原理... 5 1.1  开发流程... 5 1.2  WEB页面调用控件:. 6 二、接口说明... 7 2.1  接口... 7 2.1.1  AboutBox. 7 2.1.2  AcceptAllRevisions. 7 2.1.3  CloseD



    目    录

     

     

     

    一、工作原理...5

    1.1         开发流程...5

    1.2         WEB页面调用控件:.6

    二、接口说明...7

    2.1         接口...7

    2.1.1     AboutBox.7

    2.1.2     AcceptAllRevisions.7

    2.1.3     CloseDoc.7

    2.1.4     DelLocalFile.8

    2.1.5     GetDocumentObject.8

    2.1.6     GetFieldValue.9

    2.1.7     GetTempFilePath.9

    2.1.8     GetRevCount.10

    2.1.9     GetFileSize.10

    2.1.10            GetBookMarkCount.10

    2.1.11            HideMenuItem.10

    2.1.12            HttpInit.11

    2.1.13            HttpAddPostFile.11

    2.1.14            HttpAddPostString.11

    2.1.15            HttpAddPostCurrFile.12

    2.1.16            HttpPost.12

    2.1.17            InsertFile.12

    2.1.18            IsOpened.13

    2.1.19            IsSaved.13

    2.1.20            LoadOriginalFile.14

    2.1.21            OpenFileDlg.14

    2.1.22            ProtectDoc.15

    2.1.23            PrintDoc.15

    2.1.24            PutSaved.15

    2.1.25            Save.16

    2.1.26            SaveTo.16

    2.1.27            SaveAs.16

    2.1.28            SetFieldValue.17

    2.1.29            SetTrackRevisions.18

    2.1.30            ShowRevisions.18

    2.1.31            SetCurrUserName.18

    2.1.32            ShowDialog.18

    2.1.33            UnProtectDoc(BSTRstrPwd).19

    2.2         属性...20

    2.2.1     DocType.20

    2.2.2     Version.20

    2.2.3     AppVersion.20

    2.2.4     lEventRet.20

    2.2.5     IsModify.21

    2.2.6     ShowToolBar.21

    2.2.7     lContinue.21

    2.3         事件...21

    2.3.1     NotifyWordEvent.21

    2.3.2     NotifyCtrlReady.22

    2.3.3     NotifyToolBarClick.22

    附录:WebOffice文件Http上传原理...23

     

     

     

     

     

     

     

                        


    一、工作原理

    WebOffice是基于客户端的ocx控件,它的功能是将Office文档(Word、Excel、WPS)嵌入到浏览器中,并调用Office中各种接口,完成文档编辑工作,然后使用控件的Http接口模拟表单提交,发送到数据处理页面(此文档举例为saveDoc.asp页,代码见演示文件),完成文档的存档工作。

    1.1  开发流程

      ├  装载控件        <object>...</ object >

      ├  触发初始化方法

    <SCRIPTLANGUAGE=javascript FOR=WebOffice1 EVENT=NotifyCtrlReady>

    <!--

     WebOffice1_NotifyCtrlReady()         

    //-->

    </SCRIPT>

      ├  执行初始化方法,打开新文档或装载已经存在的文档

    functionWebOffice1_NotifyCtrlReady() {

       document.all.WebOffice1.LoadOriginalFile("…","…");

    }    

      ├  根据当前步骤,来决定是否进入修订状态,如果是修订状态,最好设置当前的用户名

    functionWebOffice1_NotifyCtrlReady() {

       document.all.WebOffice1.LoadOriginalFile("…","…");

       document.all.WebOffice1.SetCurrUserName("张三"); 

       document.all.WebOffice1.SetTrackRevisions(1);

    }

    ├ 填写表单元素,编辑Office文档

      ├  执行Http上传接口保存表单元素和Office文档          

    //保存文档之前,如果需要接受修订,需要调用

    document.all.WebOffice1.SetTrackRevisions(4);   

    //通过Http接口上传

    document.all.WebOffice1.HttpInit();             

    document.all.WebOffice1.HttpAddPostString("…","…");

    document.all.WebOffice1.HttpAddPostCurrFile("…","…");      

    document.all.WebOffice1.HttpPost("…")

      ├  saveDoc.asp获取表单数据和Office进行数据库操作,并返回操作是否正确。

      ├  根据saveDoc.asp返回值进行相应操作。

    1.2  WEB页面调用控件:

     

         <OBJECT id=WebOffice1 height=520width="100%" style="LEFT: 0px; TOP: 0px"

    classid="clsid:E77E049B-23FC-4DB8-B756-60529A35FAD5"  codebase=WebOffice.ocx#Version=3,0,0,0>

         <PARAM NAME="_Version"VALUE="65536">

         <PARAM NAME="_ExtentX"VALUE="2646">

         <PARAM NAME="_ExtentY"VALUE="1323">

         <PARAM NAME="_StockProps"VALUE="0"></OBJECT>

    主要参数说明:

    id         控件在网页的别名,可以通过别名调用控件的方法、属性

    width      控件的宽度,可以使用绝对大小,如width="100px"。

    height     控件的高度

    codebase      设置控件自动下载的路径,用户如果没有安装控件,系统会自动访问codebase的路径下载控件;“#Version”后的是控件的版本,如果用户当前的软件版本低于“#Version”后面的版本,系统也会自动下载最新的控件

     

    注意:    如果控件的width 和height属性使用%表示,则要明确指明它所在的容器的大小,如把控件放到表格<td>内,则要明确指明表格<td>的width和height的绝对值。


    二、接口说明

    2.1  接口

    2.1.1     AboutBox

    原 型: void AboutBox();

    功  能:显示WebOffice版本信息

    返回值:

    示  例:

    document.all.WebOffice1.AboutBox();

     

    2.1.2     AcceptAllRevisions

    原  型: longAcceptAllRevisions();

    功  能:接受当前文档所有修订

    返回值:

    0:接受修订成功

           非零:接受修订失败

    示  例:

    document.all.WebOffice1.AcceptAllRevisions();

    2.1.3     CloseDoc

    原  型: long CloseDoc(longblReqSaved);

    功  能:关闭当前文档

    参 数:

          blReqSaved:

           0:关闭文档,不保存当前修改。

           1:关闭文档,保存当前修改。

           2:如果文档已经被修改,显示保存文档对话框,否则直接关闭。

           其它:关闭文档,保存当前修改。

    返回值:

           0:    失败

           非零: 成功

    示  例:

        //关闭当前文档,不保存当前修改。

    document.all.WebOffice1.CloseDoc (0);

     

    2.1.4     DelLocalFile

    原  型: long DelLocalFile(BSTRstrFilePathName);

    功  能:删除本地文件

    参 数:

          strFilePathName:本地文件的绝对路径。

    返回值:

           0:    删除成功

           非零: 删除失败

    示  例:

     document.all.WebOffice1.DelLocalFile("c:\\111.doc");

     

    2.1.5    GetDocumentObject

    原  型: IDispatch*GetDocumentObject();

    功  能:

    获取文档对象的ActiveDocument对象,此接口非常重要,基本所有的VBA功能都可以通过这个接口来实现。

    参 数:                  

    返回值: ActiveDocument对象的Dispatch

    示  例:

    /* 以下的JavaScript为采用ActiveDocument的方式直接操作VBA,向DOC文档的书签中加入一个图片。

    function AddPicture(strMarkName,strBmpPath,vType)

    在书签位置插入图片,

    strMarkName 书签的名称

    strBmpPath  图片的路径

    vType       插入后的图片的样式,5为浮动在文字上面

    AddPicture("test1","d:\\111.bmp",5);

    AddPicture("test1","d:\\111.bmp",128);

    */

    function AddPicture(strMarkName,strBmpPath,vType)

    {

    //定义一个对象,用来存储ActiveDocument对象
             var obj;
             obj =new Object(document.all.WebOffice1.GetDocumentObject());
             if(obj!=null){
                   var pBookMarks;

    // VAB接口获取书签集合
                      pBookMarks = obj.Bookmarks;
                      var pBookM;

    // VAB接口获取书签strMarkName
                      pBookM = pBookMarks(strMarkName);
                      var pRange;

    // VAB接口获取书签strMarkName的Range对象
                      pRange = pBookM.Range;
                      var pRangeInlines;

    // VAB接口获取书签strMarkName的Range对象的InlineShapes对象
                      pRangeInlines = pRange.InlineShapes;
                      var pRangeInline;

    // VAB接口通过InlineShapes对象向文档中插入图片
                      pRangeInline = pRangeInlines.AddPicture(strBmpPath); 

    //设置图片的样式,5为浮动在文字上面
                      pRangeInline.ConvertToShape().WrapFormat.TYPE = vType;
                      delete obj; 

       }

    }

     

    2.1.6     GetFieldValue

    原  型: BSTRGetFieldValue(BSTR strFieldName, BSTR strSheetName);

    功  能:获得书签位置的数值

    参 数:

    strFieldName:书签的名字

    strSheetName:预留字段(值为空)

        

    返回值:返回书签的值

    示  例:

    //获得书签的值

     var strFieldValue=document.all.WebOffice1.GetFieldValue("mark_1","")

     

    2.1.7     GetTempFilePath

    原  型: BSTRGetTempFilePath();

    功  能:获得临时文件路径

    参 数:                  

    返回值:当前文件的临时路径

    示  例:

     var strTempPath=document.all.WebOffice1.GetTempFilePath()

    2.1.8     GetRevCount

    原  型: longGetRevCount();

    功  能:获取修订节点的个数

    参 数:                  

    返回值:获取修订节点的个数

    示  例:

     

     

     

    2.1.9     GetFileSize

    原  型: longGetFileSize (LPCTSTR strFilePath);

    功  能:获取本地文件的大小

    参  数:                  

    返回值:

    示  例:

     var vLen = obj.GetFileSize("c:\\111.doc");

    2.1.10   GetBookMarkCount

    原 型: longGetBookMarkCount();

    功 能:获取文档中书签的总数量

    参 数:                  

    返回值:

    示 例:

     

    2.1.11   GetBook MarkInfo(lIndex,iType)

    原 型: longGetBook MarkInfo(lIndex,iType);

    功 能:获取文档中书签的信息

    参 数:

    lIndex:书签的序号,从1开始

       iType:获取内容类型。0获取书签名,1获取书签值

    返回值:

    示 例:

     

    2.1.12   HideMenuItem

    原  型: long HideMenuItem(long lMenuType);

    功  能:控制自有工具栏的显示

    参 数:

    lMenuType工具栏开关,采用32位的数字作为开关,当相关位为1的时候,按钮显示,为0是按钮隐藏。

    enum{

        vNew = 0x01,         //新建

        vOpen= 0x02,             //打开

        vSaveAs= 0x04,       //保存

        vPrint= 0x10,          //打印

        vPrintView= 0x20,      //打印预览

        vReturn= 0x1000,       //全屏

    vShowHideMenu = 0x4000, //显示/隐藏菜单

        vFullScrean= 0x2000    //返回

    };

    返回值:

    示  例:

     //只显示新建和全屏按钮

    Object.HideMenuItem(0x01 + 0x1000);

    2.1.13   HttpInit

    原  型: long HttpInit();

    功  能:初始化上传接口

    参 数:                  

    返回值:

    示  例:

    //上传前必须执行此方法

    document.all.weboffice1.HttpInit();

    2.1.14   HttpAddPostFile

    原  型: longHttpAddPostFile(BSTR strName, BSTR strFile);

    功  能:Http上传相关(保留)

    参 数:                  

    返回值:

    示  例:

    //上传本地文件c:\\111.doc

    document.all.weboffice1.HttpAddPostFile("111","c:\\111.doc")

     

    2.1.15   HttpAddPostString

    原  型: longHttpAddPostString(BSTR strName, BSTR strValue);

    功  能:添加要上传的表单域

    参 数:

          strName:表单域的名称

           strValue:表单域的值

          

    返回值:

          

    示  例:

    //添加表单域,可多次执行此方法

    document.all.WebOffice1.HttpAddPostString("DocTitle",myform.DocTitle.value);

     

    2.1.16   HttpAddPostCurrFile

    原  型: longHttpAddPostCurrFile(String field, String newFileName);

    功  能:添加要上传的Word或者Excel文件

    参  数:

    Field:要上传文件的id

    newFielName:上传后的新文件名。该参数可以为空,系统将自动为文件命名

    返回值:

    示 例:

    document.all.WebOffice1.HttpAddPostCurrFile("DocContent","");

    2.1.17   HttpPost

    原  型: BSTR HttpPost(BSTRstrHttpURL);

    功  能:将当前表单和文件数据提交到指定URL路径

    参 数:

    strHttpURL:  处理表单和文件数据的文件URL路径   

    返回值:

         Succeed:上传成功

          failed: 上传失败

    示  例:

    //相对路径

    var returnValue=document.all.WebOffice1.HttpPost("../saveDoc.jsp");

    //绝对路径

    var returnValue=document.all.WebOffice1.HttpPost("http://127.0.0.1/saveDoc.jsp")

    2.1.18   InsertFile

    原  形:short  InsertFile(LPCTSTR strFilePathName, shortnCurPos)

    功  能:插入合并文件,和插入图片。

    参  数:strFilePathName:

               文件或者图片的路径,可以是Http.或者Ftp路径

             nCurPos:

               位置和图片控制符。nCurPos 或者nCurPos -8

               0: 当前位置

               1: 文件开头

    2: 文件末尾

                如果第四位为1:表示插入的是图片

          

    返回值:

           0:正确

           其他:错误

    示  例:

    //文件头部

    document.all.WebOffice1.InSertFile("http://XX.com/XX.doc",1);

    //文件尾部

    document.all.WebOffice1.InSertFile("http://XX.com/XX.doc",2);

    //当前光标位置

    document.all.WebOffice1.InSertFile("http://XX.com/XX.doc",0);

    //文件头部

    document.all.WebOffice1.InSertFile("http://XX.com/XX.jpg",9);

    //文件尾部

    document.all.WebOffice1.InSertFile("http://XX.com/XX.jpg",10);

    //当前光标位置

    document.all.WebOffice1.InSertFile("http://XX.com/XX.jpg",8);

    2.1.19   IsOpened

    原  型: long IsOpened();

    功  能:判断当前是否打开文件

    参 数:                  

    返回值:

    0:表示当前未打开文档

    非0:表示已经打开文档

    FILE_TYPE_WORD = 11,

    FILE_TYPE_WORD =11,

    FILE_TYPE_EXCEL= 12,

    FILE_TYPE_PPT = 13,

    FILE_TYPE_RTF = 14,

    FILE_TYPE_WPS = 21,

    FILE_TYPE_PDF = 31,

    FILE_TYPE_UNK = 127     

     

    示  例:

    var isOpened=document.all.WebOffice1.IsOpened();

    2.1.20   IsSaved

    原  型: long IsSaved();

    功  能:判断文件是否被修改

    参 数:                  

    返回值:

    0:文件已被修改

    非零:文件未被修改

     

    示  例:

    var isSaved=document.all.WebOffice1.IsSaved();

    2.1.21   LoadOriginalFile

    原  型: longLoadOriginalFile(BSTR pcFileNameOrUrl, BSTR pcType);

    功  能:新建、装载Office文档

    参 数:

    pcFileNameOrUrl:

    要装载文件的本地路径或者URL,值为空表示新建文档,如果是在Http的Web环境下,可以传相对路径. 

    pcType:

    doc:打开、新建Word文件

    xls:打开、新建Excel文件

    ppt:打开、新建PPT  文件

    wps:打开、新建WPS  文件

        

    返回值:

          0:失败

              非0:成功

    示  例:

     // 通过URL打开一个服务器文件,getdoc.asp代码见演示文件

    document.all.WebOffice1.LoadOriginalFile("http://127.0.0.1/getdoc.asp?id=8","doc");

    // 通过URL打开一个服务器文件,相对路径

    document.all.WebOffice1.LoadOriginalFile("/getdoc.asp?id=8","doc");

    document.all.WebOffice1.LoadOriginalFile("./getdoc.asp?id=8","doc");

    // 新建Excel

    document.all.WebOffice1.LoadOriginalFile("","xls");

    // 通过Word打开本地文件

    document.all.WebOffice1.LoadOriginalFile("C:\\demo.doc","doc");

    2.1.22   OpenFileDlg

    原  型: shortOpenFileDlg();

    功  能:打开本地文件显示在WebOffice中

    参  数:pcFileNameOrUrl:保存的文件路径

    返回值:

    示  例:

    //打开对话框

    document.all.WebOffice1.OpenFileDlg()

    2.1.23   ProtectDoc

    原  型: longProtectDoc(long lProOrUn, long lType, BSTR strPWD);

    功  能:文档保护

    参  数:

    lProOrUn:

    └ 1:为保护文档

    └ 0:为解锁文档

    lType       :

    └ 0 :文档保护,只允许修订

    └ 1 :文档保护,只允许批注

    └ 2 :文档完全保护,不允许任何操作

    strPWD:文档保护、解锁时所需设置的密码

      

    返回值:

    示  例:

    // 保护文档,只允许修订

    document.all.WebOffice1.ProtectDoc(1,0, "12345");  

    // 解锁文档

    document.all.WebOffice1.ProtectDoc(0,0, "12345");     

     

    2.1.24   PrintDoc

    原  型: long PrintDoc(longblShowDlg);

    功  能:打印当前文档

    参 数:blShowDlg:

    0:不显示打印对话框,直接打印

                  非零:显示打印对话框

    返回值:

    0:打印失败

                  非零:打印成功

    示  例:

    //显示打印对话框

     document.all.WebOffice1.PrintDoc(1);

    2.1.25   PutSaved

    原  型: longPutSaved(boolean bSaved);

    功  能:设置当前文档的修改状态

    参  数: 

           0: 处于修改状态

           1: 处于保存状态

    返回值:

    示  例:

    //设置当前文档处于修改状态

    document.all.WebOffice1.PutSaved(0);

    2.1.26   Save

    原  型: long Save();

    功  能

    将文件保存原来位置,第一次保存时弹出对话框

    参  数:

    返回值:

    0:保存失败

           非零:保存成功

    示  例:

    document.all.WebOffice1.Save();

    2.1.27   SaveAs

    原  型: long SaveAs(BSTRstrFileName, long dwFileFormat);

    功  能:保存文件到本地

    参  数:

    strFileName: 要保存的文件路径和文件名

    dwFileFormat:保存的文件类型

         └ 0 Word类型

         └ 2 Txt文件

         └ 6 Rtf文件

    └ -4143 Excel类型

    返回值:

    示  例: 

    document.all.WebOffice1.SaveAs("C:\\test.doc",0);      //另存为Word文件

    document.all.WebOffice1.SaveAs("C:\\test.txt",2);      //另存为Txt文件

    document.all.WebOffice1.SaveAs("C:\\test.rtf",6);      //另存为Rtf文件

    document.all.WebOffice1.SaveAs("C:\\test.xls",-4143);  //另存为Excel文件 

    2.1.28   SetFieldValue

    原  型: longSetFieldValue(BSTR strFieldName, BSTR strValue, BSTR strSheetName);

    功  能:添加书签,套红头模板

    参  数:strFieldName:书签的名字,对于Excel文件,此数据位单元格

    strValue:书签的值,该处可以是个用于返回数据的URL,用于套红头模板。对于Excel文件,如果插入的是图片,此数值为::JPG::+图片的路径

    strSheetName:命令的类型,对于Excel文件此数值为Sheet的名称

         └ ::ADDMARK::  添加书签

              └::DELMARK::  删除书签

              └::JPG::         添加图片,可以利用这个来实现图片电子印章

         └ ::FILE::      调用本地或者URL的文件设置书签值(套红头)

     

    返回值:

    示  例:

    // 添加书签mark_1,并为它赋值

    document.all.WebOffice1.SetFieldValue("mark_1","北京","::ADDMARK::");

    // 为已存在的书签mark_1赋值

    document.all.WebOffice1.SetFieldValue("mark_1","电子签章",  "");

    // 套本地红头

    document.all.WebOffice1.SetFieldValue("mark_1","c:\\test.doc", "::FILE::");

    // 套服务端红头1,getDoc.asp页用于返回要装载Word的二进制值,代码见演示文件

    document.all.WebOffice1.SetFieldValue("mark_1","http://127.0.0.1/getdoc.asp?id=8", "::FILE::");

    // 套服务端红头2

    document.all.WebOffice1.SetFieldValue("mark_1","http://127.0.0.1/test.doc","::FILE::");

    //添加图片电子印章

    document.all.WebOffice1.SetFieldValue("mark_1","http://127.0.0.1/seal.bmp","::JPG::");

    //在Excel中添加图片

    document.all.WebOffice1.SetFieldValue("","::JPG::http://www.google.cn/intl/zh-CN/images/logo_cn.gif","");

    2.1.29   SetTrackRevisions

    原  型: longSetTrackRevisions(long lValue);

    功  能:修订文档

    参  数:

    lValue:文档修订状态

         └ 1: 开始修订文档

         └ 0: 进入非留痕状态

         └ 4:接受当前修订

    返回值:

    示  例:

    // 开始修订

    document.all.WebOffice1.SetTrackRevisions(1);

    // 接受修订

    document.all.WebOffice1.SetTrackRevisions(4);   

    2.1.30   ShowRevisions

    原  型: longShowRevisions(long nNewValue);

    功  能:显示、隐藏修订

    参  数:

    nNewValue:要保存的文件路径和文件名

         └ 1:显示修订

         └ 0:隐藏修订

    返回值:

    示例:

    document.all.WebOffice1.ShowRevisions(0);     //隐藏修订

    2.1.31   SetCurrUserName 

    原  型: longSetCurrUserName(BSTR strCurrUserName);

    功  能:设置当前编辑Word、Excel的用户名,主要用于修订文档,标识不同人进行的不同操作

    参  数:strCurrUserName:当前编辑人的用户名

    返回值:

      示  例:document.all.WebOffice1.SetCurrUserName("张三");   

    2.1.32   ShowDialog

    原 型: long ShowDialog(longdwIndex);

    功  能:

            显示对话框

    参  数:

          dwIndex:对话框的ID数值,详细的数值列表请参照附件。

    返回值:

    示  例:

     

    2.1.33   UnProtectDoc(BSTR strPwd)

    原 型: long UnProtectDoc(BSTR strPwd);

    功  能:解除当前文档保护

    参  数:strPwd文档保护时所设置的密码

    返回值:

    0:解锁成功

           非零:解锁失败

    示  例:

    document.all.WebOffice1.UnProtectDoc("12345");

     

     


    2.2  属性

    2.2.1     DocType

    原  型: longDocType;

    说  明:文件类型,只读

    数 值

    FILE_TYPE_WORD =11,

    FILE_TYPE_WORD = 11,

    FILE_TYPE_EXCEL = 12,

    FILE_TYPE_PPT = 13,

    FILE_TYPE_RTF = 14,

    FILE_TYPE_WPS = 21,

    FILE_TYPE_PDF = 31,

    FILE_TYPE_UNK = 127     

     

    2.2.2    Version

    原 型: BSTRVersion;

    说  明:打开文件的版本号,只读

    数  值

     

    2.2.3     AppVersion

    原 型: BSTRVersion;

    说  明:打开文件的版本号,只读

    数  值

     

    2.2.4    lEventRet

    原 型: BOOL LEventRet;

    说  明:见事件 NotifyToolBarClick事件

    数  值

     

    2.2.5    IsModify

    原 型: BOOLIsModify;

    说  明:判断文档是否被修改,需要在LoadOrigarFile之前设置 OptionFlag|= 0x0400 才有效。

    2.2.6    lContinue

    原  型: long lContinue;

    功  能:用于NotifyWordEvent的处理函数中,可以终止相应事件的继续执行

    参  数:

    返回值:

           1:可以继续执行(默认)

           0:不是2007版本

    示  例:

    //禁止关闭当前的Word/Excel/Wps文档

    OnNotifyWordEvent(BSTRstrEventName)

    {

    if(strEventName == “DocumentBeforeClose”)

    {

    lContinue = 0;

    }

    }

     

    2.3  事件

    2.3.1     NotifyWordEvent

    原  型:  void  NotifyWordEvent(BSTRstrEventName);

    说  明:捕获部分Word/Excel/Wps事件。

    参数:strEventNameàWord/Excel的事件名,可能是以下的数值

    DocumentChange

    DocumentBeforeClose

    DocumentBeforePrint

    DocumentBeforeSave

    备注:本事件在本版本扩展到Excel和Wps的支持,且可以终止该事件的继续执行(使用属性lContinue)。

    2.3.2    NotifyCtrlReady

    原 型: void NotifyCtrlReady();

    说  明:当控件准备完毕后触发,一般在这个事件中完成初始化的操作。

     

     

    2.3.3    NotifyToolBarClick

    原 型: voidNotifyToolBarClick(long iIndex);

    参 数:

    long iIndex : 工具栏按钮ID。

    ID_RETURN                       32769

    ID_NEW                           32770

    ID_OPEN                          32771

    ID_SAVEAS                        32772

    ID_FULLSCREAN                   32773

    ID_PRINT                         32774

    ID_PRINTVIEW                    32775

    说  明:

       

    (不适用于Office2007)每个按钮都有默认的处理动作,如果不希望触发默认的处理动作,需要在此时间中设置属性lEventRet = 0;

    以下实例截获了SAVEAS的按钮事件。

    //1. 定义事件处理函数

    <SCRIPTLANGUAGE=javascript FOR=WebOffice1 VENT=NotifyToolBarClick(lCmd)>

    <!--

     WebOffice1_NotifyToolBarClick(lCmd)

    //-->

    </SCRIPT>

    //2. 截获处理事件

    functionWebOffice1_NotifyToolBarClick(lCmd) {

        if(32772==lCmd){

           document.all.WebOffice1.lEventRet = 0;   

        }

    }

     

    附录:WebOffice文件Http上传原理

    WebOffice文件Http上传原理分析

     

    WebOffice控件使用了自身的文件Http上传接口实现文件和表单域的上传保存,本文将简要介绍该上传方式的原理和使用方法。注:WebOffice的上传接口和AIP是一致的。

     

    原理

    因为Web页面上的WebOffice打开的文件无法随表单记录提交到处理页面,所以我们把文件模拟成表单的文件域<input type=file …>,通过接口把文件和表单元素发送到保存记录的页面(过程类似表单的提交)。

     

    主要上传接口:

    l HttpInit();

    该方法用于初始化上传接口,不需要设置参数

     

    l HttpAddPostString(String FieldName, String someValue);

    添加要提交的表单域, FieldName是要上传表单域名称,someValue是表单域值

    例一:

    HttpAddPostString("username", "zhangSan");

    它类似域表单域的

    <input type=text name=username value=zhangSan>

                  例二:

                         HttpAddPostString("username", WebForm.username.value);

                         ….

                         <form name= WebForm >

    <input type=text name=username value=zhangSan>

                         </form>

    注意如果使用 上传接口,那么form表单里的表单域不会被提交到处理页面。需要手工添加到上传接口(HttpAddPostString接口),然后通过控件发送到处理页面。例二使用了“WebForm.username.value”获取表单域值。

     

    l HttpAddPostCurrFile(String fileName, String ReName);

    添加当前WebOffice编辑的文件给上传接口,该接口把文件模拟到成一个表单的文件域,并提交到处理页面。

    例一:

    HttpAddPostCurrFile("AipFile", "");

    该接口模拟表单文件域如下:

    <input type=file name=AipFile >

    注意:第二个参数为空表示控件自动为文件命名,如:dj_temp.aip,如果需要重命名可以在第二个参数指明文件名称,也可在保存页面指定文件名称。

     

    l HttpPost(String url);

    执行上传操作将文件和表单域提交到url的页面进行保存操作,并获取url页面返回的执行结果 (是否成功,可以根据这个结果来获取服务器端执行的结果)。

    url支持绝对路径和相对路径。

    绝对路径,例如:http://192.168.0.1/savedoc.asp

    相对路径要以“./”或者“../”开头。例如:./savedoc.asp

    完整的上传接口演示

    function SaveDoc() {

             var returnValue;                                              //保存页面的返回值

             document.all.WebOffice1.HttpInit();  //初始化Http引擎

    // 添加相应的Post元素

             document.all.WebOffice1.HttpAddPostString("username", WebForm. username.value);

             // 添加上传文件

             document.all.WebOffice1.HttpAddPostCurrFile("AipFile ","");   

             // 提交上传文件

             returnValue = document.all.WebOffice1.HttpPost("../saveDoc.jsp");

             if("true" == returnValue){

                       alert("文件上传成功");       

             } else  {

                       alert("文件上传失败")

             }

    }

     

    关于保存

    WebOffice上传接口将数据流以Http方式提交到保存页面,至于对数据处理就和普通的文件上传处理一样了,具体代码参考附件(asp和jsp的实现)。


    论坛:http://forum.dianju.cn/

     

     

    展开全文
  • 在使用office web apps实现office文档在线预览的时候,需要注意的地方。 web api web api作为owa在线预览服务回调的接口,这里面核心代码片段如下: using H5.Business; using H5.Business.Log; using H5....

    摘要

    在使用office web apps实现office文档在线预览的时候,需要注意的地方。

    web api

    web api作为owa在线预览服务回调的接口,这里面核心代码片段如下:

    using H5.Business;
    using H5.Business.Log;
    using H5.Enums;
    using H5.Model;
    using H5.Utility;
    using Newtonsoft.Json;
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web;
    using System.Web.Hosting;
    using System.Web.Http;
    using WebSite.OfficeViewerService.Helpers;
    
    namespace WebSite.OfficeViewerService.Controllers.Api
    {
    
        [RoutePrefix("api/wopi")]
        public class FilesController : ApiController
        {
            IFileHelper _fileHelper;
            HttpResponseMessage _response;
            ILog _log;
            /// <summary>
            /// Base constructor
            /// </summary>
            public FilesController()
            {
                _fileHelper = new FileHelper();
                _response = new HttpResponseMessage(HttpStatusCode.OK);
                _log = new DbLog(LogSource.WebLog, AppNameType.office_view);
    
            }
            /// <summary>
            /// Required for WOPI interface - on initial view
            /// </summary>
            /// <param name="name">file name</param>
            /// <returns></returns>        
            [HttpGet]
            [Route("files/{name}")]
            public CheckFileInfo Get(string name)
            {
                _log.Info(new LogModel { Content = "get fileinfo by name", Op = "get_fileinfo" });
                return _fileHelper.GetFileInfo(name);
            }
    
            /// <summary>
            /// Required for WOPI interface - on initial view
            /// </summary>
            /// <param name="name">file name</param>
            /// <param name="access_token">token that WOPI server will know</param>
            /// <returns></returns>
            [HttpGet]
            [Route("files/{name}")]
            public CheckFileInfo Get(string name, string access_token)
            {
                _log.Info(new LogModel { Content = "get fileinfo by name&access_token", Op = "get_fileinfo" });
                return _fileHelper.GetFileInfo(name);
            }
    
    
    
            /// <summary>
            /// Required for View WOPI interface - returns stream of document.
            /// </summary>
            /// <param name="name">file name</param>
            /// <param name="access_token">token that WOPI server will know</param>
            /// <returns></returns>
            [HttpGet]
            [Route("files/{name}/contents")]
            public HttpResponseMessage GetFile(string name, string access_token)
            {
                _log.Info(new LogModel { Content = "get file contents by name&access_token", Op = "get_fileinfo" });
                return DownLoadFileStream(name, access_token);
            }
            /// <summary>
            /// get owa file
            /// </summary>
            /// <param name="name"></param>
            /// <returns></returns>
            [HttpGet]
            [Route("files/{name}/contents")]
            public HttpResponseMessage GetFile(string name)
            {
                _log.Info(new LogModel { Content = "get file contents by name", Op = "get_fileinfo" });
                return DownLoadFileStream(name, string.Empty);
            }
            private HttpResponseMessage DownLoadFileStream(string name, string access_token)
            {
                try
                {
                    _log.InfoAsync(new LogModel { Content = name + "_" + access_token, Itcode = string.Empty,
    Op = "Office_View_GetFile" }); FastDFSFileBusiness fastDFSFileBusiness = new FastDFSFileBusiness(); var file = fastDFSFileBusiness.FindFastDFSFileByMD5(name); if (file != null) { using (WebClient webClient = new WebClient()) { byte[] buffer = webClient.DownloadData(file.Url); _log.Info(new LogModel { Content = "download file success", Op = "get_fileinfo" }); MemoryStream stream = new MemoryStream(buffer); _response.Content = new StreamContent(stream); _response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); } } return _response; } catch (Exception ex) { _log.Error(new LogModel { Ex = ex, Op = "Office_View_GetFile_err" }); _response.StatusCode = HttpStatusCode.InternalServerError; var stream = new MemoryStream(UTF8Encoding.Default.GetBytes(ex.Message ?? "")); _response.Content = new StreamContent(stream); return _response; } } } }

    需要注意:在获取文件流的时候,不要是否文件流,不然会造成有的文件预览正常,有的预览报错。

    fileHelper用来获取文件信息,这里文件统一上传到文件服务器fastdfs上,通过下载文件流设置文件信息,在传递文件的时候,使用文件md5进行传递,避免因为文件名出现中文名或者空格造成编码问题。

    构造owa预览地址

    using H5.Utility;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Web;
    using System.Xml.Serialization;
    
    namespace WebSite.OfficeViewerService.Helpers
    {
        /// <summary>
        /// 
        /// </summary>
        public class WopiAppHelper
        {
            public WopiAppHelper() { }
            /// <summary>
            /// 获取office在线预览的链接
            /// </summary>
            /// <param name="fileMD5"></param>
            /// <param name="ext"></param>
            /// <param name="fileUrl"></param>
            /// <returns></returns>
            public string GetDocumentLink(string fileMD5, string ext, string fileUrl)
            {
                string apiUrl = string.Format(ConfigManager.OWA_MY_VIEW_URL, fileMD5);
                string findUrl = FindUrlByExtenstion(ext);
                if (!string.IsNullOrEmpty(findUrl))
                {
                    return string.Format("{0}{1}{2}&access_token={3}", ConfigManager.OWA_URL, findUrl, apiUrl, fileMD5);
                }
                else
                {
                    return fileUrl;
                }
    
            }
            /// <summary>
            /// 根据文件扩展名获取预览url
            /// </summary>
            /// <param name="ext"></param>
            /// <returns></returns>
            private string FindUrlByExtenstion(string ext)
            {       
                if (string.IsNullOrEmpty(ext))
                {
                    throw new ArgumentNullException("extension is empty.");
                }
                if (ext.IndexOf(".") >= 0)
                {
                    //如果包含.则进行过滤
                    ext = ext.TrimStart('.').ToLower();
                }
                string url = string.Empty;
                switch (ext)
                {
                    case "ods":
                    case "xls":
                    case "xlsb":
                    case "xlsm":
                    case "xlsx":
                        url = "/x/_layouts/xlviewerinternal.aspx?WOPISrc=";
                        break;
                    case "one":
                    case "onetoc2":
                        url = "/o/onenoteframe.aspx?WOPISrc=";
                        break;
                    case "odp":
                    case "pot":
                    case "potm":
                    case "potx":
                    case "pps":
                    case "ppsm":              
                    case "ppsx":
                    case "ppt":
                    case "pptm":
                    case "pptx":
                        url = "/p/PowerPointFrame.aspx?WOPISrc=";
                        break;
                    case "doc":
                    case "docm":
                    case "docx":
                    case "dot":
                    case "dotm":
                    case "dotx":
                        url = "/wv/wordviewerframe.aspx?WOPISrc=";
                        break;
                    default:
                        break;
                }
                return url;
            }
        }
    }

    总结

    在开发中因为涉及到回调,最好找一个代理的工具,比如ngrok将机器代理到外网,方便调试开发。

    展开全文
  • Google Map Web服务API

    2016-06-07 09:16:26
    Google Places API 是一项使用 HTTP 请求返回“地方”(在此 API 中定义为场所、地理位置或著名兴趣点)的相关信息的服务。“地方”请求将位置指定为纬度/经度坐标。   四个基本的“地方”请求: 1) ...

    1  

    Google Places API 是一项使用 HTTP 请求返回“地方”(在此 API 中定义为场所、地理位置或著名兴趣点)的相关信息的服务。“地方”请求将位置指定为纬度/经度坐标。

     

    四个基本的“地方”请求:

    1)  Place Search 会根据用户的位置返回附近的“地方”列表。

    2)  地方详情请求会返回关于某个特定“地方”的更加具体的详情。

    3)  地方所在位置可让您报告某位用户已到达某个“地方”。“所在位置”用于衡量某个“地方”的热门程度;频繁的报告位置可以提高该“地方”在您应用程序的 Place Search 结果中的排名。

    4)  地方报告可让您向“地方”服务添加新的“地方”,还可删除您的应用程序已添加的“地方”。

      注意:其中请求URL中的types有如下类型:

    // 定义GPS查询中type类型为,以下数字逐个加1,上面为英文,下面为中文描述;

    accounting      会计事务所         

    airport                      机场         

    amusement park          游乐园       

    aquarium                   水族馆       

    art gallery                艺术画廊     

    atm                        自动取款机   

    bakery                     面包店       

    bank                       银行         

    bar                        酒吧         

    beauty salon               美容沙龙     

    bicycle store              自行车店     

    book store                 书店         

    bowling alley              保龄球馆     

    bus station                汽车站       

    cafe                       咖啡馆       

    campground                 营地         

    car dealer                 汽车经销商   

    car rental                 汽车出租     

    car repair                 汽车维修     

    car wash                   洗车         

    casino                     赌场         

    cemetery                   墓地         

    church                     教堂         

    city hall                  市政厅       

    clothing store             服装店       

    convenience store          便利店       

    courthouse                 法院         

    dentist                    牙科医生     

    department store           百货商店     

    doctor                     医生         

    electrician                电工         

    electronics store          电子商店     

    embassy                    使馆         

    establishment              编制         

    finance                    金融         

    fire station               消防局       

    florist                    花商         

    food                       食物         

    funera home                funera家     

    furniture store            家具店       

    gas station                加油站       

    general contractor         总承包商     

    grocery or supermarket     杂货店或超市 

    gym                        健身房       

    hair care                  护发          

    hardware store             五金商店     

    health                     健康         

    hindu temple               印度教寺庙   

    home goods store           家居用品店   

    hospital                   医院         

    insurance agency           保险代理     

    jewelry store              首饰商店     

    laundry                    洗衣店       

    lawyer                     律师         

    library                    文库         

    liquor store               酒品店       

    local government office    当地政府办公室

    locksmith                  锁匠         

    lodging                    住宿         

    meal delivery              送饭         

    meal takeaway              餐外卖       

    mosque                     清真寺       

    movie rental               电影租赁     

    movie theater              电影院       

    moving company             搬家公司     

    museum                     博物馆       

    night club                 夜总会       

    painter                    画家         

    park                       公园         

    parking                    停车         

    pet store                  宠物商店     

    pharmacy                   药房         

    physiotherapist            物理治疗师   

    place of worship           礼拜场所     

    plumber                    水管工人     

    police                     警方         

    post office                邮局         

    real estate agency         地产代理     

    restaurant                 餐厅         

    roofing contractor         屋面承包商   

    rv park                    RV公园       

    school                     学校         

    shoe store                 鞋店         

    shopping mall              商场         

    spa                        温泉         

    stadium                    体育场       

    storage                    存储         

    store                      存储         

    subway station             地铁站       

    synagogue                  犹太教堂     

    taxi stand                 的士站       

    train station              火车站       

    travel agency              旅行社       

    university                 大学         

    veterinary care            兽医护理     

    zoo                        动物园       

     

     

    administrative area level 1       行政区域级1  

    administrative area level 2       2级行政区域  

    administrative area level 3       行政区域3级  

    colloquial area                   口语化的区域 

    country                           国家         

    floor                             地板         

    geocode                           地理编码     

    intersection                      路口         

    locality                          地方         

    natural feature                   自然特征     

    neighborhood                      附近         

    political                         政治         

    point of interest                 兴趣点       

    post box                          邮政信箱     

    postal code                       邮政编码     

    postal code prefix                邮递区号前缀 

    postal town                       邮政镇       

    premise                           前提         

    room                              房间         

    route                             路线         

    street_address                    街道地址     

    street number                     门牌号码     

    sublocality                       sublocality  

    sublocality level 4               sublocality4级

    sublocality level 5               sublocality5级

    sublocality level 3               sublocality3级

    sublocality level 2               sublocality2级

    sublocality level 1               sublocality1级

    subpremise                        subpremise   

    transit station                   中转站        

     

    Google Places API 具有以下查询限制:

    • 拥有 API 密钥的用户每24小时内最多可以提出 1 000 个请求。
    • 已另外通过 API 控制台验证过身份的用户每 24 小时内最多可以提出 100 000 个请求。验证时需要您提供信用卡信息,您可以在控制台中启用结算我们不会因您使用 Places API 而从您的信用卡中扣除任何费用

    虽然较低的限制对于研发和测试而言已经足够,但我们建议您在发布应用程序之前启用较高的限制。

    第一步,申请API密钥,。您可以通过 Google API 控制台管理 API 密钥。要激活 Places API 并创建密钥,请执行以下操作:

    1. 访问 API 控制台(网址为 https://code.google.com/apis/console)并使用您的 Google 帐户登录。
    2. 您首次登录控制台时,系统会为您创建一个名为 API Project 的默认项目。您可以使用该项目,也可以通过点击窗口顶部的 API 项目 (API Project) 按钮来创建一个新项目。
    3. 在 Places API 列表中点击激活,然后点击确定,以继续操作。
    4. 如果系统弹出提示,请选择要与此产品配合使用的 Google 帐户。在开发人员预览期间,您必须选择要用于接收邀请的帐户。点击允许
    5. 仔细阅读并接受服务条款。随后您会返回主控制台页面。
    6. 点击左侧导航栏中的 API 访问 (API access)。您的密钥会列出在此页面上。

     

    第二步,拼写发送http请求的url,注意需使用第一步申请的key;

    第三步,接收http请求返回的数据(支持json和xml格式)。

    1.1.5 接口示例

    1)    Place Search

    https://maps.googleapis.com/maps/api/place/search/json?location=-33.8670522,151.1957362&radius=500&types=food&name=harbour&sensor=true&key=AIzaSyBMGzm-1zXeLX-QNi9N7ozRJWZlREyYEe4

     

    2)   地方详情请求会返回关于某个特定“地方”的更加具体的详情。

    A.        URL例子:https://maps.googleapis.com/maps/api/place/details/xml?reference=CoQBcQAAAGVqFYQYyZYbF4bShF9CQcVoDIF5_5F_uWcspB1pBquRwcYdhOElfaKgMfjCX0qUFKgEWuXPyFQmmBmukIAtXWufvXDOr6tQw42Razq18UDkUxb__cnbAFsKTDcLx0dm_WZmNG1LM1lxzpq-ssVv-5ql1laWk68Y95ANtML4N8g4EhCWwGvhtha3bZp8FL5N0vLTGhRJkto62O-z4lktML8NKfLr2i2yOA&sensor=true&language=zh-CN&key=AIzaSyBMGzm-1zXeLX-QNi9N7ozRJWZlREyYEe4

    B.        样例图:

     

    3)   地方所在位置可让您报告某位用户已到达某个“地方”。“所在位置”用于衡量某个“地方”的热门程度;频繁的报告位置可以提高该“地方”在您应用程序的 Place Search 结果中的排名。

     

    4)   地方报告可让您向“地方”服务添加新的“地方”,还可删除您的应用程序已添加的“地方”。

     

        地址解析是将地址(如“1600 Amphitheatre Parkway, Mountain View, CA”)转换为地理坐标(如纬度 37.423021 和经度 -122.083739)的过程,您可以根据转换得到的坐标放置标记或定位地图。Google Geocoding API 可让您通过 HTTP 请求直接访问地址解析器。此外,该服务还可让您执行反向操作(将坐标转换为地址);此过程称为“反向地址解析”。

    Google Geocoding API包括地址解析和逆地址解析功能。

     

    Google Geocoding API 的使用有限制,即,每天 2,500 个地理位置查询请求。(Google Maps API Premier 用户每天最多可执行 100,000 个请求。)强制执行此限制是为了防止滥用和/或重复使用 Google Geocoding API。以后可能对此限制进行更改,而无需另行通知。此外,我们还强制设定了请求速率限制,以防滥用此服务。如果您超过了 24 小时的限制或者滥用此服务,Google Geocoding API 可能会暂停为您服务。如果您继续无视这个限制,将会阻止您对 Google Geocoding API 的访问。

     

    请注意:Google Geocoding API 只能与 Google Maps 配合使用;不能只进行地址解析而不在地图上显示结果。有关允许的用法的完整详细信息,请参见 Google Maps API 服务条款许可限制

     

    第一步,拼写发送http请求的url,不需要注册Key/密钥

    第二步,接收http请求返回的数据(支持json和xml格式)。

    • 地址解析:根据地址获取坐标  
    1. URL样例:

    http://maps.googleapis.com/maps/api/geocode/json?address=china+guangdong+zhuhai+%E8%A1%97%E9%81%93%E5%9C%B0%E5%9D%80&latlng=22.26972711397229%2C113.57751578092575&sensor=true&language=zh-CN

    1. 样例图:

     

    注意:Google Directions API 不需要 Maps API 密钥!

        Google Directions API 是一种使用 HTTP 请求计算多个位置间路线的服务。路线可以采用文本字符串伊利诺斯州芝加哥市澳大利亚新南威尔士达尔文市或纬度/经度坐标的形式指定起点、目的地和路标。Google Directions API 可以使用一系列路标传回多段路线.

    Google Directions API 是一种使用 HTTP 请求计算多个位置间路线的服务。

    Google Directions API 的使用受每个IP每天 2,500 路线请求的查询限制。单个路线请求可以包含多达8个中间路标。 Google Maps Premier 客户每天最多可以查询 100,000个路线请求,且在每个请求中最多可以使用 23个路标

     

    此外,在进行网址编码之前,请注意 Directions API 网址长度不得超过 2048个字符。由于某些 Directions 服务网址可能在一条路径中包含多个位置,因此在构建您的网址时请注意此限制。

     

    注意:Google Directions API 只能与 Google Maps 上的显示结果配合使用;下面这种情况是不允许的:使用路线数据而不显示为其请求路线数据的地图。另外,计算路线将会生成必须以某种方式向用户显示的版权和警告。有关允许的用法的完整详细信息,请参见 Google Maps API 服务条款许可限制

     

    第一步,拼写发送http请求的url,不需要注册Key/密钥;

    第二步,接收http请求返回的数据(支持json和xml格式)。

    • 地址解析:根据地址获取坐标  
    1. URL样例:

    http://maps.google.com/maps/api/directions/xml?origin=22.388412465842766,113.50859642028809&destination=22.372856833227992,113.57305526733398&waypoints=optimize:true&sensor=true&alternatives=true&language=zh-CN&units=metric&region=cn

    1. 样例图:

     

     

    Google Distance Matrix API 是一项服务,用于为起点和终点的矩阵提供行程距离和时间。系统会根据起点和终点之间的推荐路线(由 Google Maps API 计算)返回信息,并且返回的信息由多行配对的 duration 和 distance 值组成。

     

    该服务并不会返回详细的路线信息。您可以将所需的一对起点和终点传递至 Directions API,以获取路线信息。

     

    Google Distance Matrix API 是一项服务,用于为起点和终点的矩阵提供行程距离和时间,该服务并不会返回详细的路线信息。您可以将所需的一对起点和终点传递至 Directions API/详情见1.3 Google Directions API,以获取路线信息。

    1.4.3 使用限制

    每条发送至 Distance Matrix API 的查询可使用的元素数量是有限的,其数量由起点数乘以终点数来定义。

    Distance Matrix API 目前具有如下限制:

    • 每条查询可使用的元素数量为:100。
    • 每 10 秒可使用的元素配额为:100。
    • 每 24 小时周期内可使用的元素配额为:2 500。

    针对 Google Maps API 专业版客户的限制较为宽松:

    • 每条查询可使用的元素数量为:625。
    • 每 10 秒可使用的元素配额为:1 000。
    • 每 24 小时周期内可使用的元素配额为:100 000。

     

    Maps API 专业版客户可以与自己的 Google Enterprise 销售客户经理联系,以购买更多配额。

    在进行网址编码前,Distance Matrix API 网址长度的上限为2048个字符。某些 Distance Matrix API 服务网址可能会涉及多个位置,因此您在构建网址时请注意此限制。

    注意:使用 Distance Matrix API 的情况必须与 Google Map 上的信息显示有关;例如,在地图上请求并显示某些终点之前,应先确定起点-终点对彼此间的行程时间是否在特定值的范围内。在不显示 Google Map 的应用程序中,您无法使用该服务。

    1.4.4 如何使用

    第一步,拼写发送http请求的url,不需要申请key/密钥;

    第二步,接收http请求返回的数据(支持json和xml格式)。

    1.1.5 接口示例

    http://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Vancouver+BC&mode=bicycling&language=zh-CN&sensor=false

    实例讲解:

    http://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Victoria+BC&mode=bicycling&language=fr-FR&sensor=false

    该请求会返回四个元素 - 两个起点乘以两个终点:

     

    温哥华到旧金山

    温哥华到维多利亚

    西雅图到旧金山

    西雅图到维多利亚

     

     

    结果会以行的形式返回,每行包含一个起点搭配一个对应的终点。

    2      收费标准

    2.1:使用各 Maps API 的网站和应用程序如果符合以下条件则无需付费:

    1. 每个API每天的地图加载次数不超过 25,000 次
    2. 每天使用样式化地图功能修改的地图加载次数不超过2,500次

    如果您的应用程序超出了这些使用限制,那么您必须通过以下某种方法做出回应才能继续在应用程序中使用 Maps API:

    • 修改 Maps API 应用程序,以便让每天产生的地图加载次数低于应用程序使用的各 API 的使用限制;
    • 启用超限地图加载次数的自动结算功能;或
    • 购买 Maps API Premier 许可

    致力于公益事业的非盈利性网站和应用程序(其范围由 Google 自行决定)没有这些使用限制。例如,即使某个救灾地图是由商业实体开发和/或托管的,该地图也不会有使用限制。此外,我们还建议有资格的非盈利性网站和应用程序通过 Google Earth Outreach 计划申请 Maps API Premier 许可。此许可能为您带来许多优势,包括停用广告的权利、更高的 Maps API 网络服务配额和技术支持。

    我们在此处提供了要计入“地图加载次数”的情况的精确定义。您可以在此处找到有关费用的详情。

     

    2.2:超限地图加载次数的在线购买费用是多少?

    在符合 Google Maps API 服务条款相关要求的情况下,地图加载次数低于使用限制的应用程序无需付费即可使用 Maps API。超出使用限制的地图加载次数按以下标准收费:

    服务

    使用限制
    (每天)

    1,000 次超限地图加载
    (以美元为单位)

    JS Maps API v3

    25,000

    $4

    JS Maps API v3 样式化地图

    2,500

    $4[1]/$8[2]

    Static Maps API

    25,000

    $4

    Static Maps API 样式化地图

    2,500

    $4[1]/$8[2]

    Street View Image API

    25,000

    $4

    JS Maps API v2

    25,000

    $10

    [1] - 每天的地图加载次数在 2,500 到 25,000 次之间
    [2] - 每天的地图加载次数超过 25,000 次

    我们不会在线提供针对 Maps API for Flash 的超限地图加载次数。如果网站使用 Maps API for Flash 并超出了使用限制,就应该迁移至 JS Maps API v3;此外,您也可以购买 Maps API Premier 许可。

    您可以通过 Google API 控制台在线购买超限地图加载次数。使用情况每天计算一次,超限部分每月通过信用卡结算一次。请注意,如果您的网站每天产生的地图加载次数较多,那么购买 Maps API Premier 许可可能会更划算。

    另请注意,除了根据现有的服务条款继续使用 Maps API 的权利外,在线购买超限地图加载次数并不会获得任何额外的权利或权益。

     

    2.3:详解见Google Maps API for Business - Purchase Agreement

    https://www.google.com/enterprise/earthmaps/legal/us/maps_purchase_agreement.html

     

     

    3      破解方案(供参考)

    GoogleMap Geocoding API 地址解析受限的解决办法

     

           最近在做GoogleMap地址解析的事情,就是把现有的地址匹配上经纬度,不过无奈的发现Google是有限制的:Google Geocoding API 的使用有限制,即,每天 2,500 个地理位置查询请求。(Google Maps API Premier 用户每天最多可执行 100,000 个请求平【每年1W美金】。)强制执行此限制是为了防止滥用和/或重复使用 Google Geocoding API。以后可能对此限制进行更改,而无需另行通知。此外,我们还强制设定了请求速率限制,以防滥用此服务。如果您超过了 24 小时的限制或者滥用此服务,Google Geocoding API 可能会暂停为您服务。如果您继续无视这个限制,将会阻止您对 Google Geocoding API 的访问。

     

        所以就想一些解决办法绕过它,方法一:通过Google自己的GAE做代理,参见一个网上的帖子http://maosuhan.iteye.com/blog/724278,经过半天的尝试,主要是配置GAE的工作,参见http://blog.163.com/redsnow_cc/blog/static/17262058720111142433649/,再加上我自己写的web版的请求googlemap测试程序,发现也是有限制的,返回的结果也是Over_Query_Limit,经过分析,此种方法不行,仔细看了一下帖子是2010年的,两年前的帖子,而且无此种类似的帖子和跟帖,分析是google发现了这个漏洞,修复掉了,所以此后没有人跟进了。

     

    方法二:也是通过代理的方式,但是使用多个代理,每个代理可以访问2500个,那么用100代理就可以返回250000个,用400个代理就可以解决掉100万个了,满足要求了,但是发现网上只有一个这样的帖子,经过分析,这种代理都不稳定,而且实现起来比较复杂,pass。

     

    方法三:通过Windows services实现,每天进行2500个请求,要实现100万个地址的请求,得需要一年的时间,这种办法已经实现了,但是比较难的应用到实际应用中了,如果解析地址的数量比较少还可以,如果超过10万个了,时间久比较长了。

     

     综上所述,最好的方法还是购买,如果数量少就用windows services来实现。

    展开全文
  • 上一节,我们已经安装完毕,安装好了office web apps。大家只要打开浏览器,访问自己的域地址,我的是app.datrix3.com,如果可以看见这个界面 那就说明你安装无问题了。接下来就要通过Wopi协议将OWA集成到...

    我所有的代码都是用go语言编写,你可以直接编译后使用,不用再有其他的操作。
    最近项目实在太忙,这几天才有时间,这次是重头戏,要好好琢磨一下怎么写,才能更简洁的说清楚一切。
    上一节,我们已经安装完毕,安装好了office web apps。大家只要打开浏览器,访问自己的域地址,我的是app.datrix3.com,如果可以看见这个界面

    那就说明你安装无问题了。接下来就要通过Wopi协议将OWA集成到自己的项目中了。

    实现在线预览和编辑的Wopi协议

    首先你要明白什么是wopi协议,相关的资料中,WOPI的全称是“Web Application Open PlatformInterface”,中文名为“Web应用程序开放平台接口协议”。
    要知道,office web apps 可不会允许你直接去调用它相关的接口,网上的一张图就很好的说明了这点:

    你可以看见,在WOPI中,存在WOPI Server(或者称之为WOPI Host)和WOPI Client两种角色,我们可以将WOPI-Client看作我们搭建的OWA服务器,
    而WOPI Server就是我们要自己开发的Wopi服务,在图里可以看见,WOPI Client共向WOPI Server进行了两次请求,分别是Tell me about the file以及Give me the file,所以如果需要实现最简单的在线预览,你需要提供两个接口,如果要实现在线编辑,你还需要一个写入保存的接口。

    第一个接口为:Tell me about the file,我将它定义为GetFileInfo,它的url为
    http://{你自己的owa地址}/api/wopi/files/{file_name}
    这里需要你以JSON形式OWA传参,参数至少要包括如下信息:
    { "BaseFileName": "Sample Document.docx", "OwnerId": "tylerbutler", "Size": 300519, "SHA256":"+17lwXXN0TMwtVJVs4Ll+gDHEIO06l+hXK6zWTUiYms=", "Version":"GIYDCMRNGEYC2MJREAZDCORQGA5DKNZOGIZTQMBQGAVTAMB2GAYA====" }
    BaseFileName: 文件名。
    OwnerId: 文件所有者的唯一编号。
    Size: 文件大小,以bytes为单位。
    SHA256: 文件的256位bit的SHA-2编码散列内容。(Wordweb app必有,excel和ppt可以为null)
    Version: 文件版本号,文件如果被编辑,版本号也要跟着改变。
    下面是我的参数:

    type fileInfo struct {
        BaseFileName   string `json:"BaseFileName"`
        OwnerId        string `json:"OwnerId"`
        Size           int64  `json:"Size"`
        SHA256         string `json:"SHA256"`
        Version        string `json:"Version"`
        SupportsUpdate bool   `json:"SupportsUpdate,omitempty"`
        UserCanWrite   bool   `json:"UserCanWrite,omitempty"`
        SupportsLocks  bool   `json:"SupportsLocks,omitempty"`
    }

    你可以看见,这里有文件的size,sha256,这里要用代码去获取:

    //获取单个文件的大小
    func getSize(path string) int64 {
        fileInfo, err := os.Stat(path)
        if err != nil {
            panic(err)
        }
        fileSize := fileInfo.Size()
        return fileSize
    }
    //获取sha256
    func SHA256File(path string) (string, error) {
        buf, err := ioutil.ReadFile(path)
        if err != nil {
            return "", err
        }
        h := sha256.Sum256(buf)
        return base64.StdEncoding.EncodeToString(h[:]), nil
    }

    GetFileInfo接口代码:

    func GetFileInfo(w http.ResponseWriter, r *http.Request) {
        log.Println("GetFileInfo")
    
        vals := r.URL.Query()
        tmp, ok := vals["access_token"]
        if !ok || len(tmp[0]) == 0 {
            log.Println("access_token not found!")
        }
    
        vars := mux.Vars(r)
        fileName := vars["file_name"]
        if len(fileName) == 0 {
            log.Println("file_name empty!")
        }
        log.Println("file_name: ", fileName)
    
        testFilePath := path.Join(".", fileName)
    
        log.Println("PATH: ", testFilePath)
    
        var info fileInfo
        info.BaseFileName = fileName
        info.OwnerId = "admin"
        info.Size = getSize(testFilePath)
        info.SHA256, _ = SHA256File(testFilePath)
        log.Println("debug: sha256_b42: ", info.SHA256)
        // String value: eIMevgBhTd8Iqh1VjWbfWx7wd5vQvmDxlABMfz+pTiI=
        //info.SHA256 = "eIMevgBhTd8Iqh1VjWbfWx7wd5vQvmDxlABMfz+pTiI="
    
        info.Version = "2222"
        info.UserCanWrite = true
        info.SupportsLocks = true
    
        w.Header().Set("Content-Type", "application/json")
    
        json.NewEncoder(w).Encode(info)
    
        log.Println("GetFileInfo done...")
    }

    接下来是第二个接口Give me the file,我将它定义为GetFileContent,用于WOPI Client获取文件,这个接口的url为:
    http://owa服务器地址/api/wopi/files/{file_name}/contents
    这个接口通过文件流的方式返回文件,代码如下

    func GetFileContent(w http.ResponseWriter, r *http.Request) {
        log.Println("GetFileContent start.......")
    
        vals := r.URL.Query()
        tmp, ok := vals["access_token"]
        if !ok || len(tmp[0]) == 0 {
            log.Println("access_token not found!")
        }
    
        vars := mux.Vars(r)
        fileName := vars["file_name"]
        if len(fileName) == 0 {
            log.Println("file_name empty!")
        }
        log.Println("file_name: ", fileName)
    
        testFilePath := path.Join(".", fileName)
    
        data, err := ioutil.ReadFile(testFilePath)
        if err != nil {
            log.Println("read file err: ", err)
            return
        }
    
        w.Header().Set("Content-type", "application/octet-stream")
        w.Write(data)
        //json.NewEncoder(w).Encode(info)
        log.Println("GetFileContent done !")
    }

    如果你需要实现编辑的功能,你需要实现一个上传接口POSTfile,这个接口和上面那个url除了请求方式不同,其他都是一样的。
    http://owa服务器地址/api/wopi/files/{file_name}/contents
    代码如下

    func PostFileContent(w http.ResponseWriter, r *http.Request) {
        log.Println("PostFileContent start..........")
    
        vals := r.URL.Query()
        tmp, ok := vals["access_token"]
        if !ok || len(tmp[0]) == 0 {
            log.Println("access_token not found!")
        }
    
        vars := mux.Vars(r)
    
        fileName := vars["file_name"]
    
        if len(fileName) == 0 {
            log.Println("file_name empty!")
        }
    
        log.Println("file_name: ", fileName)
    
        testFilePath := path.Join(".", fileName)
    
        log.Println("PATH: ", testFilePath)
    
        body, err := ioutil.ReadAll(r.Body)
    
        if err != nil {
            log.Println("body empty")
        }
    
        ioutil.WriteFile(testFilePath, body, os.ModeAppend)
    
        w.Header().Set("Content-type", "application/octet-stream")
    
        // get Path,get file
    
    }

    现在三个接口都已经实现了,我们来看一下路由和具体的实现代码:

    func main() {
    
        router := mux.NewRouter()
        router.HandleFunc("/api/wopi/files/{file_name}", GetFileInfo).Methods(http.MethodGet)
        router.HandleFunc("/api/wopi/files/{file_name}/contents", GetFileContent).Methods(http.MethodGet)
        router.HandleFunc("/api/wopi/files/{file_name}/contents", PostFileContent).Methods(http.MethodPost)
        //开启8080端口
        err := http.ListenAndServe(":8080", router)
        log.Println(router)
        if err != nil {
            log.Println("http listen err: ", err)
        }
    }

    接下来你就可以go build,然后跑服务了,我这里设置的文件路径都是本目录下的,也就是说,服务在test文件夹下跑起来,那么你的office文件也要放在test文件夹下。

    最后,跑起来服务,应该访问的url如下:

    http://owa服务器地址/we/WordEditorFrame.aspx?WOPISrc=http//本地ip:8080/api/wopi/files/1.docx
    
    http:/owa服务器地址/p/PowerPointFrame.aspx?PowerPointView=ReadingView&WOPISrc=http//本地ip:8080/api/wopi/files/1.pptx
    
    http://owa服务器地址/x/_layouts/xlviewerinternal.aspx?WOPISrc=http//本地ip:8080/api/wopi/files/1.xlsx
    展开全文
  • office web apps 整合到自己项目中(wopi实现在线预览编辑) 借助office web apps实现在线预览和在线编辑 我所有的代码都是用go语言编写,你可以直接编译后使用,不用再有其他的操作。 最近项目实在太...
  • 在项目开发过程中,总会牵扯到接口文档的设计与编写,之前使用的都是office工具,写一个文档,总也是不够漂亮和直观。好在git上的开源大神提供了生成文档的工具,so来介绍一下! 该工具是Nodejs的模块,请务必在...
  • 常用API大全汇总

    2020-04-14 11:23:13
    一、天气查询 天气查询应用的场景非常广,我猜很多人练手的第一个项目就是做天气查询类的demo...AccuWeather- AccuWeather API通过一个简单的 REST 风格的 Web 界面为订阅者提供基于位置的天气数据的访问. Aeris W...
  • 原文出处:http://www.cnblogs.com/poissonnotes/p/3267190.html 还可参考:... 介绍Office Web Apps与其他系统的关系图, 从上述图中,可知实际上Office Web Apps也是可以接入自己开发的...
  • 最近项目中需要用到office文件在线编辑功能,然而很多解决方案都是收费的,于是决定采用微软免费的microsoft office online 2016和wopi 协议来实现。wopi 协议 WOPI的英文全称是“Web Application Open Platform ...
  • 这几个功能是电子政务和办公自动化中文档管理最重要的功能,本中间件很好的实现了这些功能。 5、 实现了客户端软件自动升级的功能 本中间件采用插件技术,能够通过版本号的更新,实现客户端软件自动更新功能。
  • 当然,VBA和宏录制功能已经非常成熟了,只是最近在学习JavaScript和一些前端的开发,所以浏览微软的文档发现了这个Office JS API。但是国内几乎搜索不到它的用法,再加上微软的那机器翻译的中文文档简直惨不忍睹,...
  • web2.0最全的国外API应用集合 原文地址:http://www.buguat.com/post/98.html 2.0时代,越来越多的API被大家广泛应用,如果你还不了解API是何物,请看这里的介绍。下面是由techmagazine总结出的国外API应用,...
  • 【史上最全】国内外常用精品API汇总 API是获取网络服务最便捷的方式,合理地使用API开发项目可以大大提高开发效率,把精力都集中在程序的业务逻辑之上,避免重复造轮子。推荐给大家个人觉得很赞的第三方API(资源...
  • office online server是Office Web Apps Server的升级版本,安装环境必须为Windows Server 2012 R2 参考地址:https://technet.microsoft.com/zh-cn/library/jj219455(v=office.16).aspx 注意事项: 请勿在...
1 2 3 4 5 ... 20
收藏数 5,469
精华内容 2,187
关键字:

officeweb 中文api