2007 Office System Client Development
Eind januari is 2007 Office System gelanceerd voor de algemene markt. Met de komst van deze laatste telg uit de Office-familie wordt weer een reeks nieuwe programmeermogelijkheden beschikbaar gesteld. Langzaam is Office van een gesloten documentomgeving aan het veranderen in een open applicatieplatform, waarop met behulp van bijvoorbeeld Visual Studio Tools for Office krachtige oplossingen ontwikkeld kunnen worden. Binnen 2007 Office System is niet alleen ruimte voor nieuwe, op .NET gebaseerde oplossingen; ook op COM leunende uitbreidingen van het Office-platform zullen blijven werken in de nieuwe omgeving. Buiten de Office-omgeving om kan ook gewerkt worden met de documenten die voortkomen uit Excel, PowerPoint en Word. Het nieuwe Open XML bestandsformaat zorgt voor ongekende portabiliteit van documenten.
Open XML
Samen met de komst van 2007 Office System wordt ook de belangrijkste verandering op Microsoft Office gebied meegeleverd: Het allom-bekende ‘doc’, ‘xls’ en ‘ppt’ bestandsformaat wordt vervangen door een nieuw formaat gebaseerd op XML. De oudere formaten blijven natuurlijk wel beschikbaar, maar standaard wordt hier niet meer voor gekozen. Ter vervanging van de oude formaten is Open XML verschenen. Dit is een nieuw, gestandaardiseerd bestandsformaat voor drie Office-applicaties; Excel, PowerPoint en Word. De Open XML standaard is echter veel meer dan enkel een nieuw bestandsformaat voor Microsoft Office. Het laat toe op nieuwe manieren met Office-documenten te werken zonder dat Office geïnstalleerd hoeft te zijn. Voornamelijk voor server-based oplossingen is dit een uitkomst gezien de ontbrekende ondersteuning voor Office in server omgevingen. Daarnaast wordt de Open XML standaard geïmplementeerd door Office-suites zoals Corel’s WordPerfect. Hierdoor worden de documenten in een organisatie een stuk toegankelijker en het delen van documenten over organisaties heen zal beter verlopen.

Fig. 1: Onderdelen Open XML
Open XML is gestandaardiseerd bij ECMA, waardoor afgedwongen wordt dat het formaat in de toekomst niet alsnog proprietary wordt
Het gebruik van een op XML gebaseerd bestandsformaat is niet nieuw in Microsoft Office. Als sinds Office XP wordt ExcelML ondersteund en in Office 2003 is ook het WordML bestandsformaat geïntroduceerd. Het grote verschil is dat Open XML is gestandaardiseerd bij ECMA. Hierdoor wordt afgedwongen dat het formaat in de toekomst niet alsnog proprietary wordt.
De oudere ExcelML en WordML formaten zijn pure XML formaten; embedded resources zoals plaatjes worden base64 encoded in XML vorm opgeslagen. Open XML maakt hier een kleine variatie op. In plaats van één enkel XML bestand wordt er gebruik gemaakt van een ZIP bestand. In deze ZIP worden meerdere XML files opgeslagen die samen het document vormen. Binaire resources worden in het native binaire formaat opgeslagen. Binnen de ZIP worden de verschillende bestanden aan elkaar gekoppeld met behulp van relaties, gedefinieerd in losse XML bestanden in de ZIP. Dit biedt een aantal voordelen voor de programmeur. Zo hoeft bijvoorbeeld niet het volledige document doorzocht te worden als je op zoek bent naar informatie over de toegepaste stijlen. Het doorzoeken van de relaties zal al volstaan. Omdat de structurering van de ZIP met behulp van XML relatie bestanden een onlosmakelijk onderdeel vormt van Open XML, is ook dit vastgelegd in de ECMA standaard. De Open Packaging Convention (OPC) beschrijft deze structurering. Deze standaard wordt niet alleen gebruikt binnen Open XML maar ook bijvoorbeeld voor het XPS bestandsformaat.

