Erstellen und Veröffentlichen von Excel 2010-Dokumenten mit benutzerdefinierten SharePoint 2010-Workflows

Zusammenfassung:  SharePoint Server 2010 stellt eine umfangreiche Plattform zum Erstellen von Branchenanwendungen bereit, die in Workflowprozesse integriert werden und Informationen auf Intranet-, Internet- und Extranetwebsites veröffentlichen. Mit Open XML-Dateiformaten ist das programmgesteuerte Generieren von Microsoft Office-Dokumenten, -Kalkulationstabellen und -Präsentationen möglich. Durch die Kombination der beiden Technologien können Sie häufige Geschäftsprozesse wie die Dokumentgenerierung und -veröffentlichung auf einfache Art automatisieren. Erfahren Sie mehr zum Generieren von Excel 2010-Kalkulationstabellen innerhalb von SharePoint-Workflows und zum Veröffentlichen dieser Kalkulationstabellen auf SharePoint-Websites.

Letzte Änderung: Donnerstag, 14. Februar 2013

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

Inhalt dieses Artikels
Übersicht
Erstellen von benutzerdefinierten SharePoint-Workflows mit Visual Studio 2010
Hinzufügen der Unterstützung für Hilfsmethoden der Open XML 2.0-API zu Workflows
Bereitstellen von benutzerdefinierten Workflows in SharePoint 2010
Testen von benutzerdefinierten Workflows
Abschluss
Weitere Ressourcen
Informationen zum Autor

Bereitgestellt von:  Todd Baginski, Aptillon, SharePoint Server MVP | Informationen zum Autor

Inhalt

  • Übersicht

  • Erstellen von benutzerdefinierten SharePoint-Workflows mit Visual Studio 2010

  • Hinzufügen der Unterstützung für Hilfsmethoden der Open XML 2.0-API zu Workflows

  • Bereitstellen von benutzerdefinierten Workflows in SharePoint 2010

  • Testen von benutzerdefinierten Workflows

  • Abschluss

  • Weitere Ressourcen

  • Informationen zum Autor

Klicken Sie, um Code abzurufen. Code zum Herunterladen: Erstellen und Veröffentlichen von Excel 2010-Dokumenten mit benutzerdefinierten SharePoint 2010-Workflows (in englischer Sprache)

Übersicht

Dieser Artikel ist Teil einer Serie von Artikeln zur Integration von Clientanwendungen in Geschäftsprozesse und Workflows:

Open XML-Dateiformate

Microsoft Office 2010-Dokumente basieren auf dem Open XML-Standard (in englischer Sprache). Mit Open XML SDK 2.0 für Microsoft Office 2010 können Sie Office 2010-Dokumente programmgesteuert erstellen und aktualisieren.

SharePoint Server 2010-Workflows

Microsoft SharePoint Server 2010-Workflows basieren auf Windows Workflow Foundation. Sie können SharePoint-Workflows innerhalb von SharePoint-Websites mithilfe eines Webbrowsers, in Microsoft SharePoint Designer 2010 oder mit Microsoft Visual Studio 2010 erstellen. Microsoft Visual Studio 2010 ist zum Erstellen von Workflows erforderlich, die die Open XML-APIs verwenden. Zudem ist das Erstellen von benutzerdefinierten Workflowaktivitäten möglich, die die Open XML-APIs in Visual Studio verwenden. Diese können anschließend auf SharePoint-Servern veröffentlicht werden, sodass die Aktivitäten, die mithilfe von SharePoint Designer 2010 erstellt wurden, innerhalb von Workflows verwendet werden können. In diesem Artikel wird hauptsächlich das Erstellen von benutzerdefinierten Workflows mit Visual Studio 2010 erläutert.

SharePoint Foundation 2010

In Microsoft SharePoint Foundation 2010 wird eine erweiterbare Plattform bereitgestellt, die in SharePoint-Workflows integriert ist. Mithilfe dieser Integration können Sie Workflows Daten zuordnen, die in SharePoint-Listen und -Dokumentbibliotheken gespeichert sind. Elemente und Dokumente in SharePoint-Listen können von den Workflows erstellt, gelesen, aktualisiert und gelöscht werden. In diesem Artikel wird das Erstellen eines SharePoint-Workflow zum Lesen von Informationen aus SharePoint-Listenelementen erläutert, die Teil des Workflows sind. Mithilfe der Listenelementinformationen wird dann ein Excel-Dokument generiert.

Mit SharePoint 2010-Dokumentverwaltungsfunktionen können Sie Dokumente sicher speichern und verwalten. Nachdem das Excel-Dokument vom Workflow generiert wurde, wird das Dokument in einer SharePoint-Dokumentbibliothek veröffentlicht.

Beispielszenario: Generieren von Rechnungen

Stellen Sie sich ein Szenario vor, in dem ein Geschäft für Sportwaren, AdventureWorks Inc., die empfangenen Bestellungen in einer SharePoint-Liste im AdventureWorks-Intranet nachverfolgt. Nachdem die Bestellungen hinzugefügt wurden, werden Rechnungen für die Bestellungen generiert und an Kunden gesendet. Das Erstellen der Rechnungen geschieht manuell. Hierzu müssen Mitarbeiter ein Excel-Dokument zum Generieren von Rechnungen öffnen, dem Dokument die entsprechenden Daten hinzufügen und die Rechnung dann in einer Dokumentbibliothek auf einer SharePoint-Website speichern, auf die die Kunden zugreifen können.

Zur Automatisierung dieses Prozesses erstellt AdventureWorks, Inc. einen benutzerdefinierten Workflow zur automatischen Generierung von Rechnungen für Bestellungen, nachdem die Bestellungen in die SharePoint-Liste eingegeben wurden. Vom Workflow werden die Rechnungen dann auf der SharePoint-Website veröffentlicht, auf die die Kunden zugreifen können. Durch den Workflow wird die zum Generieren von Rechnungen benötigte Zeit deutlich verringert, und die Genauigkeit der Rechnungen wird verbessert, indem die Möglichkeit von Fehlern eliminiert wird, die in Verbindung mit der manuellen Generierung durch die Mitarbeiter auftreten können.

Beispielumgebung

