Exportieren (0) Drucken
Alle erweitern
Erweitern Minimieren

Entwickeln für SharePoint 2010 Excel Services mithilfe von Web Services oder der Excel Services-REST-API

SharePoint 2010

Zusammenfassung: Hier finden Sie Informationen zu den neuen Clientdienstfeatures in Microsoft SharePoint Server 2010, darunter Word-Automatisierungsdienste und Excel Services.

Letzte Änderung: Montag, 22. August 2011

Gilt für: Business Connectivity Services | Office 2007 | Office 2010 | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio | Word Autmomation Services

Inhalt dieses Artikels
Übersicht über Microsoft Office 2010-Serveranwendungen
Verwenden von Excel Services
Schlussbemerkung
Weitere Ressourcen

Bereitgestellt von: John Peltonen, 3Sharp

Inhalt

Klicken Sie, um Code abzurufen.  Download: Excel Services-Beispiel für Microsoft SharePoint Server 2010 ("xlrestform.zip")  

Benutzer verbringen mehr und mehr Zeit in der Microsoft SharePoint Server-Umgebung, und das aus gutem Grund. Nachdem die Funktionalität dieser Umgebung ständig ausgeweitet wird und inzwischen Features wie umfassende Funktionen für soziale Netzwerke, Aufgaben- und Kalenderverwaltung, Workflows und Formulare (sowohl ohne als auch mit Code) umfasst, entwickelt sich SharePoint Server 2010 von einem reinen Datenrepository immer mehr zu einem Ziel. Natürlich ist SharePoint Server immer ein hervorragendes Tool zum Speichern und Verwalten von Dokumenten gewesen, die in den Microsoft Office-Clientanwendungen erstellt wurden. SharePoint Server 2010 erweitert jedoch die Bandbreite der Möglichkeiten, diese Dokumente direkt auf dem Server zu verwenden.

Microsoft Word, Microsoft Excel, Microsoft OneNote, Microsoft Visio, Microsoft PowerPoint, Microsoft Access, MicrosoftProject und natürlich Microsoft InfoPath bieten alle eine erweiterte Funktionalität auf dem Server. Word, Excel, OneNote und PowerPoint sind mit zugehörigen Webanwendungen ausgestattet, über die die Benutzer Dokumente direkt in SharePoint Server ohne Client öffnen und bearbeiten können. Zudem unterstützt jede dieser Anwendungen ein Szenario für die gemeinsame Erstellung von Dokumenten, in dem mehrere Benutzer gleichzeitig an einem Dokument arbeiten können.

Visio Services ermöglicht es Benutzern, in SharePoint 2010 gehostete Visio-Diagramme innerhalb eines Browsers anzusehen. Wenn Microsoft Silverlight installiert ist, kann der Benutzer über interaktives Click-Through Diagramme verschieben und zoomen sowie Hyperlinks folgen. Ist Silverlight nicht installiert, wird das Diagramm im PNG-Format gerendert. Darüber hinaus können diese Diagramme datengesteuert sein, sodass sich eine sehr komplexe Anzeige ähnlich einem Dashboard ergibt. Dieses Feature wird direkt in SharePoint 2010 für die Erstellung von grafischen Berichten über den Microsoft SharePoint Designer-Workflowstatus verwendet.

Access ist seit jeher eine leistungsstarke Plattform für Desktopanwendungen. Im Jahr 2010 ist Access nun eine Plattform für die Entwicklung von serverseitigen Anwendungen, da Sie nun Access-Datenbanken als SharePoint-Websites veröffentlichen können. Daten, Formulare, Grafiken, Berichte und sogar einfache Logik lassen sich auf der Website veröffentlichen. Ausgehend hiervon können die Benutzer auf die gleichen Daten und Funktionen zugreifen, entweder über einen Access-Client oder über einen Browser. Dadurch können die Probleme beseitigt werden, die mit unterschiedlichen MDB-Formatversionen auf Desktops und in E-Mails einhergehen, da jede MDB-Datei die in SharePoint Server gehosteten Daten und Logikbausteine referenziert. Und nicht zuletzt kann der Benutzer Erscheinungsbild und Verhalten der veröffentlichten Website direkt über den Access-Client steuern, ohne die IT-Abteilung einbeziehen zu müssen.

Diese Features sind jedoch nicht Hauptgegenstand dieses Artikels. Vielmehr geht es hier um sehr spezifische, meist programmgesteuerte Aspekte von Excel Services. Excel Services ist in SharePoint Server 2010 mit sehr leistungsstarken Ergänzungen ausgestattet worden, darunter zwei neue Programmiermodelle, das ECMAScript-Objektmodell (JScript, JavaScript) und die Excel Services-REST-APIs. Ein weiteres neues Feature ist Word Automation Services, das die Automatisierung von Word auf dem Server ohne die Word-Clientanwendung erlaubt.

Informationen zum Entwickeln mithilfe von Word Automation Services finden Sie unter Entwickeln mit SharePoint 2010-Word Automation Services

Von den einzelnen Office-Anwendungen aus betrachtet bietet Excel Services durch sein Angebot an Diensten bei weitem das umfassendste und vielfältigste Funktionsspektrum. Beim Entwickeln von Lösungen können Sie aus drei Objektmodellen auswählen (diese werden alle in diesem Artikel behandelt). Zudem wurde das Excel Web Access-Webpart wesentlich verbessert und ermöglicht jetzt eine umfassendere Interaktion mit einer ganzen Arbeitsmappe oder mit einem benannten Objekt. Und Sie können mit der aktuellen Version benutzerdefinierte, serverseitige Funktionen schreiben, die aus einer auf dem Server gehosteten Arbeitsmappe aufgerufen werden können. Diese Features werden alle in den nachfolgenden Abschnitten beschrieben.

