none
Mala direta - Word e Xml

    Question

  •  

    Olá colegas,

     

    Preciso desenvolver uma aplicação Web em C# que disponha da seguinte funcionalidade:

    O usuário irá baixar um pacote compactado da aplicação por meio de um link. Dentro deste pacote haverá um template pré-formatado em Word e os dados em um arquivo Xml. O usuário poderá formatar o template da forma que quiser e depois com algum processo (macro, add-in e etc.) poderá ir adicionando os elementos do arquivo Xml livremente pelo template. Depois que o usuário terminar de colocar os elementos, o Word deverá gerar automaticamente todas as páginas de acordo com o número de registros contidos no arquivo Xml.

     

    Já fiz diversos testes com o Word e Xml, como:

    1. Gerar um arquivo xml da minha base
      select campo1, campo2, campo3 from tabela for xml auto, elements
    2. Abrir o arquivo xml gerado para dentro do word
      1. Nesta etapa ocorre o seguinte: O word trabalha muito bem com outros tipos de fontes de dados para gerar Malas-Diretas (Ferramentas > Mala-direta), como por exemplo Sql e o Excel. Mas o xml ele trata completamente diferente. Primeiro ele mostra a estrutura inteira do Xml no próprio documento e do lado direto abre-se um Task Painel chamado "XML Document" onde ele solicita um arquivo (XSL ou XSLT) que contém o estilo para o documento. Só que não é o que preciso pois eu tenho N registros dentro do meu Xml, como é mostrado abaixo, sendo que para cada elemento <bil_acao> deveria ser criada uma nova página no mesmo documento.
      2. bil_acao.xml
        <?xml version="1.0" encoding="iso-8859-1" ?>
        <tabela>
        <bil_acao>
          <cd_acao>80</cd_acao>
          <ds_acao>-</ds_acao>
          <cd_estado_atual>A</cd_estado_atual>
        </bil_acao>
        <bil_acao>
          <cd_acao>98</cd_acao>
          <ds_acao>Ação Civil Pública</ds_acao>
          <cd_estado_atual>A</cd_estado_atual>
        </bil_acao>
        <bil_acao>
          <cd_acao>50</cd_acao>
          <ds_acao>Ação de Conhecimento</ds_acao>
          <cd_estado_atual>A</cd_estado_atual>
        </bil_acao>
        <bil_acao>
          <cd_acao>110</cd_acao>
          <ds_acao>Ação de Cumprimento</ds_acao>
          <cd_estado_atual>A</cd_estado_atual>
        </bil_acao>
        <bil_acao>
          <cd_acao>107</cd_acao>
          <ds_acao>Ação de Execução</ds_acao>
          <cd_estado_atual>A</cd_estado_atual>
        </bil_acao>
        <bil_acao>
          <cd_acao>99</cd_acao>
          <ds_acao>Ação Declaratória</ds_acao>
          <cd_estado_atual>A</cd_estado_atual>
        </bil_acao>
        </tabela>

      3. Uma outra opção seria fazer algo como a ferramenta de Mala-Direta do próprio Word popular cada linha de uma tabela qualquer da base de dados, só que utilizando o arquivo Xml. pois o usuário deverá trabalhar desconectado da aplicação.

      4. Outra observação é que eu não posso utilizar arquivos textos com qualquer tipo de separador, tem que ser Xml mesmo.
    3. Trabalhar com XML Schemas Definations
      1. O Word permite que seja adicionado schemas no documento através do menu Tools > templates and Add-ins na aba XML Schema. Só que parece também não ser a solução pois neste caso os schemas só definem os tipos dos dados que podem ser inseridos em campos pré definidos do template, pelo menos eu não consegui popular os dados contidos no arquivo Xml desta forma.
      2. bil_acao.xsd
        <?xml version="1.0" encoding="utf-8"?>
        <xs: schema id="tabela" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn: schemas-microsoft-com:xml-msdata">
          <xs: element name="tabela" msdata:IsDataSet="true" msdata:Locale="en-US">
            <xs: complexType>
              <xs: choice minOccurs="0" maxOccurs="unbounded">
                <xs: element name="bil_acao">
                  <xs: complexType>
                    <xs: sequence>
                      <xs: element name="cd_acao" type="xs: string" minOccurs="0" />
                      <xs: element name="ds_acao" type="xs: string" minOccurs="0" />
                      <xs: element name="cd_estado_atual" type="xs: string" minOccurs="0" />
                    </xs: sequence>
                  </xs: complexType>
                </xs: element>
              </xs: choice>
            </xs: complexType>
          </xs: element>
        </xs: schema>
    4. Desenvolver uma macro
      1. Bom encontrei diversos códigos e tutoriais que ensinavam a automatizar tarefas com o Word e XML, só que não consegui encontrar nenhuma que fosse a solução. Talvez este seja o caminho VBA ou VSTO.

    Minha dúvida é com relação a maneira como o Word trabalha com os dados e qual a melhor arquitetura que poderia ser

    desenvolvida para este processo.

     

    Abraços

    Wednesday, November 05, 2008 7:10 PM