Das Szenario beruht auf den folgenden Elementen, die in diesem Abschnitt erläutert werden. Bevor Sie den Vorgang fortsetzen, richten Sie eine Beispielumgebung wie folgt ein:

  • Liste der Bestellungen. Der in diesem Artikel erstellte SharePoint-Workflow wird in einer SharePoint-Liste mit Namen Orders veröffentlicht. Die Orders-Liste basiert auf einer benutzerdefinierten Liste. Der Beispielcode für diesen Artikel enthält die Listenvorlage, die zum erneuten Erstellen der Orders-Liste erforderlich ist. Die Orders-Liste enthält die in der folgenden Abbildung gezeigten Spalten.

    Abbildung 1. Spalten in der Liste 'Orders'

    Spalten in der Liste 'Orders'

  • Intranetwebsite. Die Orders-Liste befindet sich im AdventureWorks-Intranet (http://intranet/Lists/Orders). Die Intranetwebsitesammlung basiert auf der Veröffentlichungsportal-Websitevorlage.

  • Datei "SalesInvoiceTemplate.xlsx". Vom Workflow wird das Excel-Dokument mit der Datei Namens SalesInvoiceTemplate.xlsx zum Erstellen von Verkaufsrechnungen verwendet. Die Datei SalesInvoiceTemplate.xlsx ist in der Bibliothek Shared Documents im AdventureWorks-Intranet gespeichert (http://intranet/Shared Documents/SalesInvoiceTemplate.xlsx).

    Abbildung 2. 'SalesInvoiceTemplate.xlsx'

    SalesInvoiceTemplate.xlsx

  • Extranetwebsite. Die generierten Verkaufsrechnungen werden vom Workflow auf der AdventureWorks-Extranetkundenwebsite veröffentlicht und in einer Dokumentbibliothek mit dem Namen Invoices (http://extranet/Invoices) gespeichert. Die Extranetwebsitesammlung basiert auf der Veröffentlichungsportal-Websitevorlage.

Erstellen von benutzerdefinierten SharePoint-Workflows mit Visual Studio 2010

Microsoft Visual Studio 2010 stellt zwei Vorlagen zum Erstellen von benutzerdefinierten SharePoint-Workflows bereit: Sequenzieller Workflow und Zustandsautomatworkflow. In diesem Artikel wird die Projektvorlage Sequenzieller Workflow verwendet.

Verwenden von Visual Studio-Vorlagen für Workflows

Zunächst müssen Sie benutzerdefinierte SharePoint-Workflows zum Generieren von Excel-Dokumenten als Verkaufsrechnungen erstellen und diese auf der Extranetwebsite veröffentlichen.

So erstellen Sie benutzerdefinierte SharePoint-Workflows

  1. Öffnen Sie Visual Studio 2010.

  2. Klicken Sie auf Datei, wählen Sie Neu aus, und klicken Sie dann auf Projekt.

  3. Erweitern Sie im Abschnitt Installierte Vorlagen die Option Visual C#, erweitern Sie SharePoint, und wählen Sie dann 2010 aus.

  4. Wählen Sie auf der rechten Seite des Abschnitts Installierte Vorlagen die Option Sequentieller Workflow aus.

  5. Geben Sie im Feld Name den gewünschten Namen für den Workflow ein. In diesem Beispiel hat das Projekt den Namen SharePoint.Workflow.ExcelGenerator.

  6. Wählen Sie in der Liste .NET Framework-Version oben in Neues Projekt die Option .NET Framework 3.5 aus.

  7. Klicken Sie auf OK. Der Assistent zum Anpassen von SharePoint wird geöffnet.

    Abbildung 3. Erstellen eines sequenziellen SharePoint-Workflows im Dialogfeld 'Neues Projekt'

    Dialogfeld zum Erstellen eines neuen Projekts

  8. Geben Sie im Feld Welche lokale Site soll für das Debugging verwendet werden? die URL zur Intranetwebsite ein, auf der der Workflow bereitgestellt werden soll. In diesem Beispiel handelt es sich um folgende URL: http://intranet. Klicken Sie auf Weiter.

  9. Geben Sie im Feld Wie lautet der Name des Workflows? den Namen für den Workflow ein. In diesem Beispiel hat der Workflow den Namen Sales Invoice Generation.

  10. Wählen Sie Listenworkflow aus, und klicken Sie auf Weiter.

  11. Aktivieren Sie das Kontrollkästchen Ja, diesen Workflow den folgenden Bibliotheken und Listen zuordnen.

  12. Wählen Sie in der Liste Die Bibliothek oder Liste, der der Workflow zugeordnet werden soll die Liste Orders aus. Falls die Liste der Bestellungen nicht in der Liste angezeigt wird, lesen Sie die Informationen im Abschnitt "Beispielszenario: Generieren von Rechnungen", um sicherzustellen, dass die Umgebung ordnungsgemäß eingerichtet ist und die Orders-Liste enthält. Klicken Sie auf Weiter.

  13. Aktivieren Sie das Kontrollkästchen Benutzer startet den Workflow manuell.

  14. Deaktivieren Sie die anderen Kontrollkästchen, und klicken Sie auf Fertig stellen.

Visual Studio 2010 fügt automatisch den folgenden Code der Klasse Worfkflow1.cs hinzu. Mit dem folgenden Codebeispiel wird eine Guid erstellt, mit der der Workflow eindeutig identifiziert wird.

public Guid workflowId = default(System.Guid);

Im folgenden Codebeispiel wird eine Instanz der SPWorkflowActivationProperties-Klasse erstellt. Diese Klasse ruft Details zum Kontext der aktuell ausgeführten Workflowinstanz ab. Die workflowProperties-Klasseninstanz ruft die URL der Websitesammlung ab, in der der Workflow ausgeführt wird, sowie Details zum Orders-Listenelement, für das der Workflow ausgeführt wird.

public SPWorkflowActivationProperties workflowProperties = new SPWorkflowActivationProperties();

Hinzufügen von Verweisen zu den Open XML 2.0-APIs

Wenn Sie die Open XML 2.0-API verwenden möchten, fügen Sie dem Projekt und der Klasse Workflow1.cs die folgenden Verweise und using-Anweisungen hinzu.

So fügen Sie den Open XML 2.0-APIs einen Verweis hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Knoten Verweise, und klicken Sie auf Verweis hinzufügen.

  2. Klicken Sie auf Durchsuchen.

  3. Wechseln Sie zum folgenden Speichort: C:\Windows\assembly\GAC_MSIL\DocumentFormat.OpenXml\2.0.5022.0__31bf3856ad364e35\DocumentFormat.OpenXml.dll.

  4. Wählen Sie DocumentFormat.OpenXml.dll aus, und klicken Sie dann auf OK.

  5. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Knoten Verweise, und klicken Sie auf Verweis hinzufügen.

  6. Klicken Sie auf .NET.

  7. Wählen Sie WindowsBase aus.

  8. Klicken Sie auf OK.

  9. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei Workflow1.cs, und wählen Sie Code anzeigen aus.

  10. Fügen Sie der Klasse Workflow1.cs die folgenden using-Anweisungen hinzu, um die Unterstützung für die Open XML 2.0-API hinzuzufügen.

       using DocumentFormat.OpenXml.Packaging;
       using DocumentFormat.OpenXml.Spreadsheet;
       using DocumentFormat.OpenXml;
    
  11. Fügen Sie die folgende using-Anweisung hinzu, um das Öffnen der Datei SalesInvoiceTemplate.xlsx mithilfe eines Streams zu ermöglichen.

       using System.IO;
    
  12. Fügen Sie die folgende using-Anweisung hinzu, um die Hilfsmethoden der Open XML 2.0-API zu unterstützen, die im Workflow verwendet werden.

       using System.Collections.Generic;
    

Definieren der im Workflow verwendeten Konstanten

Konstanten sind im Workflow definiert, um anzugeben, wo die Datei SalesInvoiceTemplate.xlsx gespeichert ist und wo die generierten Excel-Dokumente für die Verkaufsrechnungen veröffentlicht werden sollen.

Fügen Sie zum Definieren der Konstanten im Workflow die folgenden Codezeilen der Datei Workflow1.cs hinzu:

readonly string[] excelDocumentHeaderColumns = new[] { "A", "B", "C" };
const string sourceDocumentPath = "http://intranet/shared documents/SalesInvoiceTemplate.xlsx";
const string destinationSitePath = "http://extranet";
const string destinationDocumentLibraryName = "Destination Document Library";

Mit dem folgenden Codebeispiel wird ein Zeichenfolgenarray erstellt, das die Namen der Spalten in der Datei SalesInvoiceTemplate.xlsx enthält. Mit diesen Spaltennamen werden Wert in die Kalkulationstabelle eingefügt, indem die Open XML 2.0-API verwendet wird.

readonly string[] excelDocumentHeaderColumns = new[] { "A", "B", "C" };

Mit dem folgenden Codebeispiel werden Konstanten erstellt, die darstellen, wo die Datei SalesInvoiceTemplate.xlsx gespeichert werden soll, und die die Website und Dokumentbibliothek angeben, in der die generierten Excel-Dokumente für die Verkaufsrechnungen veröffentlicht werden sollen.

const string sourceDocumentPath = "http://intranet/shared documents/SalesInvoiceTemplate.xlsx";
const string destinationSitePath = "http://extranet";
const string destinationDocumentLibraryName = "Destination Document Library";

Hinzufügen einer Codeaktivität zum Workflow

Dem Workflow wird eine Codeaktivität hinzugefügt, um den benutzerdefinierten Code auszuführen, der zum Generieren des Excel-Dokuments für die Verkaufsrechnung erforderlich ist, und um dieses Dokument auf der Extranetwebsite zu veröffentlichen.

So fügen Sie eine Codeaktivität hinzu

  1. Klicken Sie in Visual Studio 2010 auf die Registerkarte Toolbox, um das Fenster Toolbox zu öffnen.

  2. Ziehen Sie eine Codeaktivität aus der Toolbox, und legen Sie sie auf der Entwurfsoberfläche für die Datei Workflow1.cs ab. Legen Sie die Codeaktivität auf dem Pfeil unter der Aktivität onWorkflowActivated1 in der Entwurfsoberfläche ab.

  3. Wählen Sie in der Entwurfsoberfläche die Aktivität codeActivity1 aus.

  4. Konfigurieren Sie im Fenster Eigenschaften die Name-Eigenschaft der Codeaktivität, um anzugeben, dass die Aktivität Excel-Dokumente generiert und veröffentlicht. In diesen Beispiel trägt die Codeaktivität den Namen createAndPublishExcelDocument.

  5. Klicken Sie im Fenster Eigenschaften auf die Verknüpfung Handler generieren. Dadurch wird der Ereignishandler createAndPublishExcelDocument_ExecuteCode(object sender, EventArgs e) in der Datei Workflow1.cs generiert.

Erstellen und Veröffentlichen von Excel-Dokumenten in SharePoint-Workflows

Wenn Sie die Codeaktivität erstellen möchten, die die Datei SalesInvoiceTemplate.xlsx zum Generieren von Vorlagen für Verkaufsrechnungen und zum Veröffentlichen dieser Vorlagen auf der Extranetwebsite verwenden, fügen Sie dem Ereignishandler createAndPublishExcelDocument_ExecuteCode in der Klasse Workflow1.cs den folgenden Code hinzu.

SPListItem listItem = workflowProperties.Item;
            
using (SPSite sourceSite = new SPSite(workflowProperties.SiteUrl))
{
   SPFile sourceFile = sourceSite.RootWeb.GetFile(sourceDocumentPath);

   using (SPSite destinationSite = new SPSite(destinationSitePath))
   {
      using (SPWeb web = destinationSite.OpenWeb())
      {
         if (sourceFile != null)
         {
            SPFolder destinationDocumentLibrary = 
   web.Folders[destinationDocumentLibraryName];

            using (Stream sourceFileStream = 
   sourceFile.OpenBinaryStream())
            {
               using (SpreadsheetDocument spreadSheet = 
                  SpreadsheetDocument.Open(sourceFileStream, true))
               {
                  WorksheetPart worksheetPart = 
   ReturnWorksheetPart(spreadSheet, "Sheet1");
                  if (worksheetPart != null)
                  {
                     Worksheet worksheet = worksheetPart.Worksheet;
                     InsertTextCellValue(worksheet, "A", 3, 
      listItem["Customer"].ToString());
                     InsertTextCellValue(worksheet, "A", 4, 
listItem["Address"].ToString());
                     InsertTextCellValue(worksheet, "B", 3, 
"Invoice: " + listItem.Title);
                     InsertTextCellValue(worksheet, "B", 4, "Invoice 
Date: " + DateTime.Now.ToShortDateString());
                     InsertTextCellValue(worksheet, "A", 7, 
listItem["Description"].ToString());
                     InsertNumberCellValue(worksheet, "B", 7, 
listItem["Amount"].ToString());
                     InsertNumberCellValue(worksheet, "B", 9, 
listItem["Amount"].ToString());
                     double tax = 
                        ((double)listItem["Amount"] * .07);
   InsertNumberCellValue(worksheet, "B", 10, 
tax.ToString());
                     double total = ((double)listItem["Amount"] * 
1.07);
                     InsertNumberCellValue(worksheet, "B", 11, 
total.ToString());
   destinationDocumentLibrary.Files.Add("Invoice "
                   + listItem.Title + ".xlsx", 
                        sourceFileStream, true);
                  }
               }
            }
         }
      }
   }
}

Mit der Item-Eigenschaft in der workflowProperties-Klasse wird der Zugriff auf das aktuelle Element bereitgestellt, das vom Workflow verwendet wird. In diesem Szenario stellt das Element ein Listenelement in der Orders-Liste dar.

SPListItem listItem = workflowProperties.Item;

Mit der SiteUrl-Eigenschaft in der workflowProperties-Klasse wird der Zugriff auf die aktuelle Website bereitgestellt, auf der der Workflow ausgeführt wird. Von der SiteUrl-Eigenschaft wird ein SPSite-Objekt konstruiert, das der Websitesammlung entspricht, in der der Workflow ausgeführt wird.

SPSite sourceSite = new SPSite(workflowProperties.SiteUrl)

Vom folgenden Code wird ein SPFile-Objekt zurückgegeben, das der Datei SalesInvoiceTemplace.xlsx entspricht. Diese Datei dient als Vorlage für die Verkaufsrechnung.

SPFile sourceFile = sourceSite.RootWeb.GetFile(sourceDocumentPath);

Vom folgenden Code wird ein SPSite-Objekt erstellt, das der Websitesammlung entspricht, in der die generierte Verkaufsrechnung veröffentlicht werden soll.

SPSite destinationSite = new SPSite(destinationSitePath)

Vom folgenden Code wird ein SPFolder-Objekt erstellt, das der Dokumentbibliothek entspricht, in der die generierte Verkaufsrechnung veröffentlicht werden soll.

SPFolder destinationDocumentLibrary = web.Folders[destinationDocumentLibraryName];

Vom folgenden Code wird ein Stream-Objekt erstellt, das der Vorlagendatei für die Verkaufsrechnung entspricht. Von der OpenBinaryStream-Methode wird die Datei SalesInvoiceTemplate.xlsx als Stream zurückgegeben.

Stream sourceFileStream = sourceFile.OpenBinaryStream()

Vom folgenden Code wird ein SpreadSheetDocument-Objekt erstellt, das der Vorlagendatei für die Verkaufsrechnung entspricht. Von der Open-Methode wird die Datei SalesInvoiceTemplate.xlsx geladen. Die SpreadSheetDocument-Klasse ist Teil der Open XML 2.0-API.

SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(sourceFileStream, true)

Vom folgenden Code wird ein WorksheetPart-Objekt erstellt, das dem Arbeitsblatt Sheet1 in der Vorlagendatei für die Verkaufsrechnung entspricht.

WorksheetPart worksheetPart = ReturnWorksheetPart(spreadSheet, "Sheet1");

Vom folgenden Code wird ein Worksheet-Objekt erstellt, das dem Arbeitsblatt Sheet1 in der Vorlagendatei für die Verkaufsrechnung entspricht. Die Worksheet-Eigenschaft verwendet die Open XML 2.0-API, um das WorkSheet-Objekt zurückzugeben, das dann die Werte im Arbeitsblatt aktualisiert.

Worksheet worksheet = worksheetPart.Worksheet;

Mit dem folgenden Code werden Werte in das Arbeitsblatt an den entsprechenden Speicherorten eingefügt. Der listitem["<Column Name>"]-Code ruft die Spaltenwerte für das Orders-Listenelement ab, das zurzeit vom Workflow verwendet wird. Die InsertTextCellValue-Methode und die InsertNumberCellValue-Methode verwenden die Open XML 2.0-API, um die Spaltenwerte in das Arbeitsblatt einzufügen. Diese Methoden verwenden das worksheet-Objekt, die Spalte im Arbeitsblatt und die Zeile im Arbeitsblatt, um die zu aktualisierenden Zellen zu finden.

InsertTextCellValue(worksheet, "A", 3, 
listItem["Customer"].ToString());
InsertTextCellValue(worksheet, "A", 4, 
listItem["Address"].ToString());
InsertTextCellValue(worksheet, "B", 3, "Invoice: " + listItem.Title);
InsertTextCellValue(worksheet, "B", 4, "Invoice 
Date: " + DateTime.Now.ToShortDateString());
InsertTextCellValue(worksheet, "A", 7, 
listItem["Description"].ToString());
InsertNumberCellValue(worksheet, "B", 7, listItem["Amount"].ToString());
InsertNumberCellValue(worksheet, "B", 9, 
listItem["Amount"].ToString());
double tax = ((double)listItem["Amount"] * .07);
InsertNumberCellValue(worksheet, "B", 10, tax.ToString());
double total = ((double)listItem["Amount"] * 1.07);
InsertNumberCellValue(worksheet, "B", 11, total.ToString());
HinweisHinweis

Im Codebeispiel erfolgt die Berechnung von Steuern und Summen in dem Code, der das Excel-Dokument programmgesteuert generiert. Die Berechnungen werden im Workflow berechnet, da die Open XML 2.0-API das Ausführen von Zellformeln, die im Excel-Dokument definiert sind, nicht unterstützt. In Fällen, in denen die Berechnungen in Zellformeln definiert werden müssen, können Sie das Dokument in Excel Services veröffentlichen. Excel Services unterstützt das programmgesteuerte Durchführen von Berechnungen in Excel-Dokumenten. Dann kann der Workflow die im Excel-Dokument definierten Formeln programmgesteuert aufrufen, um die Berechnungen durchzuführen.

Im folgenden Code wird die Add-Methode in der Files-Auflistung verwendet, die der Dokumentbibliothek auf der Extranetwebsite zugeordnet ist, auf der die Verkaufsrechnung veröffentlicht werden soll, um die generierte Verkaufsrechnung der Dokumentbibliothek hinzuzufügen. Die Title-Eigenschaft des listItem-Objekts benennt die generierte Verkaufsrechnung. Mit dem sourceFileStream-Objekt, das die generierte Verkaufsrechnung besitzt, wird das zu speichernde Dokument angegeben, und mit dem booleschen Parameter true wird angegeben, dass die Datei überschrieben werden soll, falls sie bereits vorhanden ist.

destinationDocumentLibrary.Files.Add("Invoice " + listItem.Title + ".xlsx", sourceFileStream, true);

Dieser Ansatz zeigt das Laden der Datei SalesInvoiceTemplate.xlsx in einen Stream, das Ändern und anschließende direkte Speichern in der Zieldokumentbibliothek. Es ist keine Zwischenspeicherung des Dokuments erforderlich. Nachdem das Dokument in der Zieldokumentbibliothek gespeichert wurde, wird das dem generierten Dokument zugeordnete Stream-Objekt automatisch verworfen, da der Code mit using-Anweisungen implementiert wurde.

Hinzufügen der Unterstützung für Hilfsmethoden der Open XML 2.0-API zu Workflows

Fügen Sie zum Beenden des Workflows der Klasse Workflow1.cs die folgenden Hilfsmethoden hinzu.

Die ReturnWorksheetPart-Methode verwendet die Open XML 2.0-API, um ein WorkSheetPart-Objekt zurückzugeben, wobei ein SpreadSheetDocument und der Name eines Arbeitsblatts angegeben wird.

private static WorksheetPart ReturnWorksheetPart(SpreadsheetDocument document, string sheetName)
{
IEnumerable<Sheet> sheets = 
   document.WorkbookPart.Workbook.GetFirstChild<Sheets>().
   Elements<Sheet>().Where(s => s.Name == sheetName);

   if (sheets.Count() == 0)
            {
                return null;
            }

            string id = sheets.First().Id.Value;
            WorksheetPart worksheetPart = 
   (WorksheetPart)document.WorkbookPart.GetPartById(id);

return worksheetPart;
}

Von der InsertTextCellValue-Methode wird die Open XML 2.0-API zum Einfügen eines Textwerts in eine Zelle im Arbeitsblatt verwendet. Der worksheet-Parameter gibt das Arbeitsblatt zum Einfügen der Zelle an, mit dem column-Parameter und dem row-Parameter wird die im Arbeitsblatt zu aktualisierende Zelle gefunden. Mit dieser Methode wird die DataType-Eigenschaft in der Cell-Klasse auf den CellValues.String-Enumerationswert festgelegt, um die Zelle als Zeichenfolge zu formatieren.

private void InsertTextCellValue(Worksheet worksheet, string column, uint row, string value)
{
Cell cell = ReturnCell(worksheet, column, row);
CellValue v = new CellValue();
v.Text = value;
cell.AppendChild(v);
cell.DataType = new EnumValue<CellValues>(CellValues.String);
worksheet.Save();
}

Von der InsertNumberCellValue-Methode wird die Open XML 2.0-API zum Einfügen einer Zahl in eine Zelle im Arbeitsblatt verwendet. Der worksheet-Parameter gibt das Arbeitsblatt zum Einfügen der Zelle an, mit dem column-Parameter und dem row-Parameter wird die im Arbeitsblatt zu aktualisierende Zelle gefunden. Mit dieser Methode wird die DataType-Eigenschaft in der Cell-Klasse auf den CellValues.Number-Enumerationswert festgelegt, um die Zelle als Zahl zu formatieren.

private void InsertNumberCellValue(Worksheet worksheet, string column, uint row, string value)
{
Cell cell = ReturnCell(worksheet, column, row);
CellValue v = new CellValue();
      v.Text = value;
      cell.AppendChild(v);
      cell.DataType = new EnumValue<CellValues>(CellValues.Number);
      worksheet.Save();
}

Von der ReturnCell-Methode wird die Open XML 2.0-API zum Zurückgeben einer bestimmten Zelle im Arbeitsblatt verwendet. Sie wird von der InsertTextCellValue-Methode und der InsertNumberCellValue-Methode aufgerufen. Der worksheet-Parameter gibt das Gebietsschema des Arbeitsblatts an, in dem sich die Zelle befindet, und mit dem columnname-Parameter und dem row-Parameter wird die im Arbeitsblatt zu aktualisierende Zelle gefunden.

private static Cell ReturnCell(Worksheet worksheet, string columnName, uint row)
{
Row targetRow = ReturnRow(worksheet, row);

if (targetRow == null)
return null;

return targetRow.Elements<Cell>().Where(c => 
   string.Compare(c.CellReference.Value, columnName + row, 
   true) == 0).First();
}

Von der ReturnRow-Methode wird die Open XML 2.0-API zum Zurückgeben einer bestimmten Zeile im Arbeitsblatt verwendet. Sie wird von der ReturnCell-Methode aufgerufen. Mit dem worksheet-Parameter wird das Gebietsschema des Arbeitsblatts angegeben, in dem sich die Zeile befindet, und mit dem row-Parameter wird die Zeile gefunden.

private static Row ReturnRow(Worksheet worksheet, uint row)
{
return worksheet.GetFirstChild<SheetData>().
Elements<Row>().Where(r => r.RowIndex == row).First();
}

Bereitstellen von benutzerdefinierten Workflows in SharePoint 2010

Mit Visual Studio 2010 können Sie den benutzerdefinierten Workflow auf einer SharePoint 2010-Website für Tests bereitstellen. Zum Bereitstellen des benutzerdefinierten Workflows aus Visual Studio 2010 klicken Sie auf Erstellen, und wählen Sie dann Projektmappe bereitstellen aus. Wenn Sie den benutzerdefinierten Workflow auf einem Produktionsserver bereitstellen möchten, laden Sie den WSP in den Lösungskatalog in der Zentraladministration hoch. Aktivieren Sie dann das zugeordnete Feature.

Testen von benutzerdefinierten Workflows

So testen Sie den benutzerdefinierten Workflow

  1. Öffnen Sie die Orders-Liste auf der Intranetwebsite, und erstellen Sie ein Element in der Liste.

    Abbildung 4. Beispielelement in der Liste 'Orders'

    Beispielelement

  2. Wählen Sie das neue Element in der Orders-Liste aus.

  3. Klicken Sie auf dem Menüband auf Workflows.

  4. Klicken Sie im Abschnitt Neuen Workflow starten auf den Namen des Workflows. In diesem Beispiel handelt es sich um folgenden Namen: Sales Invoice Generation.

    Abbildung 5. Auswählen des zu startenden Workflows

    Auswählen eines Workflows

  5. Nachdem der Workflow beendet ist, wird dies vom Listenelement in der Orders-Liste angezeigt. Die Spalte Sales Invoice Generation in der Orders-Liste zeigt den Status Beendet für den Workflow an.

    Abbildung 6. Beendeter Workflow

    Workflow abgeschlossen

  6. Öffnen Sie auf der Extranetwebsite die Dokumentbibliothek Invoices. Beachten Sie, dass sich das generierte Excel-Dokument für die Verkaufsrechnung in der Dokumentbibliothek befindet.

  7. Öffnen Sie das generierte Excel-Dokument für die Verkaufsrechnung. Beachten Sie, dass die Werte aus dem Listenelement in der Orders-Liste in die entsprechenden Speicherorte im Excel-Dokument eingefügt wurden.

    Abbildung 7. Generiertes Excel-Dokument für die Verkaufsrechnung

    Verkaufsrechnung

Abschluss

In diesem Artikel wird beschrieben, wie SharePoint Server 2010 eine umfangreiche Plattform zum Erstellen von Branchenanwendungen bereitstellt, die Daten in SharePoint-Listen einschließen. Zudem wird die Verwendung von benutzerdefinierten SharePoint-Workflows zum Generieren von Excel-Dokumenten mithilfe der Open XML 2.0-API und zum Veröffentlichen der Dokumente in Extranetwebsites gezeigt.

Weitere Ressourcen

Die folgenden Ressourcen stehen in Verbindung mit den in diesem Artikel erläuterten Themen. Sie erhalten weitere Informationen zu SharePoint-Workflows, Open XML und SharePoint Foundation.

Informationen zum Autor

MVP-Mitwirkender  Todd Baginski, SharePoint Server MVP, hat Intranets, Extranets, öffentliche Internetwebsites und zahlreiche benutzerdefinierte Anwendungen mit den Plattformen Microsoft Windows SharePoint Services und SharePoint Server entworfen und implementiert. Während der Betaphasen des Produkts hat er im Jahr 2003 mit seiner Arbeit begonnen. Er hält häufig Vorträge zu SharePoint auf zahlreichen branchenführenden Konferenzen einschließlich TechEd, SharePoint Connections und der Microsoft SharePoint Conference. Als Autor von Inhalt zum SharePoint Master Certification-Programm trägt Todd Baginski den Teil der Schulung vor, der sich mit dem Geschäftsdatenkatalog befasst.