Excel Web Access-Webpart

Das Excel Web Access-Webpart wurde in Microsoft Office SharePoint Server 2007 eingeführt. Sein Zweck bestand darin, Excel-Arbeitsblätter mit hoher Wiedergabetreue zu rendern. Das Webpart konnte auf ein in SharePoint Server gehostetes Arbeitsblatt verwiesen werden, das über Excel Services veröffentlicht worden war. Den Benutzern wurde auf dem Arbeitsblatt eine fixierte Darstellung der Zielinhalte präsentiert.

Mit Excel Services in SharePoint Server 2010 wurde die grundlegende Funktionalität von SharePoint Server 2007 erweitert, um den Benutzern eine komfortable Interaktion mit der gehosteten Arbeitsmappe zu ermöglichen. Zunächst einmal werden im Excel Web Access-Webpart mehr grundlegende Excel-Clientfeatures unterstützt. Das Webpart unterstützt jetzt Bildläufe. In SharePoint Server 2007 konnten die Benutzer eine feste Rastergröße auswählen, die im Webpart verfügbar gemacht wurde, aber nicht zu anderen Bereichen navigieren. Wenn Sie jetzt statt eines benannten Objekts die gesamte Arbeitsmappe veröffentlichen, steht die Arbeitsmappe den Benutzern vollständig zur Verfügung. Sie können innerhalb eines Arbeitsblatts einen Bildlauf durchführen oder sogar zu anderen Arbeitsblättern navigieren.

Abbildung 2 zeigt ein Beispiel für ein Excel Web Access-Webpart.

Abbildung 2. Beispiel für ein Excel Web Access-Webpart

Beispiel für einen Excel Web Access-Webpart

Wie Sie in Abbildung 2 wahrscheinlich bemerkt haben, werden auch Grafiken unterstützt. Außerdem können die Benutzer direkt mit den Werten im Arbeitsblatt interagieren und dadurch Neuberechnungen der Arbeitsmappe automatisch auslösen. Beispielsweise kann ein Benutzer die Werte in der monatlichen Projekttabelle in Abbildung 2 ändern, um zu beobachten, wie diese Änderungen sich auf das Diagramm auswirken würden (überwiegend rechts außerhalb des Bildschirms). Auch die Performance wurde erhöht, da in dem Webpart zur Neuberechnung der Arbeitsmappe keine Seitenaktualisierung mehr erforderlich ist. Wie in SharePoint Server 2007 bietet das Excel Web Access-Webpart eine schreibgeschützte Version des Arbeitsblatts, wobei Änderungen nur mit der Sitzung des Benutzers gespeichert werden.

Nicht unterstützte Clientfeatures

Wenn das Excel Web Access-Webpart in SharePoint Server 2007 etwaige nicht unterstützte Features erkannte, wurde die Arbeitsmappe nicht geladen. Dies gab Anlass für Frustrationen, z. B. wenn ein Zellkommentar auf Sheet3 verhinderte, dass ein Benutzer über Excel Web Access eine PivotTable auf Sheet1 veröffentlichen konnte. Das Excel Services-Team hat in diesem Bereich große Fortschritte erzielt, indem es die Typen von nicht unterstützten Funktionen klassifiziert hat. Jetzt werden Zellkommentare, VBA-Code (Microsoft Visual Basic for Applications) und Microsoft Office-Grafiken (einschließlich SmartArt) beim Öffnen der Arbeitsmappe ignoriert. Darüber hinaus werden QueryTable-Objekte und externe Arbeitsmappenverweise ignoriert, wobei jedoch die zuletzt von der Clientanwendung gerenderten Werte angezeigt werden. Außerdem gibt es noch eine Reihe von nicht unterstützten Clientfunktionen. In der SharePoint Server 2007-Liste unter Unterschiede zwischen der Verwendung einer Arbeitsmappe in Excel und der Verwendung in Excel Services werden diese nicht unterstützten Funktionen beschrieben (ausgenommen die weiter oben bereits erwähnten).

Die meisten neuen Features von Microsoft Excel 2010 werden in gewissem Umfang im Excel Web Access-Webpart unterstützt. Diese Liste aus dem Excel Services-Teamblog enthält viele der neuen Microsoft Excel 2010-Clientfeatures und eine Angabe zum Umfang der Unterstützung durch Excel Web Access:

Die Originalliste finden Sie im Microsoft Excel-Teamblog.

Weitere Informationen zu Excel Web Access finden Sie in den folgenden Artikeln im Microsoft Excel-Teamblog:

Neue Features in Excel Web Services

Viele der programmatischen Features von Excel Services, z. B. die REST-API und das ECMAScript (JavaScript, JScript)-Objektmodell, sind in der aktuellen Version von Microsoft SharePoint Server neu. Allerdings gibt es die Excel Services-Webdienste schon seit Microsoft Office SharePoint Server 2007. In SharePoint Server 2007 konnten die Benutzer ein Arbeitsblatt öffnen und dann Änderungen vornehmen, Daten neu berechnen und bestimmte Werte aus dem Arbeitsblatt auslesen. Es war jedoch nicht möglich, Änderungen zu speichern (alle Änderungen waren an die Sitzung gebunden und daher vorübergehender Natur). Außerdem konnten keine Diagramme geladen werden. Diese Punkte stellen jedoch die zwei am häufigsten angeforderten Features der Excel Services-Webdienste dar. Jetzt sind diese Features und andere in SharePoint Server 2010 verfügbar.

