La recente uscita dell' SDK v2.0 CTP di OOXML ha attirato la mia attenzione in questi ultimi giorni. Ho avuto modo di fare un rapido giro delle API e devo dire che le novità introdotte segnano un significativo passo in avanti rispetto la precedente v1.0.
Infatti, mentre l' object model della v1 fornisce un "limitato" accesso allo scheletro di un documento OOXML (supportando la programmabilità OO delle principali parti "strutturali" di una OpenXmlPart di un OpenXmlPackage), la v2 introduce il supporto strongly-typed per tutte le XmlPart definibili a qualsiasi livello gerarchico.
Quindi, tutti gli elementi e gli attributi previsti negli schemi XML dei vari formati OOXML sono oggi programmabili tramite le relative classi ed enumerations .NET.
Nel seguente esempio vediamo come inserire un' immagine in un WordprocessingDocument utilizzando l'object model delle nuove API:
using (WordprocessingDocument document = WordprocessingDocument.Create(@"C:/.../testImage.docx", WordprocessingDocumentType.Document))
{
// Aggiunge la parte principale del WordProcessingDocument
document.AddMainDocumentPart();
// Aggiungiamo una OpenXmlPart di tipo ImagePart
ImagePart imagePart = document.MainDocumentPart.AddImagePart(ImagePartType.Jpeg, "MyPhoto");
using (FileStream image_stream = new FileStream(@"C:/.../Me.jpg", FileMode.Open))
{
imagePart.FeedData(image_stream);
}
// Creazione dell'immagine
ImageData myPhotoImageData = new ImageData();
myPhotoImageData.RelationshipId = new StringValue("MyPhoto");
Shape myPhotoShape = new Shape(myPhotoImageData);
myPhotoShape.Style = new StringValue("width:128; height:128");
Picture myPhotoPicture = new Picture(myPhotoShape);
// Costruzione del MainDocumentPart
document.MainDocumentPart.Document = new Document(
new Body(
new Paragraph(new Run(myPhotoPicture)),
new Paragraph(new Run(new Text("Dario Santarelli")))
));
// Salvataggio dati DOM
document.MainDocumentPart.Document.Save();
// Salvataggio e chiudsura del WordProcessingDocument
document.Close();
}
Il risultato che otteniamo è il seguente:
Come si può notare il principale vantaggio si concentra sul fatto che da oggi le soluzioni di sviluppo su Open XML non debbano più basarsi necessariamente sul DOM programming a seconda dello specifico scenario di markup (WordprocessingML ,SpreadsheetML ,PresentationML, DrawingML), bensì su un object model accedibile via intellisense, completo a qualunque livello della gerarchia di ciascuna OpenXmlPart.
Un'altra utilissima feature che verrà inserita nelle successive release di queste API ha a che vedere con il targeting della versione di OOXML, per cui verranno previste funzionalità di validazione dei package: sebbene in realtà un task del genere sia già realizzabile con la versione 1, non garantisce tuttora la validità effettiva del documento Open XML:
(Da MSDN) The Validate method does not validate the structure of an Office Open XML Package
Technorati Tag:
OOXML,
.NET