2017-07-07 172 views
1

我想打一个Office加载与angularjs和angularjs-UI-路由器:的ReferenceError:Excel中没有定义

<bt:Urls> 
    <bt:Url id="Contoso.Taskpane3.Url" DefaultValue="https://localhost:3000/addin/test" />    
</bt:Urls> 

模块的名称是app,和路由器如下:

.state('addinTest', { 
    url: '/addin/test', 
    tempalte: 'abc', 
    controller: 'TestCtrl', 
    resolve: { 
     loadMyCtrl: ['$ocLazyLoad', function ($ocLazyLoad) { 
      return $ocLazyLoad.load('https://appsforoffice.microsoft.com/lib/1/hosted/office.js'); 
     }], 
     initOffice: ['loadMyCtrl', function (loadMyCtrl) { 
      Office.initialize = function (reason) { 
       $(document).ready(function() { 
        angular.element(document).ready(function() { 
         angular.bootstrap(document, ['app']) 
        }) 
       }); 
      } 
      return Promise.resolve(null) 
     }] 
    } 
}) 

而且控制器:

app.controller('TestCtrl', [function() { 
    function loadDataAndCreateChart() { 
     Excel.run(function (ctx) { 
      var sheet = ctx.workbook.worksheets.getActiveWorksheet(); 
      sheet.getRange("A1").values = "Quarterly Sales Report"; 
      return ctx.sync() 
     }) 
    } 
    loadDataAndCreateChart() 
}]) 

我希望在加载外接写道:Quarterly Sales ReportA1。但是,我得到以下错误:

ReferenceError: Excel is not defined at loadDataAndCreateChart 

有人知道什么是错?初始化Office并使用angular.bootstrap可以吗?

回答

0

您需要确保调用像

Excel.run(function (ctx) { 
     var sheet = ctx.workbook.worksheets.getActiveWorksheet(); 
     sheet.getRange("A1").values = "Quarterly Sales Report"; 
     return ctx.sync() 
    }); 

办公室的初始化完成之后执行。

我创建了一个小应用程序,可以从上面运行您的代码。实际上运行这个只有三个文件。

  1. 的manifest.xml
  2. 的index.html
  3. app.js

请确保您在下面的替换文件的话PathToYourLocalFile与您的实际本地路径。

的manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<OfficeApp xsi:type="TaskPaneApp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/office/appforoffice/1.0"> 
    <Id>6ed5a5d8-57e4-4739-9a38-cff59f23e266</Id> 
    <Version>1.0.0.0</Version> 
    <ProviderName>Test Provider</ProviderName> 
    <DefaultLocale>en-US</DefaultLocale> 
    <DisplayName DefaultValue="Test" /> 
    <Description DefaultValue="Angular Test" /> 
    <Capabilities> 
     <Capability Name="Workbook" /> 
    </Capabilities> 
    <DefaultSettings> 
     <SourceLocation DefaultValue="PathToYourLocalFile/index.html" /> 
    </DefaultSettings> 
    <Permissions>ReadWriteDocument</Permissions> 
</OfficeApp> 

的index.html

<!DOCTYPE html> 
<html lang="en" ng-app="AngularTest" ng-controller="MainController"> 
<head> 
    <meta charset="utf-8"> 
    <title>Angular Test</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js" type="text/javascript"></script> 
</head> 
<body> 
    <div ng-view></div> 
    <!-- Load Js Libaries --> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"> 
    </script> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"> 
    </script> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-resource.min.js"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.min.js"></script> 

    <script src="PathToYourLocalFile/app.js"></script> 
    </body> 
    </html> 

app.js

'use strict'; 
angular.module('AngularTest', []) 
    .controller('MainController', [ 
     function() { 
      Office.initialize = function() { 
       $(document).ready(function() { 
        loadDataAndCreateChart(); 
       }); 
      }; 

      function loadDataAndCreateChart() { 
       Excel.run(function (ctx) { 
        var sheet = ctx.workbook.worksheets.getActiveWorksheet(); 
        sheet.getRange("A1").values = "Quarterly Sales Report"; 
        return ctx.sync(); 
       }); 
      } 

     } 
    ]); 

你可以在看app.js文件在Office初始化完成后执行方法loadDataAndCreateChart。

在这里您可以找到的文档,你如何添加清单擅长: Office Dev Center

+0

我没有测试您的解决方案......我觉得把'返回Promise.resolve(空)'angular.bootstrap后' (文档,['app'])'在我的代码中,并注入'initoffice'到'TestCtrl'也将解决这个问题... – SoftTimur