Tabelle 1 enthält die neuen Methoden, die mit der aktuellen Version eingeführt werden, und stammt fast direkt aus dem Blog eines leitenden Excel Services-Entwicklers, Shahar Prish.

Tabelle 1. Liste der neuen Methoden

Methode

Beschreibung

GetChartImageUrl

Generiert ein Abbild basierend auf dem angegebenen Diagramm und stellt es zum Download über eine temporäre URL bereit.

GetPublishedItemNames

Gibt die Namen der Elemente in der Arbeitsmappe zurück, die implizit oder explizit veröffentlicht wurden. Hilfreich zum Untersuchen der Struktur einer Arbeitsmappe.

GetSheetNames

Gibt die Namen und die Sichtbarkeit der Arbeitsblätter in der Arbeitsmappe zurück.

OpenWorkbookForEditing

Ermöglicht der API, an einer Bearbeitungssitzung teilzunehmen.

SaveWorkbook

Erzwingt eine Speicherung der Arbeitsmappe im Bearbeitungsmodus.

SaveWorkbookCopy

Funktioniert im Bearbeitungs- und im Ansichtsmodus; speichert eine Kopie der Arbeitsmappe in SharePoint Server.

SetCalculationOptions

Ermöglicht Ihnen, die Berechnung in der Arbeitsmappe zu ändern, und zwar durch Aus- oder Einschalten der automatischen Berechnung.

SetParameters

Dient zum Festlegen von Parametern für die Arbeitsmappe. Dies ist besonders nützlich, wenn Sie Seitenfilter definieren möchten, die als Parameter angegeben wurden, und wenn Sie mehrere Zellen auf einmal festlegen möchten.

In dem Beispiel in Abbildung 3 wird die GetChartImageURL-Methode und die OpenWorkbookForEditing-Methode verwendet. Die Beispielanwendung startet an keinem Punkt einen expliziten Save-Befehl (SaveWorkbook). Ist die Arbeitsmappe für die Bearbeitung geöffnet, werden Änderungen direkt in das Arbeitsblatt geschrieben, sodass eine Speicherung nicht notwendig ist. Wenn die Arbeitsmappe für die Bearbeitung geöffnet ist, werden die Anmeldeinformationen der Anwendung in Excel als Mitautor angezeigt. Das bedeutet, wenn andere Personen dieses Dokument ebenfalls gerade bearbeiten, sehen sie, dass es von dieser Anwendung bearbeitet wird, und sie sehen die in Echtzeit gespeicherten Änderungen durch die Anwendung.

Die Anwendung fordert eine bestimmte Arbeitsmappe an, in der der Fließbandausstoß basierend auf Änderungen der Fließbandgeschwindigkeit geschätzt wird. Es handelt sich um eine einfache Windows Forms-Anwendung, die das Arbeitsblatt im schreibgeschützten oder mit Lese-/Schreibzugriff lädt, die Änderung des Modifizierers ermöglicht und das daraus resultierende Diagramm mit dem geschätzten Ausstoß anzeigt.

Abbildung 3. Excel Web Services-Beispielanwendung

Beispiel für eine Excel Web Services-Anwendung

Als Erstes müssen Sie einen Webverweis auf den Excel Services-Webdienst erstellen. Dazu klicken Sie in Microsoft Visual Studio im Projektmappen-Explorer mit der rechten Maustaste auf Dienstverweis und wählen dann Dienstverweis hinzufügen aus.

Dadurch wird das Fenster Dienstverweis geöffnet. Sie können dieses Fenster nicht verwenden, da der Excel Services-Dienst nicht auf Windows Communication Foundation (WCF) basiert. Klicken Sie stattdessen auf Erweitert, um das Fenster Dienstverweiseinstellungen zu öffnen. Klicken Sie dann auf Webverweis hinzufügen, um das Fenster Webverweis hinzufügen zu laden (siehe Abbildung 4).

An dieser Stelle können Sie die Excel Services-URL eingeben:

http://server name/_vti_bin/ExcelService.asmx?wsdl

Wahrscheinlich möchten Sie dem Verweis auch einen Anzeigenamen geben. Ich habe ihn XLSvc genannt, wie in Abbildung 4 gezeigt.

Abbildung 4. Erstellen des XLSvc-Webverweises

Erstellen des XLSvc-Webverweises

Im Folgenden sehen Sie die using-Anweisungen, die Sie hinzufügen müssen. Beide dienen zum Laden eines Abbilds von einer URL, wie es von GetChartImageURL bereitgestellt wird. Ich habe zuerst versucht, es direkt im PictureBox-Steuerelement zu laden (PictureBox.Load(url)), aber keine Möglichkeit gefunden, meine Anmeldeinformationen mit der internen URL-Anforderung durch das Steuerelement weiterzugeben. Deshalb musste ich etwas Anderes ausprobieren. Das Ergebnis sehen Sie in der GetImageFromURL-Hilfsfunktion im folgenden Beispiel.

// For WebRequest to retrieve the Chart URL.
using System.Net;

// For streams (when converting the image on the end of the URL to an "Image").
using System.IO;

Verwenden Sie die folgenden globalen Variablen, um die Excel Services-Sitzung und – natürlich – den Webdienst selbst zu verfolgen.

// Track the current session.
string sessionId = string.Empty;

// Excel Services reference.
XLSvc.ExcelService cli;

Öffnen Sie die Arbeitsmappe schreibgeschützt.