Fig. 2: Open Packaging Convention
Open XML is een ZIP bestand met meerdere XML files die samen het document vormen
Door de gebruikte ZIP en XML technieken wordt een Open XML document toegankelijk op elk platform dat ZIP en XML ondersteunt. Binnen het .NET platform wordt hierbij nog extra een Packaging API aangeboden in het .NET 3.0 Framework. Deze API is te vinden in de WindowsBase.dll. Via de Packaging API wordt niet alleen toegang geboden tot de onderdelen in de ZIP. Het vormt een omgeving waarmee eenvoudig packages kunnen worden gemaakt die voldoen aan de Open Packaging Convention. Listing 1 toont een klein stuk van de beschikbare API. Op andere platformen zal zelf zorg gedragen moeten worden voor het werken volgens de OPC. De community is hier echter wel in beweging; de eerste API voor het Java platform is al in ontwikkeling.
using (Package package = Package.Open(
"mydoc.docx", FileMode.Open, FileAccess.ReadWrite))
{
PackagePart mainPart = null;
foreach(PackageRelationship relationship in
package.GetRelationshipsByType(RT_Main))
{
mainPart = package.GetPart(
PackUriHelper.ResolvePartUri(
relationship.SourceUri,
relationship.TargetUri));
break;
}
Console.WriteLine(mainPart.ContentType);
}
Listing 1: Coderen met de Packaging API
Qua tools komen er steeds meer interessante applicaties beschikbaar. De developer website OpenXmlDeveloper.org bevat vele codevoorbeelden, van PHP tot .NET. Daarnaast vind je hier ook verschillende tools die het makkelijker maken een Open XML oplossing te ontwikkelen en te testen. Enige tijd geleden is hier de Package Explorer gereleased, een editor voor Open XML packages met ondersteuning voor XML-Schema validatie. Tevens zie je de opkomst van verschillende APIs waarmee niet meer direct XML gecodeerd hoeft te worden, maar gebruik gemaakt wordt van een object laag bovenop Open XML. Voor de ontwikkelaar die met Open XML in aanraking komt is het zeker de moeite waard hiernaar te kijken.

Fig. 3: OpenXMLDeveloper.org
Visual Studio Tools for Office
Naast de mogelijkheid om buiten Microsoft Office te werken met Office-documenten via Open XML zijn er ook binnen de Office-omgeving veel programmeermogelijkheden. Een van de meest in het oog springende is Visual Studio Tools for Office, kortweg VSTO. Met behulp van VSTO wordt het eenvoudiger om business applicaties te ontwikkelen die draaien binnen Office. Office is immers een omgeving waarin men over het algemeen goed thuis is. Daarnaast vormt deze omgeving voor vele mensen de thuisbasis voor hun dagelijkse activiteiten. Door directe bedrijfsprocessen te integreren in de Office-omgeving kan worden voorkomen dat een Information Worker vele programma’s en websites open moet hebben om de gewenste bedrijfsgegevens te verwerken tot een document. De gegevens kunnen direct beschikbaar worden gemaakt in de Ribbon, een taskpane of in het document zelf.
Met behulp van VSTO kunnen twee typen projecten ontwikkeld worden, application-level en document-level projecten. Bij de document-level projecten is de VSTO applicatie gekoppeld aan een document of document template. Application-level projecten hebben geen geopend document nodig en worden samen met de Office-aplicatie gestart. Er zijn drie versies van VSTO en een vroege beta, die ieder verschillende projecten aanbieden voor de Office 2003- en 2007-omgevingen. Tabel 1 toont het overzicht.
| Versie> |
Office 2003 |
Office 2007 |
| |
Document |
Application |
Document |
Application |
| 2003 |
Excel InfoPath Word |
|
|
|
| 2005 |
Excel InfoPath Word |
Outlook |
|
|
| 2005 SE |
|
Excel Outlook PowerPoint Visio Word |
InfoPath |
Excel InfoPath Outlook PowerPoint Visio Word |
| “V3” (vroege beta) |
Excel Word |
|
Excel InfoPath Word |
All |
De document-level-projecten bieden een rijker programmeermodel bovenop wat Office aanbiedt via COM-interfaces. Zo worden events op documentniveau vertaald naar events die gekoppeld zijn aan bijvoorbeeld de Range control in Office Word. De Range control is binnen VSTO bekend als een host–control, ofwel een control die toegespitst is op het werken binnen een specifieke Office host-applicatie. De twee host-applicaties Excel en Word bieden ieder eigen host controls. Deze host-controls ondersteunen databinding en een rijk event model. Het is niet alleen mogelijk host-controls te gebruiken, alle Windows Forms controls kunnen via een ActiveX wrapper op een document worden geplaatst. Het heeft echter mijn voorkeur hiervoor de Document Actions taskpane te gebruiken. Verder vind je ondersteuning voor bijvoorbeeld smart tags en is er een geïntegreerde designer omgeving beschikbaar.
De application-level-projecten bieden ook weer een managed laag rondom de Automation interfaces van Microsoft Office. De functionaliteit van de application-level-projecten bieden drie hoofdgroepen aan functionaliteit; het automatiseren van taken, toevoegen van taskpanes en het aanpassen van de menustructuur, Ribbon en CommandBar.

