Dieser Artikel wurde maschinell übersetzt.
Microsoft Office
Einbindung der Microsoft Windows Workflow Foundation in OpenXML SDK
Geschäftsprozesse, bei denen einen Workflow oft erforderlich, dass entsprechende Dokumente erstellt oder verarbeitet werden.Dies kann beispielsweise auftreten, wenn eine Anwendung (für ein Darlehen, Versicherung, Rücknahme von Aktien und So weiter) genehmigt oder abgelehnt, während der Workflow-Prozess wurde.Dies kann Gefahren werden durch ein Programm (automatisch) oder Underwriter (als manuelle Schritt).In diesem Fall könnte ein Brief geschrieben werden müssen, oder eine Kalkulationstabelle anzeigen Salden produziert.
In der Juni-Ausgabe 2008 des MSDN Magazins, ich zeigte, wie dies zu erreichen, mit die Objektmodellen von Microsoft Office-Anwendung (msdn.microsoft.com/magazine/cc534981).Diesen Artikel als Grundlage verwenden, dieses Mal zeige ich Ihnen wie Microsoft Office-kompatible Dokumente mit Windows Workflow Foundation (WF) integrieren, ohne direkt mit Office-Anwendungen zu interagieren.Dies geschieht mithilfe des OpenXML SDK 2.0 Textverarbeitungsprogramm bearbeiten und Tabellenkalkulation Dokumenttypen.Die entsprechenden Office-Anwendungen sind natürlich, Word und Excel.Während jeder dieser sein eigenes Modell des OpenXML-Dokument hat, gibt es genug Gemeinsamkeiten ermöglichen die Verwendung einer Reihe von Schnittstellenklassen,, die meisten Unterschiede bei der Workflow-Integration zu verstecken.
Da WF in Microsoft enthalten ist.NET Framework 4 Client Profile,.NET Framework 4 Installation wird die WF-Bibliothek enthalten.Und weil seine Verwendung in stark vereinfacht hat die.NET Framework 4 im Vergleich zu den.NET Framework 3.0 sollten jede Anwendung, die auch grundlegende Workflow-Funktionen erfordert, dies anstelle von benutzerdefinierten Code verwenden.Dies gilt auch in Fällen, in denen die integrierten Aktivitäten durch benutzerdefinierte Aktivitäten ergänzt werden.
Ich werde zeigen, wie eine benutzerdefinierte Aktivität basierend auf einem Office-Dokument, das als Prototyp dient Dateneingabe bereitstellen kann.Die Eingabeaktivität für Daten, wiederum übergibt Daten an Aktivitäten für jeden Dokumenttyp und die Aktivitäten verwenden diese Datenfelder für das Ziel Officedokumente ausfüllen.Ich habe Visual Studio 2010 Klassen zur Unterstützung von Operationen wie z. B. Auflisten von benannten Bereichen zu entwickeln, ihren Inhalt zu extrahieren und Ausfüllen von Dokumenten von Prototypen.Alle diese Klassen verwenden das OpenXML SDK statt direkt bearbeiten von Objektmodellen für Office-Anwendungen.Ich erstellte Workflow-Aktivitäten zur Dateneingabe und Ausfüllen der Textverarbeitung und Tabellenkalkulation-Dokumenttypen unterstützen.Fertige Dokumente werden durch den Aufruf einfach der Standard-Anwendungs für den Dokumenttyp angezeigt.Ich schrieb den Code mit Visual Basic.
Gesamtplanung
Jeder Entwurf für die Integration von Workflow und Office hat drei allgemeine Anforderungen: Abrufen von Daten in den Workflow; Verarbeitung der Daten zum Erstellen oder Aktualisieren von Office-Dokumenten; Speicherung oder Weitergabe der Ausgabedokumente.Um diese Anforderungen zu unterstützen, habe ich eine Reihe von Klassen, die einheitliche Schnittstellen zu den zugrunde liegenden Office-Dokument-Formate, die mit dem OpenXML SDK bereitstellen.Diese Klassen stellen Methoden zum:
- Die Namen der möglichen Zielfelder in den Dokumenten zu erhalten.Ich werde den generischen Begriff "Feld" verwenden, um diese zu beschreiben.Im Fall des Wortes sind diese Lesezeichen; Excel verwendet benannte Bereiche.Im allgemeinsten Fall Lesezeichen und benannten Bereichen können sehr komplex sein, aber ich verwende den einfachen Fall von einem einzigen Speicherort für Bookmarks und Einzelzellen für benannte Bereiche.Lesezeichen enthalten immer Text, während Tabelle Zellen Text, Zahlen oder Datumsangaben enthalten können.
- Füllen Sie Zielfelder in einem Dokument durch die Annahme von Eingabedaten und Abgleich der Daten mit dem Dokument.
Um Aktivitäten zu füllen, die Office-Dokumente implementieren, habe ich das WF 4 CodeActivity-Modell.Dieses Modell ist stark vereinfacht, über WF 3.0 und bietet eine viel klarere Implementierung.Beispielsweise ist es nicht mehr notwendig, Abhängigkeitseigenschaften explizit deklarieren.
Die Unterstützung der Stimmen
Hinter den Workflow steht eine Reihe von Klassen, die Funktionen des OpenXML SDK zu unterstützen.Die Klassen führen die zentralen Aufgaben der Laden des Prototyp-Dokuments in einen Speicherstream zu finden und füllen Sie die Felder (Lesezeichen oder benannte Bereiche) und speichern das resultierende Ausgabedokument.Häufig verwendete Funktionen sind in einer Basisklasse, einschließlich laden und Speichern des Arbeitsspeicherstreams zusammengestellt.Ich habe Fehlerprüfung hier aus Gründen der Übersichtlichkeit weggelassen, aber es ist im zugehörigen Codedownload enthalten.Abbildung 1 laden und Speichern von einem OpenXML-Dokument veranschaulicht.
Abbildung 1 Laden und Speichern von einem OpenXML-Dokument
Public Sub LoadDocumentToMemoryStream(ByVal documentPath As String)
Dim Bytes() As Byte = File.ReadAllBytes(documentPath)
DocumentStream = New MemoryStream()
DocumentStream.Write(Bytes, 0, Bytes.Length)
End Sub
Public Sub SaveDocument()
Dim Directory As String = Path.GetDirectoryName(Me.SaveAs)
Using OutputStream As New FileStream(Me.SaveAs, FileMode.Create)
DocumentStream.WriteTo(OutputStream)
OutputStream.Close()
DocumentStream.Close()
End Using
End Sub
Abrufen von Daten in den Workflow
Eine der ersten Herausforderungen, die ich bei der Integration von Office-Dokumenten in Workflows konfrontiert war, wie man Daten für die Felder in diesen Dokumenten bestimmt weiter. Die standard-Workflow-Struktur basiert auf Vorwissen mit den Namen der Variablen Aktivitäten zugeordnet. Variablen können mit unterschiedlichen Gültigkeitsbereichen Sicht in den Workflow und in andere Aktivitäten definiert werden. Ich beschloss, dass die Anwendung dieses Modells direkt zu starr, war es erforderlich, den gesamten Workflowentwurf zu eng an die Dokumentfelder binden. Bei der Office-Integration ist die Workflow-Aktivität als Proxy für ein Office-Dokument handeln. Es ist nicht realistisch, versuchen, bestimmen die Namen der Felder im Dokument, wie dies erforderlich wäre passender eine benutzerdefinierte Aktivität zu einem bestimmten Dokument.
Schaut man sich die Art und Weise, die an Aktivitäten Argumente übergeben werden, finden Sie, dass sie als ein Wörterbuch (von Zeichenfolge, Objekt) übergeben werden. Um Felder in einem Office-Dokument zu füllen, benötigen Sie zwei Stück von Informationen: der Name des Feldes und der einzufügende Wert. Ich habe Anwendungen mithilfe von Workflow-Produkte und Office vor entwickelt, und die allgemeine Strategie, die ich nahm gut funktioniert: Ich die benannten Felder im Dokument aufzuzählen und zur Eingabe der Parameter nach Namen übereinstimmen. Wenn die Dokumentfelder das Muster in der grundlegenden Eingabeparameter Dictionary (String, Object) entsprechen, können sie direkt in übergeben werden. Allerdings Paare dieser Ansatz den Workflow zu eng an das Dokument.
Anstatt naming Variablen mit Feldern im Dokument entsprechen beschloss ich, ein generisches Wörterbuch (von Zeichenfolge, Zeichenfolge), vermitteln diese Feldnamen verwenden. Ich nannte diesen Parameter Felder, und in jeder dieser Tätigkeiten verwendet. Jeder Eintrag in solch einem Wörterbuch ist vom Typ KeyValuePair (Of String, String). Der Schlüssel wird verwendet, um den Namen des Felds übereinstimmen; der Wert wird verwendet, um im Feldinhalt zu füllen. Diese Felder Wörterbuch ist dann einer der Parameter innerhalb des Workflows.
Sie können den Workflow mit nur wenigen Codezeilen in ein einfaches Windows Presentation Foundation (WPF)-Fenster, und noch weniger beim Hinzufügen zu einer vorhandenen Anwendung starten:
Imports OfficeWorkflow
Imports System.Activities
Class MainWindow
Public Sub New()
InitializeComponent()
WorkflowInvoker.Invoke(New Workflow2)
MessageBox.Show("Workflow Completed")
Me.Close()
End Sub
End Class
Ich wollte die Aktivitäten im Allgemeinen nützlich zu sein, und mehr als eine Strategie für die Bereitstellung des Eingabedokuments zur Verfügung haben. Um dies zu ermöglichen, haben die Aktivitäten einen gemeinsamen Parameter mit dem Namen InputDocument. Diese können Variablen beigefügt werden, die wiederum als die Bedürfnisse der dem Workflow-Diktat Ausgänge anderer Aktivitäten verbunden sind. Der Parameter enthält den Pfad zu einem Eingabedokument als Prototyp verwendet. Der Code bietet jedoch auch für die Verwendung eines Feld-Parameters, dessen Name InputDocument ist, wenn es einen Pfad zu einem Dokumenttyp geeignet für das Ziel Office-Anwendung enthält. Ein zusätzlicher Parameter ermöglicht die Zielaktivität in ein Eingabefeld mit dem Namen TargetActivity benannt werden. Dies ermöglicht mehrere Tätigkeiten in einer Sequenz; um beispielsweise die Felder in der ursprünglichen Eingabedokument für Anwendbarkeit zu bewerten.
Jeder echte Workflow wird eine Quelle der input-Daten haben. Zu Demonstrationszwecken habe ich eine DataEntry-Aktivität, die die Eingabe (die Felder und Standardwerte) zeichnen kann von einem beliebigen unterstützten Office-Dokumenttypen. Diese Tätigkeit öffnet ein Dialogfeld mit einem DataGrid und Schaltflächen für ein Dokument auswählen und speichern die Datenfelder. Nachdem der Benutzer ein Dokument als Prototyp auswählt, das DataGrid ist voller in die verfügbaren Felder aus dem Dokument sowie die InputDocument, OutputDocument und TargetActivity Felder, wie in gezeigt Abbildung 2. (Übrigens, Julie Lerman April 2011 Datenpunkte Spalte, "Komponieren WPF DataGrid Spalte Vorlagen für ein bessere User Experience," die finden Sie unter msdn.microsoft.com/magazine/gg983481, ist einen wichtigen Hinweis auf die Verwendung von FocusManager zu aktivieren ein-Klick-Bearbeitung in einem Raster wie in Abbildung 2.)
Abbildung 2 die Entry-Aktivität Datenschnittstelle
Verarbeitung der Daten in den Dokumenten
Wie bereits erwähnt, hat jedes der Office-Dokumenttypen eigene Art und Weise der Bereitstellung einer Sammlung von benannten Feldern. Jeder dieser Tätigkeiten wird geschrieben, um einen bestimmten Dokumenttyp zu unterstützen, aber die Aktivitäten, die alle Office-Dokumenttypen unterstützen, folgen dem gleichen Muster. Wenn die InputDocument-Eigenschaft bereitgestellt wird, dient es als der Pfad zu dem Dokument. Wenn die InputDocument-Eigenschaft null ist, die Aktivität sieht in der Fields-Eigenschaft für ein InputDocument Wert wenn gefunden, wird geprüft, ob es einen Pfad enthält mit einem Suffix geben Sie übereinstimmende das Dokument die Aktivität-Griffe. Die Aktivität auch versucht, ein Dokument zu finden, indem ein geeignetes Suffix angehängt. Wenn diese Bedingungen erfüllt sind, die InputDocument-Eigenschaft auf diesen Wert gesetzt ist, und Verarbeitung wird fortgesetzt.
Jeder passender Eintrag aus der Fields-Auflistung wird verwendet, um in das entsprechende Feld im Ausgabedokument zu füllen. Dies entweder als die entsprechende Workflow-Variable (OutputDocument) übergeben wird, oder ist in der Fields-Auflistung als OutputDocument KeyValuePair Eintrag gefunden. Wenn das Ausgabedokument kein Suffix besitzt, ist in jedem Fall eine geeignete Standardsuffix angefügt. Dies ermöglicht den gleichen Wert möglicherweise verwendet werden, um unterschiedliche Dokumenttypen oder sogar mehrere Dokumente verschiedener Typen zu erstellen.
Das Ausgabedokument wird am angegebenen Pfad gespeichert werden. In den meisten realen Workflowumgebungen wäre dies eine Netzwerkfreigabe oder eine SharePoint-Ordner. Der Einfachheit halber habe ich einen lokalen Pfad in den Code. Außerdem überprüft der Code für die Word und Excel das Eingabedokument für den entsprechenden Typ. In der Demo-Workflow wird standardmäßig das Eingabedokument der Prototyp als Basis für die Felder ausgewählt. Der Benutzer kann dies ändern, so dass Felder abgeleitet ein Word-Dokument verwendet werden kann, definieren Sie Eingänge für ein Excel-Dokument, oder umgekehrt. Abbildung 3 zeigt den Code für das Ausfüllen eines Word-Dokuments.
Abbildung 3 Füllung in einem Textverarbeitungsdokument in der Aktivität
Protected Overrides Sub Execute(ByVal context As CodeActivityContext)
InputFields = Fields.Get(Of Dictionary(Of String, String))(context)
InputDocumentName = InputDocument.Get(Of String)(context)
If String.IsNullOrEmpty(InputDocumentName) Then InputDocumentName = _
InputFields("InputDocument")
OutputDocumentName = OutputDocument.Get(Of String)(context)
If String.IsNullOrEmpty(OutputDocumentName) Then OutputDocumentName = _
InputFields("OutputDocument")
' Test to see if this is the right activity to process the input document
InputFields.TryGetValue(("TargetActivity"), TargetActivityName)
' If there is no explicit target, see if the document is the right type
If String.IsNullOrEmpty(TargetActivityName) Then
If Not (InputDocumentName.EndsWith(".docx") _
Or InputDocumentName.EndsWith(".docm")) _
Then Exit Sub
'If this is the Target Activity, fix the document name as needed
ElseIf TargetActivityName = Me.DisplayName Then
If Not (InputDocumentName.EndsWith(".docx") _
Or InputDocumentName.EndsWith(".docm")) _
Then InputDocumentName &= ".docx"
End If
Else
Exit Sub
End If
' This is the target activity, or there is no explicit target and
' the input document is a Word document
Dim InputWordInterface = New WordInterface(InputDocumentName, InputFields)
If Not (OutputDocumentName.EndsWith(".docx") _
Or OutputDocumentName.EndsWith(".docm")) _
Then OutputDocumentName &= ".docx"
InputWordInterface.SaveAs = OutputDocumentName
Dim Result As Boolean = InputWordInterface.FillInDocument()
' Display the resulting document
System.Diagnostics.Process.Start(OutputDocumentName)
End Sub
In Abbildung 3, beachten Sie insbesondere die folgende Zeile:
Dim InputWordInterface = _
New WordInterface(InputDocumentName, InputFields))
Dies ist, wo die WordInterface-Klasseninstanz erstellt wird. Es hat den Pfad auf das Dokument zu verwenden, als Prototyp, zusammen mit den Felddaten übergeben. Diese werden einfach in die entsprechenden Eigenschaften für den Einsatz von Methoden der Klasse gespeichert.
Die WordInterface-Klasse stellt die Funktion, die in das Zieldokument füllt. Das Eingabedokument dient als Prototyp, von dem eine Kopie im Arbeitsspeicher von der zugrunde liegenden OpenXML-Dokument erstellt wird. Dies ist ein wichtiger Schritt – die Kopie im Arbeitsspeicher ist derjenige, der ausgefüllt und dann wie die Ausgabedatei gespeichert hat. Erstellung der Kopie im Arbeitsspeicher ist die gleichen für jeden Dokumenttyp und erfolgt auf der Basis OfficeInterface-Klasse. Speichern der Ausgabedatei ist jedoch mehr spezifisch für jeden Typ. Abbildung 4 zeigt, wie das Word-Dokument durch die WordInterface-Klasse gefüllt wird.
Abbildung 4 verwenden die WordInterface-Klasse in einem Word Dokument ausfüllen
Public Overrides Function FillInDocument() As Boolean
Dim Status As Boolean = False
' Assign a reference to the existing document body.
Dim DocumentBody As Body = WordDocument.MainDocumentPart.Document.Body
GetBuiltInDocumentProperties()
Dim BookMarks As Dictionary(Of String, String) = Me.GetFieldNames(DocumentBody)
' Determine dictionary variables to use -
based on bookmarks in the document matching Fields entries
If BookMarks.Count > 0 Then
For Each item As KeyValuePair(Of String, String) In BookMarks
Dim BookMarkName As String = item.Key
If Me.Fields.ContainsKey(BookMarkName) Then
SetBookMarkValueByElement(DocumentBody, BookMarkName, Fields(BookMarkName))
Else
' Handle special case(s)
Select Case item.Key
Case "FullName"
SetBookMarkValueByElement(DocumentBody, _
BookMarkName, GetFullName(Fields))
End Select
End If
Next
Status = True
Else
Status = False
End If
If String.IsNullOrEmpty(Me.SaveAs) Then Return Status
Me.SaveDocument(WordDocument)
Return Status
End Function
Ich habe einen besonderen Fall Feldnamen FullName aufgerufen. Wenn das Dokument ein Feld mit diesem Namen enthält, verketten ich Eingabefelder namens Title, FirstName und LastName, es auszufüllen. Die Logik für dieses ist eine Funktion namens GetFullName. Da alle Office-Dokumenttypen ähnliche Anforderungen haben, ist diese Funktion in der Basisklasse OfficeInterface zusammen mit einigen anderen gemeinsamen Eigenschaften. Ich habe eine Select Case-Anweisung verwendet, um dadurch einen Erweiterungspunkt. Sie könnten beispielsweise ein FullAddress-Feld hinzufügen, die Eingabefelder Namens Adresse1, Adresse2, Stadt, Staat, Postleitzahl und Land verkettet.
Die Ausgabedokumente speichern
Die Activity-Klassen jeweils eine OutputDocument-Eigenschaft, die durch verschiedene Mittel festgelegt werden kann. Im Designer kann eine Eigenschaft mit einem Workflow-Ebene-Parameter oder einen konstanten Wert gebunden werden. Zur Laufzeit sucht jede der Aktivitäten in der OutputDocument-Eigenschaft für den Pfad zu das Dokument speichern. Wenn dies nicht festgelegt ist, wird es in der Fields-Auflistung nach einem Schlüssel mit dem Namen OutputDocument aussehen. Wenn dieser Wert mit einem entsprechenden Suffix endet, wird es direkt verwendet. Wenn es keine entsprechende Suffix haben, ist eine hinzugefügt. Die Aktivität speichert anschließend das Ausgabedokument. Dies ermöglicht maximalen Flexibilität in den Pfad in das Ausgabedokument aufstellen. Da das Suffix ausgelassen wird, kann denselben Wert von entweder die Aktivitätstypen verwendet werden. Hier ist wie ein Word-Dokument gespeichert ist, zuerst sicherzustellen, dass der Arbeitsspeicherstream aktualisiert wird und dann mit der Methode in der Basisklasse:
Public Sub SaveDocument(ByVal document As WordprocessingDocument)
document.MainDocumentPart.Document.Save()
MyBase.SaveDocument()
End Sub
Beispiel-Workflows
Abbildung 5 zeigt den einfachen Workflow ich verwende zu zeigen, wie die Integration funktioniert. Ein zweites Beispiel verwendet ein Flussdiagramm, in Abbildung 6. Ich gehe durch die einzelnen die Aktivitätstypen wiederum und reden, was sie tun, aber zuerst wollen wir sehen, was nicht jeder Workflow.
Abbildung 5 einfachen Workflow mit Office-Integration
Abbildung 6 Flussdiagramm Workflows mit Office-Integration
Der Workflow besteht aus einer einfachen Sequenz, die jeder Leistungsart wiederum ruft. Da die Aktivitäten von Word und Excel die Eingabe Dokumenttypen überprüfen, versuchen nicht sie, den falschen Typ verarbeiten.
Das Flussdiagramm Workflow in Abbildung 6 verwendet eine Switch-Aktivität um zu entscheiden, welche Office-Aktivität aufgerufen werden soll. Es verwendet einen einfachen Ausdruck um diese Feststellung machen.
Right(Fields("InputDocument"), 4)
Die Fälle Docm und Docx richten sich zu Wort, während in Excel Xlsx und Xlsm gerichtet sind.
Ich verwende Abbildung 5 beschreiben die Aktionen der einzelnen Aktivitäten, aber die Aktion in Abbildung 6 ähnelt.
Dateneingabe
An der Spitze der Abbildung 5, können Sie eine Instanz der DataEntryActivity-Klasse. Der DataEntryActivity zeigt ein WPF-Fenster mit einem DataGrid-Steuerelement gefüllt wird, durch extrahieren die benannten Felder aus den InputDocument, welches in diesem Fall vom Benutzer ausgewählt wird. Das Steuerelement ermöglicht den Benutzer, wählen ein Dokument, unabhängig davon, ob man ursprünglich vorgesehen war. Der Benutzer kann dann eingeben oder Ändern der Werte in den Feldern. Eine separate ObservableCollection-Klasse wird bereitgestellt, um die erforderliche TwoWay-Bindung an das DataGrid-Steuerelement zu aktivieren, wie in gezeigt Abbildung 7.
Abbildung 7 ObservableCollection für angezeigte Felder
Imports System.Collections.ObjectModel
' ObservableCollection of Fields for display in WPF
Public Class WorkflowFields
Inherits ObservableCollection(Of WorkFlowField)
'Create the ObservableCollection from an input Dictionary
Public Sub New(ByVal data As Dictionary(Of String, String))
For Each Item As KeyValuePair(Of String, String) In data
Me.Add(New WorkFlowField(Item))
Next
End Sub
Public Function ContainsKey(ByVal key As String) As Boolean
For Each item As WorkFlowField In Me.Items
If item.Key = key Then Return True
Next
Return False
End Function
Public Shadows Function Item(ByVal key As String) As WorkFlowField
For Each Field As WorkFlowField In Me.Items
If Field.Key = key Then Return Field
Next
Return Nothing
End Function
End Class
Public Class WorkFlowField
Public Sub New(ByVal item As KeyValuePair(Of String, String))
Me.Key = item.Key
Me.Value = item.Value
End Sub
Property Key As String
Property Value As String
End Class
Die InputDocument kann entweder von der unterstützten Office Dokumenttypen, Word (DOCX oder DOCM) oder Excel (.xlsx oder .xlsm). Um die Felder aus dem Dokument extrahieren, wird die geeignete OfficeInterface-Klasse aufgerufen. Es lädt das Zieldokument als Objekt OpenXML und listet die Felder (und deren Inhalt), falls vorhanden. Die Dokumentformate, die Makros enthalten werden unterstützt, und die Makros werden in das Ausgabedokument übernommen.
Eines der von der DataEntryActivity bereitgestellten Felder ist TargetActivity-Feld. Dies ist nur der Name einer Aktivität, deren Fields-Eigenschaft mit der das Eingabedokument gesammelten Feldern aufgefüllt werden soll. Das TargetActivity-Feld wird durch die andere Aktivitäten als eine Möglichkeit zu bestimmen, ob die Datenfelder verarbeitet verwendet.
WordFormActivity
Die WordFormActivity bezieht sich auf ein Textverarbeitungsdokument (Word). Es entspricht die Einträge Felder, um alle Lesezeichen in das Word-Dokument mit dem gleichen Namen. Dann wird den Wert des Felds in das Word-Lesezeichen eingefügt. Diese Aktivität wird Word-Dokumente mit (DOCM) akzeptieren oder ohne Makros (DOCX).
ExcelFormActivity
Die ExcelFormActivity bezieht sich auf ein Tabellendokument (Excel). Es entspricht die Einträge Felder einfache benannte Bereiche in Excel Dokument mit demselben Namen. Es fügt dann den Wert des Feldes in den benannten Bereich Excel. Diese Aktivität wird Excel-Dokumenten mit (xlsm) akzeptieren oder ohne Makros (XLSX).
Excel-Dokument-Typen haben einige zusätzlichen Besonderheiten, die spezielle Behandlung erfordern, wenn ausgefüllt Daten formatiert und korrekt gehandhabt werden. Eines dieser Features ist die Vielfalt der impliziten Datums- und Zeitformate. Glücklicherweise sind diese gut dokumentiert (siehe ECMA-376 Teil 1, 18.8.30 bei bit.ly/fUUJ). Wenn ein ECMA-Format erkannt wird, muss es mit den entsprechenden übersetzt werden.NET-Format. So wird z. B. das ECMA-Format mm-Dd-Yy M/Dd/Yyy.
Darüber hinaus Arbeitsblätter haben ein Konzept der freigegebene Zeichenfolgen, und besondere Behandlung ist erforderlich, wenn einen Wert in eine Zelle einfügen, die eine freigegebene Zeichenfolge enthalten. Die hier verwendete InsertSharedStringItem-Methode wird von der in der OpenXML SDK enthaltenen abgeleitet:
If TargetCell.DataType.HasValue Then
Select Case TargetCell.DataType.Value
Case CellValues.SharedString ' Handle case of a shared string data type
' Insert the text into the SharedStringTablePart.
Dim index As Integer = InsertSharedStringItem(NewValue, SpreadSheetDocument)
TargetCell.CellValue.Text = index.ToString
Status = True
End Select
End If
Letzter Schliff
Der Workflow-Beispiel gibt einfach seinen eigenen Abschluss. Die Aktivität, die Belegart oder durch das TargetActivity-Feld ausgewählt haben, erstellt die Ausgabedokument am angegebenen Speicherort. Von hier aus können sie durch andere Aktivitäten zur weiteren Verarbeitung abgeholt werden. Zu Demonstrationszwecken endet jede der Aktivitäten starten das Ausgabedokument, unter Berufung auf Windows, um es in der entsprechenden Anwendung öffnen:
System.Diagnostics.Process.Start(OutputDocumentName)
Wenn Sie stattdessen drucken möchten, können Sie Folgendes verwenden:
Dim StartInfo As New System.Diagnostics.ProcessStartInfo( _
OutputDocumentName) StartInfo.Verb = "print"
System.Diagnostics.Process.Start(StartInfo)
Da wir mit nur das Dokumentformat arbeiten, gibt es noch keine Notwendigkeit für die Workflowanwendung, die die installierte Office-Version beachten!
In einer realen Produktionsumgebung würde mehr Arbeit in der Regel folgen. Datenbank-Einträge gemacht werden könnte, und Dokumente können am Ende wird per E-mail weitergeleitet oder gedruckt und an einen Kunden gesendet. Produktions-Workflow-Anwendungen auch würde andere Dienste wie Persistenz und Nachverfolgung nutzen.
Nachbereitung
Ich habe eine grundlegende Design-Konzept für eine Schnittstelle mit Office-Dokumenten mit dem OpenXML SDK Fenster Workflow Foundation 4 dargelegt. Den Beispielworkflow veranschaulicht diesen Ansatz, und zeigt, wie es in einer Weise implementiert werden kann, die Office-Dokumente, die Verwendung von Daten in den Workflow passt. Die Klassen, aus denen diese Lösung basiert, sind leicht veränderbare und erweiterbar und eine Vielzahl von ähnlichen Anforderungen zu erfüllen. Obwohl die Workflow-Aktivitäten in WF 4 nutzen geschrieben werden und die.NET Framework 4, die Office Schnittstellenbibliotheken sind auch kompatibel mit der.NET Framework 3.5.
Rick Spiewak ist ein Software-Systemingenieur Blei mit der MITRE Corporation Er arbeitet mit den USA Air Force elektronischen Systems Center auf Mission planen. Spiewak hat mit Visual Basic seit 1993 und Microsoft zusammengearbeitet.NET Framework seit 2002, als er ein Beta-Tester für Visual Studio war.NET 2003. Er verfügt über langjährige Erfahrung, die Integration von Office-Anwendungen mit einer Vielzahl von Workflow-Tools.
Unser Dank gilt dem folgenden technischen Experten für die Durchsicht dieses Artikels: Andrew Coates