MS Word-Textbausteine in der Datenbank zentral verwalten!
Des Öfteren ist bereits an mich die Anforderung herangetragen worden, dass Kunden, die intensiv mit Word-Dokumenten arbeiten, gerne mehr Kontrolle und weniger Pflegeaufwand bei der Verwaltung Ihrer Textbausteine haben würden. In der Regel hat jeder Mitarbeiter auf seiner Maschine ein Set von Textbausteinen, mit denen er/sie arbeitet. Oft gibt es aber Textbausteine, deren Aussehen und Inhalt zum Beispiel gesetzlichen Regelungen unterliegt. Wenn sich nun an solch einem Textbaustein eine Änderung ergibt, dann wird es schwierig, diese auf allen Rechnern zeitnah sicherzustellen!
Aus diesem Grund wünschen sich viele Kunden eine Möglichkeit, die Textbausteine an einer zentralen Stelle pflegen und verwalten zu können, so dass jeder Mitarbeiter immer nur den aktuellen Stand zur Verfügung hat. Daraus entstand meine Motivation für dieses Problem eine Lösung zu finden und habe mal prototypisch einen Lösungsansatz skizziert. Nachfolgend ist die Lösung grob umrissen!
Die Lösung
Die Kern-Idee des Ansatzes besteht darin ein Add-in bereitzustellen, das seine Textbausteine aus einer zentralen Datenbank bezieht und dem Anwender ermöglicht, diese an der Schreibmarke im Dokument zu platzieren.
Dies ist ja letztendlich auch kein Hexenwerk, bis man zu der Stelle kommt, wo die Textbausteine erfasst und gepflegt werden müssen! Einen einfachen Text zu erfassen, stellt noch kein Problem dar. Dieser könnte auch direkt in der Datenbank gepflegt werden. Aber was ist, wenn die Anforderung besteht, Elemente wie bspw. Bilder, Tabellen, etc. im Textbaustein einzubinden! MS Word arbeitet seit Office 2007 mit einer komplexen, internen Struktur mit diversen Verzeichnissen für Styles, Bilder, etc.. Die Herausforderung besteht nun darin, den Textbaustein inklusive aller Elemente wie Text, Struktur, Bilder, Styles, etc. komplett in einem Container zu verpacken, diesen in der zentralen Datenbank zu persistieren und wieder in das Dokument einbinden zu können. Es gibt zwar einige Hersteller, die Editoren für Word-Inhalte anbieten; diese Komponenten sind aber entweder nicht sehr gut oder sehr teuer. Daher tendiere ich dazu, Word-Inhalte auch in Word zu erstellen!
Aus diesem Grund kann mein Word Add-in sowohl Textbausteine erfassen, als auch im Dokument einfügen! (Die Funktionen können in der finalen Lösung natürlich in einem Rechte-Rollen-Kontext angeboten werden.)
Unter dem Reiter “Textbausteine” findet der Anwender die Auswahl der bestehenden Textbausteine und die Option einen neuen zu erfassen.
Um einen neuen Textbaustein zu erfassen, markiert man den gewünschten Inhalt und klickt in der Ribbon auf “Textbaustein erfassen”.
Es erscheint ein kleiner Dialog zur Erfassung relevanter Metadaten, die für die Ablage und Präsentation benötigt werden.
Die Kategorie verwende ich der Übersicht halber, damit nicht alle Textbausteine in einer flachen Liste dargestellt. (Die Kategorien stammen auch aus einer Datenbank-Tabelle). Die Bezeichnung ist später relevant, um den Textbaustein in der Auswahl im Ribbon auszuweisen.
Nach dem Klick auf “ok” wird der Inhalt als OpenXML in der Datenbank abgelegt.
Nun kann dieser Textbaustein von allen Anwendern nach belieben verwendet werden, wie nachfolgend zu sehen.
Und wie durch Zauberhand! Tadaa!
Zum Editieren muss man lediglich einen bestehenden Textbaustein im Word-Dokument einfügen, anpassen und unter gleichem Namen wieder speichern. Dabei fängt eine Sicherheitsabfrage zufällige Überschreibungen ab.
Das Löschen ist derzeit noch in der Datenbank vorgesehen, kann aber später ebenfalls über die Ribbon angeboten werden.
Das Herzstück der Anwendung besteht im Erfassen und Einfügen des Word-Inhaltes. Nachfolgend sind die beiden wichtigsten Code-Schnipsel aus dem Prototyp dargestellt.
Das Erfassen:
Public Sub OnGetContentButton(ByVal control As Office.IRibbonControl)
Dim currentRange As Microsoft.Office.Interop.Word.Range =
Globals.HVTextbausteineAddIn.Application.Selection.Range()
Dim text As String = currentRange.XML
Dim contentXML As String = currentRange.WordOpenXML
Dim cMan As OperationManager = New OperationManager()
Dim categories As List(Of TextbausteinKategorieDaten) =
cMan.GetTextBlockCategories()
Dim dialog As AddTextblockDialog = New AddTextblockDialog(categories)
Dim categoryGuid As Guid = Guid.NewGuid()
Dim description As String = String.Empty
If dialog.ShowDialog() = DialogResult.OK Then
categoryGuid = dialog.KategorieID
description = dialog.Bezeichnung
' save content in data base
If (cMan.CreateOrUpdateTextblock(description, contentXML, categoryGuid))
Then
'clear collection to get fresh from DB
TextBlockAnzeigeDaten.Clear()
MessageBox.Show("Der Textbaustein wurde erfolgreich erfasst!")
Else
MessageBox.Show("Leider trat ein Fehler auf! Der Textbaustein konnte
leider nicht erfasst werden")
End If
End If
End Sub
Das Einfügen im Dokument:
Public Sub OnInsertTextblockButton(ByVal control As Office.IRibbonControl)
Dim currentRange As Microsoft.Office.Interop.Word.Range =
Globals.HVTextbausteineAddIn.Application.Selection.Range
Dim categoryId As String = control.Tag
'string test = currentRange.XML;
Dim textBlockId As Guid = New Guid(control.Id.Split("_")(1))
For Each tData In TextBlockAnzeigeDaten(New Guid(categoryId))
If (tData.TextbausteinId = textBlockId) Then
currentRange.InsertXML(tData.TextbausteinInhalt)
End If
Next
End Sub
Die Lösung funktioniert einwandfrei und hat im Gegensatz zu den Editor-Komponenten von Drittanbietern keinerlei Einschränkungen. (Jedenfalls sind mir bis jetzt keine aufgefallen.)