private void OpenWrite_Click(object sender, EventArgs e)
{
   XLSvc.Status[] status;

   // Close the open workbook.
   if (sessionId != string.Empty) 
   cli.CloseWorkbook(sessionId); 

   // Clear out the session ID.
   sessionId = string.Empty;
            
   // Open the workbook.
   sessionId = cli.OpenWorkbookForEditing(txtURL.Text, "", "", out status);

   // Initialize the form's fields.
   initFields();
}

Initialisieren Sie die Formularfelder.

private void initFields()
{
   XLSvc.Status[] status;

   // Exit function if no workbook is open.
   if (sessionId == string.Empty) return;

   // Just like in the 2007 release, retrieve the range as an array of arrays.
   object[] rows = cli.GetRangeA1(sessionId, "", "Modifier", true, out status);
   foreach (var o in rows)
   {
      // This is a single cell, so we break after the first row.
      object[] row = (object[])o;
      txtModifierValue.Text = row[0].ToString();
      break;
   }

   // Refactored this out because it is also used by "refresh".
   LoadChart("Chart 2");
}

Laden Sie schließlich das Diagramm.

private void LoadChart(string chartName)
 {
    XLSvc.Status[] status;
   if (sessionId == string.Empty) return;

   // This call will return a URL.  At the other end of the URL is our image.
   string url = cli.GetChartImageUrl(sessionId, null, chartName, out status);

   // Unfortunately, we cannot just call picturebox.Load because credentials will not be passed.
   pictChart.Image = GetImageFromURL(url);
}

private Image GetImageFromURL(string url)
{
   WebRequest r = WebRequest.Create(url);
   r.Credentials = System.Net.CredentialCache.DefaultCredentials;
   WebResponse response = r.GetResponse();
   Stream s = response.GetResponseStream();
   Image img = Image.FromStream(s);
   return img;
}

Wenn Sie das Codebeispiel herunterladen (Excel Services-Beispiel für SharePoint Server 2010), sehen Sie, dass die Funktion zum schreibgeschützten Öffnen einer Datei und die Funktion zum Öffnen mit Schreib-/Lesezugriff fast identisch sind. Der einzige Unterschied besteht darin, dass OpenWorkbook aufgerufen wird und nicht OpenWorkbookForEditing.

Laden Sie den Rest des Codes und des Arbeitsblatts herunter, um diese Funktionen auszuprobieren (siehe Excel Services-Beispiel für SharePoint Server 2010). Die einzige noch übrige Funktion ist das Festlegen des Werts des benannten Modifier-Bereichs und das erneute Laden des Diagramms.

cli.SetCellA1(sessionId, "", "Modifier", (object)txtModifierValue.Text);
LoadChart("Chart 2");

Dieser Code ist genau der gleiche, unabhängig davon, ob die Arbeitsmappe für die Bearbeitung geöffnet wurde. Der einzige Unterschied besteht darin, dass im standardmäßigen schreibgeschützten Modus die Modifikation in einer vorübergehenden, an die Sitzung gebundenen Kopie der Arbeitsmappe durchgeführt wird, während die Änderung im Bearbeitungsmodus in die Hauptkopie in SharePoint Server zurückgeschrieben wird.

Wie Sie sehen, wurden die Funktionen für Webdienste ziemlich erweitert, sodass noch anspruchsvollere Szenarien unterstützt werden. Weitere Informationen zu diesem Feature finden Sie in drei aktuellen Blogbeiträgen von Shahar Prish:

Lesen Sie außerdem Excel Web Services im SharePoint 2010 SDK.

Benutzerdefinierte Funktionen

Gelegentlich müssen Excel-Benutzer Funktionen verwenden, die keine systemeigenen Excel-Funktionen sind. Die Excel-Clientanwendung war über viele Versionen hinweg in dieser Hinsicht erweiterbar. Dadurch konnten Entwickler ein XLL-Add-In zur Anzeige von benutzerdefinierten Funktionen im Excel-Client erstellen. In SharePoint Server 2007 bot Excel Services auch Unterstützung für serverseitige benutzerdefinierte Funktionen. Diese Unterstützung besteht in SharePoint Server 2010 weiterhin. Mithilfe von verwaltetem Code können Sie eine serverseitige benutzerdefinierte Funktion zur Verfügbarmachung von benutzerdefinierten Funktionen erstellen, die die Benutzer genauso wie integrierte Funktionen verwenden können, beispielsweise =SUM() oder RAND().

Diese Funktionen sind nur auf dem Server verfügbar, sodass Arbeitsmappen, die im Client bearbeitet werden, keinen Zugriff auf sie haben. Sie können über SharePoint-Lösungen bereitgestellt werden und überaus leistungsfähig in der Hinsicht sein, dass sie auf Datenquellen und Webdienste von Drittanbietern zugreifen können.

Eine exemplarische Vorgehensweise zum Erstellen und Bereitstellen einer benutzerdefinierten Funktion finden Sie unter Benutzerdefinierte Funktionen in Excel Services im SharePoint 2010 SDK.

Das ECMAScript-Objektmodell (JScript, JavaScript)

Das JavaScript-Objektmodell ist ein weiteres neues Feature von Excel Web Services für SharePoint Server 2010. Es ermöglicht Entwickler die programmgesteuerte Interaktion mit den Excel Web Services-Webparts, die auf einer bestimmten SharePoint-Seite gehostet werden. Durch Schreiben von JavaScript-Code, der auf der SharePoint-Seite gehostet wird (entweder direkt oder über ein Inhalts-Editor-Webpart) können Entwickler mit den Excel Web Access-Webparts interagieren und die Interaktion der Benutzer mit den Webparts überwachen.

