Disponibili la nuova versione dell' Office Open XML SDK e relativa ROADMAP

Era il "lontano" Giugno 2007 quando al TechEd è stato annunciato l' Office Open XML SDK (OOXML) per facilitare la creazione di soluzioni basate sul nuovo formato aperto dei file Office Ecma Office Open XML Formats (ECMA-376) . Le classi per la manipolazione dei packages sono presenti dalla versione 3.0 del .NET Framework (le Packaging API - System.IO.Packaging ). Queste classi però lavorano a basso livello sul formato rendendo non proprio intuitiva la scrittura di operazioni sui formati. L' Open XML SDK ha quindi l'obiettivo di fornire un insieme di classi .NET più ad alto livello per semplificaree la vita ai programmatori... soprattutto nei principali scenari applicativi :

  • creazione di documenti office via codice.
  • customizzazione di parti dei documenti.
  • manipolazione dei contenuti.
  • verifica dei formati
  • customizzazione delle proprietà dei documenti.

lasciando l'uso diretto delle classi in System.IO.Packaging come alternativa solo per i casi in cui si vuole avere il controllo diretto di ogni singolo aspetto del formato.

Da un punto di vista architetturale la presenza di System.IO.Packaging e dell' SDK ci permette di realizzare in modo "supportato" uno degli scenari applicativi più comuni e più difficilmente realizzabili con le versioni precedenti di office e del formato binario : la creazione di documenti office server side !!! Perchè dico difficilmente realizzabili? Perchè spesso questa operazione veniva svolta tramite due passi :

  1. Installazione di Office lato server!!!
  2. Scrittura di codice che istanziando server side i vari prodotti Office tipo Word.Application via OLE Automation andava a creare/modificare i documenti.

La difficoltà non stava tanto nell'eseguire questi due punti ma piuttosto far si che il server non adasse in crisi nel tempo... Infatti parliamo subito del punto 2 (per il punto 1 dico solo che non è mai una buona soluzione installare codice di tipo client-side sui server perchè di certo non aiuta nel limitare l'attack surface del server stesso). Il problema tecnico del punto 2 è semplice. Gli strumenti Office sono by design implementati per avere interazioni con un utente. Qualsiasi cosa debba comunicare lo fa via MessageBox !! Purtroppo server side, soprattutto se il codice era scritto come servizio NT non c'era modo di premere il bottone OK o CANCEL perchè non c'era nessun desktop associato (oltre che probabilmente nessun utente disponibile 7x24). Questo comportava che il Thread di IIS rimaneva bloccato per sempre (a meno di non gestire  il recycle degli application pool di IIS 6.0). Col tempo le risorse del server venivano via via "mangiate" dall'applicazione portando il server ad avere gravi problemi di performance. Per risolvere questa problematica ne ho viste di tutte... da programmi sentinella che killavano brutalmente word se rimaneva per troppo tempo aperto... magari rovinando il normal.dot... e quindi non vi dico cosa succedeva...) a soluzioni più estreme... IISRESET (o equivalente via codice) ogni tot ore...con la felicità degli utenti di altre applicazioni hostate sullo stesso server che magari in quattro e quattrotto perdevano tutto il loro lavoro perchè lo stato dell'applicazione PUFF svaniva...e mi fermo qui...).
Questo è il vero motivo per cui anche sulla documentazione Microsoft lo scenario di Office Server side non è mai stato supportato!!!

Ora con System.IO.Packaging e l' SDK è possibile creare, modificare e gestire i documenti office anche server side senza nessun problema di stabilità e di supporto!!!! Un esempio?

 // How to: Create a new package as a Word document.
public static void CreateNewWordDocument(string document)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
    {
        // Set the content of the document so that Word can open it.
        MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();

        SetMainDocumentContent(mainPart);
    }
}

// Set content of MainDocumentPart.
public static void SetMainDocumentContent(MainDocumentPart part)
{
    const string docXml =
 @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?> 
<w:document xmlns:w=""https://schemas.openxmlformats.org/wordprocessingml/2006/main"">
<w:body><w:p><w:r><w:t>Hello world!</w:t></w:r></w:p></w:body>
</w:document>";

    using (Stream stream = part.GetStream())
    {
        byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
        stream.Write(buf, 0, buf.Length);
    }
}

 

Le Open XML API verranno rilasciate in 2 versioni entrambe scaricabili gratuitamente QUI.

La versione 1.0 sarà un update della CTP (Community Technology Preview) di Giugno 2007. La successiva versione della CTP verrà rilasciata ad Aprile 2008 mentre la versione finale è prevista per Maggio 2008. Le maggiori novità sono l'accesso strongly-typed a parti dei documenti Office, facilitazioni per l'uso del'' SDK via Linq to XML più molti altre piccole modifiche richieste dai beta tester e dalla comunità degli sviluppatori.

La versione 2.0 invece estenderà l'object model con varie funzionalità avanzate come il search contestuale, le funzioni di validazione dei formati, alcune classi *ML  per gestire oggetti presenti in più tipi di documenti,il content object model per accedere direttamente a singole parti di documenti... La prima CTP vedrà la luce a Giugno 2008 mentre la versione RTW (Release to Web) sarà disponibile compatibilmente con l'uscita di Office 14 ovvero la prossima major release di Office.

 

clip_image002

 

Per dare un'idea di come si stia semplificando la programmazione del nuovo formato OOXML via .NET riporto alcuni brevi esempi... per maggiori informazioni consultare l'SDK e le sezioni How-to

 

Aggiungere un immagine ad un package

  public static void AddImagePart(string document, string fileName)
 {
  using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
   {
     MainDocumentPart mainPart = wordDoc.MainDocumentPart;

     ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg);

     using (FileStream stream = new FileStream(fileName, FileMode.Open))
     {
       imagePart.FeedData(stream);
     }
   }
 } 

Validare un Package

 public void ValidateSimplePackage(string xlsxFile)
{
   SpreadsheetDocument xlsxDoc = SpreadsheetDocument.Open(xlsxFile, true);
   Using(xlsxDoc)
   {
      // Remove the main workbook part.
      xlsxDoc.DeletePart(xlsxDoc.WorkbookPart);

      // Validate the package. Will return an exception 
      // because of the missing part.
      xlsxDoc.Validate(null);
   }
}

 

 

Per maggiori informazioni : https://openxmldeveloper.org/archive/2008/03/13/OpenXMLSDK.aspx

 

Copertura Press:

· BetaNews: A new SDK for OOXML aims to mobilize developers by Scott Fulton, March 13, 2008

· Computerworld: Microsoft releasing OOXML SDK by Eric Lai, March 12, 2008 - Also posted on InfoWorld

· InternetNews.com: Microsoft maps out OOXML developer tools by Stuart Johnston, March 12, 2008

· ZDNet, UK (blog): Microsoft presses on regardless with OOXML SDK by Peter Judge, March 13, 2008

· ZDNet (blog) A Slim API for OOXML by John Carrol, March 13, 2008

· Redmond Developer News Microsoft reveals OOXML SDK roadmap by Michael Desmond, March 13, 2008

 

--Mario