Fig. 4: VSTO Application-level functionaliteit
Visual Basic for Applications zal plaats moeten maken voor VSTO
Voor taakautomatisering wordt al langere tijd Visual Basic for Applications gebruikt. Deze omgeving is in Office 2007 nog altijd beschikbaar, maar zal in toekomstige versies langzaam vervangen worden door VSTO. VSTO biedt een rijker objectmodel en een beter beheerbare managed omgeving.
De Document Actions taskpane is al bekend van de document-level-projecten. Application-level-projecten kunnen een willekeurig aantal taskpanes toevoegen; denk hierbij wel aan de schermruimte die overblijft om daadwerkelijk nog te werken met de Office-applicatie. VSTO stelt als doel zo min mogelijk code te vereisen voor het werken met taskpanes. Met één regel code kan een Windows Forms UserControl getoond worden als taskpane in de Office-UI. Het koppelen van een taskpane aan een specifiek window van Office kost net wat meer code, maar de basis blijft erg eenvoudig. Hierbij kan de focus blijven op het ontwikkelen van de oplossing zelf in plaats van het regelen van infrastructurele zaken, zoals de vertaalslag tussen COM en .NET.
public partial class ThisAddIn
{
private void ThisAddIn_Startup(
object sender, System.EventArgs e)
{
CustomTaskPane pane =
this.CustomTaskPanes.Add(
new ACMEPane(), "ACME Tasks")
pane.Visible = true;
}
}
Listing 2: Tonen van een custom taskpane
Ook de Ribbon laat zich met simpele code uitbreiden. Microsoft is hier van het CommandBar model afgestapt. De CommandBar infrastructuur werd regelmatig fout gebruikt. Programmeurs vergaten nog wel eens de code te schrijven voor deïnstallatie van buttons. Hierdoor blijven de toegevoegde buttons achter in de Office-UI, zelfs na deïnstallatie van de uitbreiding.
De Ribbon laat zich niet meer direct programmeren; er is bijvoorbeeld geen ‘Add’ functie voor het toevoegen van een knop. In plaats hiervan wordt gewerkt met RibbonX, een op XML gebaseerd extensibility model waar je menuelementen kunt toevoegen, bestaande menuelementen kunt aanpassen, of de hele Ribbon opnieuw kunt definiëren.
RibbonX verzorgt ook in de behoefte bepaalde knoppen in de Office-UI een andere taak te geven (command repurposing). Met de CommandBar menus was command repurposing lastig. Je moet zelf gaan zoeken op welke toolbars de ‘Save’ knop allemaal beschikbaar is, en handmatig al deze knoppen aanpassen. Met RibbonX specificeer je een klein stukje XML, dat automatisch wordt toegepast op alle knoppen met ‘Save’ functionaliteit. Minder administratiewerk voor de programmeur, met een stabielere oplossing tot gevolg.
label="Toggle ACME Pane"
imageMso="Smiley"
onAction="ToggleAcmePaneCallback"/>
Listing 3: RibbonX
Het is overigens ook mogelijk zonder VSTO met taskpanes en RibbonX te werken. Microsoft Office biedt een reeks interfaces aan die geïmplementeerd dienen te worden voor deze ondersteuning. Office zal op de traditionele COM-manier je project query-en voor de interface-implementatie en deze vervolgens gebruiken. Kies bijvoorbeeld voor het ‘Shared-Addin’ project in Visual Studio om dit mogelijk te maken. VSTO biedt echter wel een stuk meer dan alleen een vereenvoudigde manier om de interfaces te consumeren. Denk hier bijvoorbeeld aan de ActiveX containers voor het hosten van Windows Forms controls op je document, of het scheiden van meerdere VSTO applicaties met behulp van AppDomains.
Conclusie
Er is helaas ruimte te kort om Office Open XML en VSTO dieper te behandelen. Andere onderwerpen als het werken met InfoPath 2007, het geconsolideerde objectmodel van Microsoft Outlook 2007 en de komende veranderingen in de VSTO runtime verdienen het om nader bekeken te worden. Voor degene die aan de slag willen met Office-development is er een overzicht van bronnen opgenomen die zinvol zijn om te raadplegen.