Mithilfe des JavaScript-Objektmodells können Sie Werte von Zellen festlegen und abrufen, entweder über adressierte oder über benannte Bereiche, und Benutzer zu unterschiedlichen Speicherorten innerhalb der gehosteten Arbeitsmappe navigieren. Außerdem können Sie damit Ereignisse überwachen, die auftreten, wenn Benutzer Inhalte zu Zellen hinzufügen oder Zellen bearbeiten.

Im folgenden Beispiel werden Sie durch eine JavaScript-Datei geführt, in der für eine Zelle (Sheet1!B3) der Wert der Zelle festgelegt wird, die der Benutzer ausgewählt hat.

Zunächst müssen Sie einige allgemeine Wartungsaufgaben in Excel Web Access ausführen. Insbesondere müssen Sie einen Verweis auf die Excel Web Access-Webparts auf der Seite abrufen. Natürlich muss zuerst die Seite geladen und die Webparts müssen initialisiert werden. Sie erfassen also das OnLoad-Ereignis, initialisieren es und warten auf das Excel Web Access-applicationReady-Ereignis. Wenn Sie feststellen, dass Excel Web Access bereit ist, listen Sie die Steuerelemente-Auflistung für alle Steuerelementinstanzen auf. Im diesem Fall finden Sie nur die erste Instanz.

<script>
    var ewa = null;

    // Set page event handlers for onload and unload.
    if (window.attachEvent) {
        window.attachEvent("onload", ewaOmPageLoad);
    }
    else {
        window.addEventListener("DOMContentLoaded", Page_Load, false);
    }
 
    // Load map.
    function ewaOmPageLoad() {
        if (typeof (Ewa) != "undefined") {
            Ewa.EwaControl.add_applicationReady(ewaApplicationReady);
        }
        else {

            // Error - the Excel Services Web Access ECMAScript is not loaded.
        }
    }

Jetzt können Sie die verschiedenen Excel Web Access-Webparts auf der Seite erfassen. Sie können auch Ereignishandler für beliebige Ereignisse festlegen, die Sie für dieses spezielle Steuerelement beobachten möchten. In diesem Fall beobachten Sie das activeCellChanged-Ereignis.

function ewaApplicationReady() {
        
        // Find the first Excel Web Access control on the page.
        ewa = Ewa.EwaControl.getInstances().getItem(0);

        // Add a cell changed event handler to the script.
        ewa.add_activeCellChanged(cellChanged);

    }

Wenn sich die Zelle ändert, müssen Sie zuerst ihre Koordinaten ermitteln (Arbeitsblatt, Zeile und Zelle). Dies erweist sich als nützlich, wenn Sie herausfinden wollen, ob der Benutzer wichtige Daten ausgewählt hat, auf die eine Reaktion erfolgen muss, oder nur zufällige Zellen, die keine Rolle spielen. In diesem Fall nehmen Sie den Wert einer beliebigen vom Benutzer ausgewählten Zelle und fügen ihn in Sheet1!A3 ein. Bei diesem Code wird davon ausgegangen, dass der Benutzer nur einen einzigen Wert ausgewählt hat. Natürlich könnte der Benutzer auch einen Bereich auswählen.

Wenn Sie alle Details haben (Koordinaten und Bereich), erstellen Sie einen Aufruf an die Arbeitsmappe, mit dem der Wert des Zielbereichs asynchron festgelegt wird. Das getRangeA1Async-Ereignis erwartet den Zielbereich, die Rückruffunktion und den Wert, den Sie in den Bereich einfügen möchten. Wird der Rückruf ausgeführt, wird eine asyncResult-Variable übergeben, die den Zielbereich und den Wert enthält. Das bedeutet, Sie können diese Funktion viele Male aufrufen, ohne sich darum kümmern zu müssen, was wohin übergeben wird.

    function cellChanged(rangeArgs) {

        // Find the sheet, column, and row the range starts in.
        var sheetName = rangeArgs.getRange().getSheet().getName();
        var col = rangeArgs.getRange().getColumn();
        var row = rangeArgs.getRange().getRow();
        
        // Making the assumption that this is a single cell, but it does not have to be.
        var value = rangeArgs.getFormattedValues();

        // Async call to set ranges.  We pass the range, the call-back function, and the value we want to set.
        ewa.getActiveWorkbook().getRangeA1Async("Sheet1!B3", getRangeComplete, value);
    }

Im Folgenden sehen Sie den asynchronen Rückruf. Sie beziehen einfach den Bereich und den Wert aus asyncResult und konvertieren den Wert in ein Array (Sie erinnern sich, ich gehe davon aus, dass der Benutzer nur eine einzige Zelle auswählt und keinen Zellbereich).

function getRangeComplete(asyncResult) {
    
        // Find the range we are going to set.
        var range = asyncResult.getReturnValue();

        // Find the value we will put in the range.
        var value = asyncResult.getUserContext();

        // Assuming it is a single item (convert to a double array).
        var values = [[value]];

        // Set the value (again, asynchronously).
        range.setValuesAsync(values, setValuesCallBack, null);
    }

Zuletzt erfassen Sie den Rückruf des Aufrufs der festgelegten Werte. Dies kann sich als praktisch erweisen, wenn Sie Aktionen miteinander verketten.

function setValuesCallBack(returnValues) {
        // Nothing really interesting here. Just notifying the user that something happened.
        window.status = 'Values Set';
    } 
</script>

