sexta-feira, 6 de junho de 2003

Integrando WORD e XML usando XMLHTTP

Sou professor na Universidade de Passo Fundo e, para evitar a “cola”, elaboro diversas provas, cada uma com as questões em uma ordem diferente.


Já a algum tempo eu queria automatizar o processo de geração das provas e como estava curioso sobre a integração entre WORD e XML desenvolvi esta pequena aplicação, simples mas muito didática.


A aplicação usa o componente XMLHTTP para integrar os dados, o XML como banco de dados, o XSLT para formatar os dados, ASP no processamento da base de dados e VBA como linguagem de macro que insere os dados no documento WORD.


Na verdade nem era necessário o uso de toda esta parafernália, mas resolvi juntar todas as tecnologias que estou estudando numa única aplicação.


 


Arquivos:


provas.xml – bd com as questões.


provas.xsl – arquivo com a formatação dos dados. Na verdade serve apenas para ordenar as questões usando o ID como chave.


xmlhttp.asp – script que responde às solicitações da macro do Word


provas.dot – arquivo de modelo do WORD com uma macro embutida que é acionada na criação de um novo documento.


 


Estude os fontes abaixo e bom trabalho.


Para baixar os arquivos acesse -> http://www.gdez.com.br/barbiero/provas.zip


 


provas.xml


Arquivo contendo as questões que serão reordenadas e inseridas no documento Word.


 


<?xml:stylesheet type="text/xsl"  ?>


<provas>


   <prova id="">


      <questao id="1">Diferencie as cebolas dos abacates.</questao>


      <questao id="2">defina o sabor do xuxu.</questao>


      <questao id="3">Diferencie redes para lambari de redes para tilápia</questao>


      <questao id="4">Para que serve o comando sbórnia?</questao>


      <questao id="5">Para que serve o comando tchê?</questao>


      <questao id="6">Para que serve o serviço de quarto?</questao>


      <questao id="7">O que é um calo?</questao>


      <questao id="8">Defina graxaim?</questao>


      <questao id="9">Descreva as características de Passo Fundo</questao>


      <questao id="10">Em quais camadas ficam os protocolos tartaruga e jacaré?</questao>


   </prova>


</provas>


 


provas.xsl


<?xml version="1.0"?>


<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">


<xsl:output method="xml"/>


 


<xsl:template match="/provas">


<provas>


            <prova>


                        <xsl:apply-templates select="/provas/prova"/>


            </prova>


</provas>


</xsl:template>  


 


<xsl:template match="/provas/prova">


   <xsl:for-each select="questao" >


     <xsl:sort select="@id"/>


             <questao>       


     <xsl:value-of select="."/>


     </questao>


   </xsl:for-each>


</xsl:template>  


 


</xsl:stylesheet>


 


 


xmlhttp.asp – este arquivo deve ser colocado em uma pasta com permissão de execução de scripts no IIS.


<%@ Language=VBScript %>


<%


            Response.CharSet="iso-8859-1"   'Define o conjunto de caracteres do português


 


            set docXML = Server.CreateObject("Microsoft.XMLDOM")


    docXML.async=false


    docXML.load(server.MapPath("provas.xml"))


   


            set docXSL = Server.CreateObject("Microsoft.XMLDOM")


    docXSL.async=false


    docXSL.load(server.MapPath("provas.xsl"))


 


    set nodelistQuestoes = docXML.documentElement.Childnodes(0).childnodes


    '


    '       Gera números aleatórios para alterar a ordem das questões


    '


    randomize            'inicializa o gerador de números aleatórios


    for i = 0 to nodelistQuestoes.length - 1


                nodelistQuestoes(i).setAttribute "id", int(rnd * 1000)


            next     


            '


            '            Aplica a formatação com o XSLT


            '


            set docTransformadoXML = Server.CreateObject("Microsoft.XMLDOM")


            docTransformadoXML.async = false


            docTransformadoXML.loadxml(docXML.transformNode(docXSL))


            '


            '            Envia as informações no formato exigido pelo Word, uma questão em cada linha.   


    '


    set nodelistQuestoes = docTransformadoXML.documentElement.Childnodes(0).childnodes


    for i = 0 to nodelistQuestoes.length - 1


                response.Write I + 1 & ") " & nodelistQuestoes(i).text & chr(13)


            next     


            '


            '            Destrói os objetos criados


            '


            set nodelistQuestoes = nothing


            set docXML = nothing


            set docXSL = nothing


            set docTransformadoXML = nothing


            %>


 


Macro do Word 2000 – Para integrar o WORD com o XML eu defini esta macro no evento “New” e salvei-a como modelo provas.dot. O usuário deve utilizar a opção “Arquivo” + “Novo” para poder escolher o modelo do documento.


Inicialmente a macro está apontando para um site na Internet: http://www.gdez.com.br mas você pode colocar os três arquivos acima em qualquer site e alterar o link.


 


Para inserir a macro entre no Word pressione ALT+F11, escolha o object “thisDocument”, cole a macro abaixo e salve o documento como um modelo do WORD:


 


Private Sub Document_New()


    Dim xmlhttp


    xmlhttp = Null


    Set xmlhttp = CreateObject("microsoft.XMLHTTP")


 


    ActiveDocument.Content = ""


    For i = 1 To 10


        Call xmlhttp.Open("POST", "http://www.gdez.com.br/barbiero/xmlhttp.asp", False)


        xmlhttp.Send


       


        ActiveDocument.Content = ActiveDocument.Content & xmlhttp.responseText


        ActiveDocument.Sections.Add


       


       


    Next


 


End Sub


 


 


 



Esta matéria foi postada originalmente no ASP4Developers por Marco Aurélio Barbiero (site), que na época era "Analista de Sistemas, trabalha na Receita Federal e desenvolve aplicativos em VB, ASP, Javascript, Notes e XML.
Colaborou algumas vezes com sites como o www.actionjackson.com". Hoje, vai saber...

0 comentários: