2017-07-07 9 views
1

ich ein Office-Add-in mit AngularJS und AngularJS-ui-Router machen wollen:Reference: Excel ist nicht definiert

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

Der Name des Moduls ist app, und der Router ist wie folgt:

.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) 
     }] 
    } 
}) 

Und der Controller:

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() 
}]) 

ich würde erwarten, dass das Add-in geladen schreibt Quarterly Sales Report bis A1. Allerdings habe ich folgenden Fehler:

ReferenceError: Excel is not defined at loadDataAndCreateChart 

Weiß jemand, was los ist? Ist es in Ordnung, Office zu initialisieren und so zu verwenden?

Antwort

0

Sie müssen sicherstellen, dass Anrufe wie

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

ausgeführt werden, nachdem die Initialisierung von Office durchgeführt wird.

Ich habe eine kleine Anwendung erstellt, die Ihren Code von oben ausführt. Um das auszuführen, gibt es nur drei Dateien.

  1. manifest.xml
  2. index.html

Stellen Sie sicher, app.js dass Sie in den folgenden Dateien das Wort PathToYourLocalFile mit Ihrem tatsächlichen lokalen Pfad ersetzen.

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(); 
       }); 
      } 

     } 
    ]); 

Sie in der sehen app.js-Datei, die die Methode loadDataAndCreateChart nach der Initialisierung von Office ausgeführt wird.

Hier können Sie die Dokumentation, wie Sie das Manifest hinzufügen können zu übertreffen: Office Dev Center

+0

ich Ihre Lösung nicht getestet ... Ich denke, setzen 'Rückkehr Promise.resolve (null)' 'nach angular.bootstrap (document, ['app']) '' in meinem Code, und inject 'initOffice' in' TestCtrl' wird das Problem auch beheben ... – SoftTimur

Verwandte Themen