Das war vielleicht eine gute Darstellung der Vorgehensweise, aber es fehlen noch einige Hinweise, damit Sie beginnen können. Zuerst müssen Sie festlegen, wie das Skript in die SharePoint-Seite eingefügt werden soll. Eine Möglichkeit ist folgende: Speichern Sie das Skript in eine HTML-Datei (nachdem Sie es in Microsoft Visual Studio bearbeitet haben), laden Sie es in eine Dokumentbibliothek hoch (meine sehr kreative Auswahl Freigegebene Dokumente überrascht Sie sicher nicht), fügen Sie der Seite ein Inhalts-Editor-Webpart hinzu und verweisen Sie dieses auf die HTML-Datei in Freigegebene Dokumente, wie in Abbildung 5 gezeigt. Sie können das Skript auch direkt in das Inhalts-Editor-Webpart platzieren.

Abbildung 5. Eigenschaften des Inhalts-Editor-Webparts

Inhalts-Editor-Webparteigenschaften

Denken Sie auch daran, dass Windows Internet Explorer jetzt ein hervorragendes Entwicklertool enthält, das Sie zum Debuggen von JavaScript auf der Seite nutzen können, außerdem zum Hinzufügen von Überwachungen und Setzen von Haltepunkten (siehe Abbildung 6). Zum Laden des Tools drücken Sie in Internet Explorer F12, oder wählen Sie im Menü Extras den Befehl Entwicklertools.

Abbildung 6. Der Skriptdebugger der Entwicklertools

Entwicklertools – Skriptdebugger

Obwohl dieser Code mithilfe des Inhalts-Editor-Webparts hinzugefügt wurde, wird er als Teil der Seite ausgeführt. Hier sehen Sie, dass der Benutzer die Zelle in Sheet1, Zeile 8, Spalte 3 ausgewählt hat.

Die REST-API

Die SOAP-basierten Excel-Webdienste bieten sehr leistungsstarke Funktionen zum programmgesteuerten Interagieren mit Excel-Arbeitsblättern. Allerdings bieten sie erfahrenen Benutzer keinerlei Möglichkeit, Excel-Objekte zu verwenden. Es wäre beispielsweise nützlich, wenn ein Benutzer ein Diagramm in einen internen Blogbeitrag oder Wiki einbetten und diese Webseite jedes Mal, wenn sie geladen oder aktualisiert wird, automatisch aktualisieren lassen könnte. Noch besser wäre es, wenn dieser erfahrene Benutzer Arbeitsblattparameter aktualisieren könnte, wenn er auf dieses Diagramm verweist, um ein spezielles Was-wäre-wenn-Szenario generieren und direkt in einem Word-Dokument hosten zu lassen – wo es immer dann aktualisiert wird, wenn das Dokument geöffnet oder gespeichert wird.

Aus der Sicht des Entwicklers lässt sich argumentieren, dass die Excel Services-REST-API keine echte REST-Implementierung sei. Ungeachtet der tatsächlichen Konformität mit dem Protokoll ist sie jedoch eine leistungsfähige Implementierung einer API, die Entwicklern und erfahrenen Benutzern Zugriff auf die Objekte in einer Arbeitsmappe allein über eine URL gibt.

Beispielsweise gibt die folgende URL alle ermittelbaren Komponenten der Arbeitsmappe Book1.xlsx zurück, die in der Bibliothek Freigegebene Dokumente in der Website auf oberster Ebene unter http://intranet.contoso.com gespeichert ist.

http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model $format=atom

Diese URL sieht zwar recht mächtig aus, doch wenn Sie sie in ihre Einzelteile aufgliedern, ist sie ganz einfach.

Tabelle 2. Komponenten der URL

URL-Komponente

Beschreibung

http://intranet.contoso.com

Der Pfad zu der Website oder Unterwebsite, auf der sich die Arbeitsmappe befindet.

/_vti_bin/excelrest.aspx

Der relative Pfad zum Webdienst.

/shared%20documents/book1.xlsx

Der relative Pfad zur Arbeitsmappe.

/model$format=atom

Der Befehl bzw. die Befehle für den Webdienst. In diesem Fall wird ein Modell ("model") der Arbeitsmappe in einem ATOM-Feed angefordert.

Sie können nicht nur die Elemente in einer Arbeitsmappe auflisten, sondern mithilfe des REST-Diensts Rohdaten oder -abbilder von Tabellen und Diagrammen abrufen. Außerdem können Sie mit den Daten in einer Arbeitsmappe interagieren, indem Sie z. B. Werte für bestimmte Bereiche festlegen, die sich auf die Tabellen und Diagramme auswirken, die Sie laden. Tabelle 3 ist eine Aufstellung aller Befehle, die Sie an den REST-Dienst senden können, jeweils mit dem zulässigen Format.

Tabelle 3. Liste der Befehle

Befehl

Atom

Arbeitsmappe

Abbild

HTML

Aktion

/model

Standard

Ja

Gibt alle ermittelbaren Elemente in der Arbeitsmappe oder die Arbeitsmappe selbst zurück.

/model/Charts

Standard

Standard

Listet alle Diagramme auf.

/model/Charts('name')

Ja

Gibt das angegebene Diagramm zurück.

/model/Ranges

Standard

Listet alle benannten Bereiche auf.

/model/Ranges('name')

Ja

Standard

Gibt den angegebenen Bereich zurück. Dies kann ein benannter Bereich oder ein beliebiger Bereich sein.

/model/Tables

Standard

Listet alle Tabellen auf.

/model/Tables('name')

Ja

Standard

Gibt die angegebene Tabelle zurück.

/model/PivotTables

Standard

Listet alle PivotTables auf.

/model/PivotTables('name')

Ja

Standard

Gibt die angegebene PivotTable zurück.

