quinta-feira, 9 de dezembro de 2010

>> Microsoft Office - Tecnologia OpenXML

Olá Pessoal,

Gostaria de partilhar com vocês uma nova tecnologia desenvolvida pela Microsoft para manipulação de qualquer documento do Office, chamada [Office Open XML - OOXML]. Quem ainda não usou vai realmente se surpreender, principalmente se está acostumado a usar a tecnologia anterior, chamada [Office Interop Automation].

Veja alguma das principais vantagens desta nova tecnologia:

- Manipula documentos do Office no formato ZIP [XML-based]. Para comprovar isto, basta renomear algum documento Office para [.zip] e notar que seu conteúdo é representado por um pacote de XMLs e outros arquivos de recursos relacionados;

- Esta tecnologia foi padronizada pela [ECMA], que regulariza e organiza padrões [mundiais] no uso de softwares;

- OOXML pode ser usado a partir da versão 2007 do Office;

- E o que considero como principal vantagem, possui a melhor performance já vista na manipulação de documentos.
Por exemplo, foi feita uma comparação pela Microsoft no uso da tecnologia anterior com a OOXML (http://msdn.microsoft.com/en-us/library/ff191178.aspx). Foi desenvolvido um código para inserir uma imagem em cada uma das 300 linhas em uma [tabela do Word]. Na tecnologia anterior o tempo gasto para realizar esta tarefa foi de [60 segundos]. Na tecnologia OOXML este tempo caiu para incríveis [5 segundos]!.

- Diferentemente da versão anterior, OOXML NÃO EXIGE a instalação do Microsoft Office no servidor onde seu código será instalado. Enorme vantagem!...

A utilização deste componente no seu projeto .NET é muito simples, basta adicionar uma referência do arquivo [Document.OpenXml.dll] no seu projeto e sair codificando.

Para ilustrar o uso deste componente, note o código abaixo, que usa [Linq To Object] do .NET Framework para recuperar todas as [tables] de um documento do Office Word:



using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

using (WordprocessingDocument wordDocument = WordprocessingDocument.Open('c:\WordDoc.docx', true))
{
List<Table> listTable = wordDocument.MainDocumentPart.Document.Body.Elements<Table>().ToList<Table>();
}


É claro que, quando você começa a estudar mais a fundo esta tecnologia, nota que, para algumas tarefas, o desenvolvimento se torna mais complexo, até porque você vai manipular uma estrutura de arquivos proprietários do pacote ZIP-XML-Based. Por exemplo, se precisar adicionar um texto em uma célula de uma tabela do Office Word, vai notar que precisa seguir algumas regras de uso de objetos dentro da célula. Veja o código abaixo:



using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

using (WordprocessingDocument doc = WordprocessingDocument.Open('c:\WordDoc.docx', true))
{
Table table = doc.MainDocumentPart.Document.Body.Elements<table>().First();
TableRow row = table.Elements<tablerow>().ElementAt(1);
TableCell cell = row.Elements<tablecell>().ElementAt(2);
Paragraph p = cell.Elements<paragraph>().First();
Run r = p.Elements<run>().First();
Text t = r.Elements<text>().First();
t.Text = 'Some Text';
}


No exemplo acima, o código realiza os seguintes passos:
- Acessa a [primeira table] que encontrar no documento;
- Acessa a [segunda] linha;
- E altera o conteúdo da [terceira] coluna.

Notamos também que existe uma [hierarquia] de objetos a serem acessados, como por exemplo, a classe [Paragraph] que contém a classe [Run], que por sua vez contém a classe [Text].

Assim como em outros produtos Microsoft, a documentação referente ao OOXML é muito boa. Basta baixar o SDK, acessando:

http://www.microsoft.com/downloads/en/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en

Note que existem dois tipos de instalador:

1 - OpenXMLSDKTool.msi

Esta ferramenta é muito útil porque permite a visualização do conteúdo de qualquer documento Office, e um incrível recurso que possibilita gerar [código .NET] a partir de qualquer parte do documento aberto. Desta forma o processo de aprendizado é acelerado, pois você analisa um código pronto.

Segue tela do OpenXMLTool, com a utilização do [Reflect Code]:




2 - OpenXMLSDKv2.msi

Possui a documentação completa do OOXML, com diversos exemplos práticos.

Tela principal do SDK:



That´s It!