Da der Doppelpunkt (":") in einer URL ein Sonderzeichen ist, sind die normalen Bereichsdeklarationen ungültig, wie etwa Sheet2!A1:B3. Die Excel-REST-API erwartet einen senkrechten Strich (Pipe-Zeichen, "|") anstelle des Doppelpunkts, wie in "Sheet2!A1|B3"

Festlegen von Werten

Sie können zwar mit der REST-API nicht die gespeicherte Instanz des Arbeitsblatts auf dem Server ändern, aber Sie können Bereiche in der speicherinternen Instanz ändern, die von der Abfrage verwendet wird. Beispielsweise können Sie den Wert eines Bereichs festlegen, der ein bestimmtes Diagramm ändert, für das Sie eine Abfrage durchführen. In der folgenden URL wird der Wert eines Bereichs festgelegt und ein Abbild eines Diagramms angefordert.

http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model/Charts('sales')?Ranges('SalesYear')=2009?$format=image

Dieser Inhalt kann in jeder Umgebung gehostet werden, in der Text oder Bilder aus einer Webquelle angezeigt werden können. Abgesehen von den naheliegenden Blogs und Wikis ist Microsoft Word im Zusammenhang mit diesem Artikel eine durchaus relevante Quelle.

Auch wenn Sie nicht wissen, was ein Microsoft Word-Feldcode ist, haben Sie bereits einen verwendet, nämlich beim Einfügen eines Inhaltsverzeichnisses oder eines Hyperlinks in ein Dokument. Ein Feldcode ist eine Möglichkeit der Darstellung beliebig vieler dynamischer Inhaltstypen im Dokumenthauptteil. Eine vollständige Liste der Feldcodes können Sie abrufen, indem Sie auf dem Menüband auf der Registerkarte Einfügen auf Schnellbausteine und dann auf Feld klicken, wie in Abbildung 7 gezeigt.

Abbildung 7. Abrufen der vollständigen Liste der Feldcodes

Zugreifen auf die gesamte Liste der Feldcodes

Mit zwei speziellen Feldcodes, IncludePicture und IncludeText können Sie Text oder Bilder aus einer Datei oder von einer URL einbetten. Word hält diesen Inhalt durch regelmäßige Aktualisierung stets auf dem neuesten Stand (bei Öffnen, Speichern usw.).

So fügen Sie ein aktuelles Abbild eines Diagramms in eine Arbeitsmappe ein

  1. Erstellen Sie die REST-URL wie im folgenden Beispiel:

    http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model/Charts('Chart%205')?$format=image

  2. Klicken Sie im Menü Einfügen auf Schnellbausteine und dann auf Feld.

  3. Wählen Sie das IncludePicture-Feld aus, fügen Sie die URL im Feld Dateiname oder URL ein, und klicken Sie auf OK (siehe Abbildung 8).

    Abbildung 8. Hinzufügen des IncludePicture-Felds

    Hinzufügen des Felds 'IncludePicture'

Das Einfügen von Text geschieht ähnlich, ist aber etwas komplizierter, weil die Daten nicht die Rohdaten sind, die Sie wahrscheinlich benötigen. Sie sind entweder ein ATOM-Feed oder als HTML formatiert. Beides sind keine guten Optionen für ein Word-Dokument. Glücklicherweise können Sie mit diesem Feldcode entweder eine XSL-Transformation oder eine XPath-Abfrage als Teil des Feldcodes einschließen. Wenn Sie entweder eine XSLT-Transformation oder eine XPath-Abfrage schreiben um den ATOM-Feed abzufragen, können Sie die relevanten Daten auswählen und in das Dokument einschließen.

Dieser Beispiel-ATOM-Feed stellt die Ergebnisse der folgenden Abfrage dar.

http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model/Ranges('Sheet1!F1')?$format=atom
<?xml version="1.0" encoding="utf-8"?>
<entry xml:base="http://excel.live.com/REST" xmlns:x="http://schemas.microsoft.com/office/2008/07/excelservices/rest" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservice" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
    <title type="text">Sheet1!F1</title>
    <id>http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model/Ranges('Sheet1!F1')</id>
    <updated>2009-12-12T22:23:39Z</updated>
    <author>
        <name />
    </author>
    <link rel="self" href="http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model/Ranges('Sheet1!F1')?$format=atom" title="Sheet1!F1" />
    <category term="ExcelServices.Range" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <content type="application/xml">
        <x:range name="Sheet1!F1">
            <x:row>
                <x:c>
                    <x:v>0.05</x:v>
                    <x:fv>5%</x:fv>
                </x:c>
            </x:row>
        </x:range>
    </content>
</entry>

Zusätzlich zur Filename or URL-Eigenschaft des InsertText-Felds müssen Sie zwei Feldoptionen aktualisieren:

  • Namespacezuordnungen

    In dem XML-Code, den Sie abfragen, werden zwei Namespaces verwendet: der ATOM-Feed-Namespace und der Excel Services-REST-Namespace. Mit der folgenden Zeichenfolge werden diese definiert sowie Namespacezuordnungen erstellt, die die XPath-Abfrage referenziert.

    xmlns:a="http://www.w3.org/2005/Atom"

    xmlns:x="http://schemas.microsoft.com/office/2008/07/excelservices/rest"

  • XPath

    Der XPath ist glücklicherweise relativ einfach. Das <fv>-Element enthält den formatierten Wert der Zelle. Dieser wird mit dem folgenden XPath abgerufen.

    /a:entry/a:content/x:range/x:row/x:c/x:fv

    Abbildung 9. Hinzufügen des InsertText-Felds

    Hinzufügen des Felds 'InsertText'

Sicher würden diese Vorgehensweise normalerweise nur die erfahrensten Benutzer anwenden, doch ist das Hinzufügen des InsertText-Felds eine sehr leistungsfähige Methode, wenn Sie einmal ein Szenario mit serverseitiger Erstellung von Dokumenten mit Office Open XML-Formaten (wo Sie diese Feldcodes programmgesteuert manipulieren können) betrachten oder ein clientseitiges Add-In mit Microsoft Office-Entwicklungstools in Microsoft Visual Studio, wo Sie den Feldcode während der Ausführung der Anwendung programmgesteuert hinzufügen.

Natürlich können Sie die ATOM-Feeds auch programmgesteuert ansprechen und manipulieren. Das folgende Codebeispiel ist ein Teil der Beispielanwendung, die Sie herunterladen können (Excel Services-Beispiel für SharePoint Server 2010). Die Beispielanwendung fragt ein Arbeitsblatt ab, das sich auf einer Website der obersten Ebene befindet, listet seine benannten Bereiche auf und zeigt dann den Wert eines ausgewählten Bereichs an.

Abbildung 10. Beispielanwendung zum Auflisten von benannten Bereichen in einem Arbeitsblatt

Beispielanwendung zum Auflisten von benannten Bereichen im Blatt

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

// Need this to process the ATOM Feed.
using System.Xml.Linq;

// Specifically for the XMLUrlResolver to pass credentials to the Web service.
using System.Xml;

// There are streams ahead.
using System.IO;    

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        // Declare all my namespaces up top so that I can just reference a short variable name down below :)
        const string atomNameSpace = "http://www.w3.org/2005/Atom";
        const string xlsvcNameSpace = "http://schemas.microsoft.com/office/2008/07/excelservices/rest";



        private void button1_Click(object sender, EventArgs e)
        {

            // As long as we have a server name and relative path to the worksheet, call the Web service.
            if(txtSite.Text != string.Empty & txtSpreadsheet.Text != string.Empty)
                LoadRanges();
        }
private void LoadRanges()
        {
            string relativeUri;
            XNamespace a = atomNameSpace;
            Stream s;

            // Build the relative URL for the Excel REST Web service.
            relativeUri = "/_vti_bin/ExcelRest.aspx/" + txtSpreadsheet.Text + "/model/Ranges?$format=atom";

            // Pass the server portion of the URL and the relative URL down
            // and receive a stream with the ATOM feed results.
            s = GetAtomResultsStream(txtSite.Text, relativeUri);

            // Load the stream into an XDocument.
            XDocument atomResults = XDocument.Load(s);

            // Query the XDocument for all title elements that are child elements of an entry element.
            IEnumerable<XElement> ranges =//= atomResults.Root.Descendants(a + "title")
                from t in atomResults.Descendants(a + "title")
                where t.Parent.Name == a+"entry"
                select t;
                

            // Add all the elements that we found to the listbox.
            foreach (XElement r in ranges)
            {
                listBox1.Items.Add((string)r);
            }
                     
        }

            private Stream GetAtomResultsStream(string serverName, string relativeUri)
            {
                
                XNamespace a = atomNameSpace;

                // I use the XMLUrlResolver to pass credentials to the Web service.
                XmlUrlResolver resolver = new XmlUrlResolver();
                resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;

                // Build the URI to pass the resolver.
                Uri baseUri = new Uri("http://" + serverName);
                Uri fullUri = resolver.ResolveUri(baseUri, relativeUri);

                // Mostly for debugging, display where we are going.
                lblUrl.Text = fullUri.ToString();

                // Call the resolver and receive the ATOM feed as a result.
                Stream s = (Stream)resolver.GetEntity(fullUri,null,typeof(Stream));

                return s;
            }

    }
}

Der Excel-REST-Webdienst ist auf trügerische Weise leistungsstark. Er deckt ein breites Spektrum an Benutzeranforderungen und Lösungsszenarien ab –vom einfachen Einbetten einer URL in eine Webseite, die die aktuellen Daten anzeigt, bis hin zu einer benutzerdefinierten Microsoft .NET Framework-Lösung.

Weitere Informationen zur Excel-REST-API finden Sie in den folgenden Ressourcen:

Dieser Artikel enthält eine ausführliche Darstellung einiger sehr leistungsstarker neuer Features der Clientdienste in Microsoft SharePoint Server 2010. Beim Entwerfen der Architektur Ihrer nächsten Anwendung haben Sie zahlreiche Optionen – die Möglichkeit, Word-Dokumente ohne den Word-Client programmgesteuert zu rendern, zu drucken und zu konvertieren, die Möglichkeit, Live-Excel-Diagramme auf einfache Weise in einer Webseite oder einem Dokument einzubetten und zahlreiche Methoden zur programmgesteuerten Manipulation von Excel-Arbeitsmappen. Probieren Sie sie einfach aus. Ich hoffe, die Lektüre dieses Beitrags hilft Ihnen bei der Entscheidung, welche Möglichkeit Sie nutzen.

Natürlich muss ein Feature nicht unabhängig vom anderen oder von anderen client- und serverseitigen Features verwendet werden. Sie können problemlos eine Dokumenterstellungslösung entwickeln, die Live-Excel-Diagramme programmgesteuert aus ihren ATOM-Feeds einfügt, das Dokument mithilfe von Word-Automatisierungsdienste rendert und es dann in eine PDF-Datei konvertiert. Klingt eigentlich spannend. Ich glaube, ich weiß schon, was mein nächstes Projekt ist.

Anzeigen:
© 2015 Microsoft