Notifications
Clear all

Importar xml, programaticamente ou não

7 Posts
4 Usuários
0 Reactions
3,816 Visualizações
gamboaisrael
(@gamboaisrael)
Posts: 68
Trusted Member
Topic starter
 

Prezad@s,

Estou tentando importar um arquivo xml pro excel 2010 e ando tendo problemas e, consequentemente, muitas dúvidas.

A primeira situação me ocorreu quando tentei importar o arquivo xml (Second.xml) através da via "convencional" do excel (Menu Abrir>Second.xml>Como lista xml ou através da guia Dados>Obter dados de outras fontes>XML). Os dados do arquivo citado, quando importados, ficam desconfigurados, formando uma espécie de "escada" pulando uma linha a cada nova informação. Como não tenho o hábito de trabalhar com xml, comecei a pesquisar na net e encontrei, no site http://examples.oreilly.com/9780596002527/, um modelo de arquivo xml (o arquivo First.xml) que quando importado da mesma maneira que o outro arquivo fica com a configuração exatamente da maneira que eu quero. Contudo, não consegui fazer com que o arquivo Second.xml fique como o First.xml após a importação. Uma solução aqui neste ponto, apesar de não ser via VBA, já será muito útil.

A segunda situação me ocorreu quando resolvi tentar obter a solução via VBA. Encontrei no site do Benzadeus (http://www.ambienteoffice.com.br/officevba/importar_dados_de_arquivos_xml/) um código para a importação de dados xml. Porém, como ele mesmo já explicou aqui no fórum, em outro tópico, o código dele é direcionado para a obtenção de dados localizados nos atributos de dados xml e não em dados que estiverem entre nós. Ainda assim, tentei adaptar o código, porém sempre me é retornado um erro quando a função ObterNó é chamada e começa a rodar (na linha Set objNodes = xmlDOM.SelectNodes(strNó)). O erro é o: Erro em tempo de execução nº 424 - O Objeto é obrigatório. A partir deste ponto não tenho conseguido evoluir.

Qualquer ajuda será de grande valia!

Os arquivos First.xml e Second.Xml estão compactados no arquivo Planilhando_xml

O código do Benzadeus com a minha tentativa de adaptar, encontra-se abaixo:

Private Sub teste()
    
    Dim strArquivo As String
    Dim ws As Worksheet
    Dim c As Long
    
    'Altere o valor abaixo para o arquivo que deseja abrir.
    strArquivo = "C:Usersisrael.gamboaDesktopsecond.xml"
    
    Set ws = ActiveSheet
    
    'O objeto DOMDocument deve ser usado para manipular dados XML:
    Set xmlDOM = CreateObject("MSXML2.DOMDocument")
    xmlDOM.async = False
    'Carrega o arquivo especificado par ao objeto DOMDocument:
    xmlDOM.Load strArquivo
    
    With ws
        'Apaga conteúdo da Planilha, cria e formata cabeçalho:
        .Cells.Delete
        .Range("A1:AN1") = Array("CodMsg", "NumCtrlIF", "CNPJEntRespons", "QtdCed", "NumRefBCCOR", "SitOpCOR", "TpCedlCOR", "DtEms", "DtVenc", "NumCedlCredRuralIF", "TpInstntoCred", "VlrTotOp", "TpCatgEmit", "TpPessoaEmit", "CNPJ_CPFEmit", "TpFnteRec", "CodMunic", "CodEmpnmnt", "CodSistProdc", "VlrParclCred", "VlrParclRecProprio", "PercJurosEncargoFinanc", "CodSTNCOR", "Area", "QtdPrvProdc", "IdentcSafra", "TpPessoaPropt", "CNPJBase_CPFPropt", "TpGarEmpnmnt", "VlrReceitaBrutEsprdEmpnmnt", "NumParcl", "DtPrvPgto", "VlrPrincipalParcl", "IdentcGleba LatPonto", "LongPonto", "CNPJBaseIFSubemprt", "NumRefBCCORSubemprt", "DtHrBC", "DtMovto")
        .Rows(1).Font.Bold = True
        
        'Importa informações de arquivo XML:
        'Importa CodMsg
        c = 1
        ObterNó "/SISMSG/COR0003R1/CodMsg", .Cells(2, c)
        'Importa NumCtrlIF
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/NumCtrlIF", .Cells(2, c)
        'Importa CNPJEntRespons
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/CNPJEntRespons", .Cells(2, c)
        'Importa QtdCed
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/QtdCed", .Cells(2, c)
        'Importa NumRefBCCOR
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/NumRefBCCOR", .Cells(2, c)
        'Importa SitOpCOR
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/SitOpCOR", .Cells(2, c)
        'Importa TpCedlCOR
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/TpCedlCOR", .Cells(2, c)
        'Importa DtEms
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/DtEms", .Cells(2, c)
        'Importa DtVenc
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/DtVenc", .Cells(2, c)
        'Importa NumCedlCredRuralIF
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/NumCedlCredRuralIF", .Cells(2, c)
        'Importa TpInstntoCred
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/TpInstntoCred", .Cells(2, c)
        'Importa VlrTotOp
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/VlrTotOp", .Cells(2, c)
        'Importa TpCatgEmit
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/TpCatgEmit", .Cells(2, c)
        'Importa TpPessoaEmit
        c = c + 1
        ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/Grupo_COR0003R1_Emit/TpPessoaEmit", .Cells(2, c)

        '...Continua a importação...
      
                
        .Columns.AutoFit
    End With

    Set xmlDOM = Nothing
End Sub

Private Function ObterNó(strNó As String, rng As Range)
    Dim objNodes As IXMLDOMNodeList
    Dim objNode As IXMLDOMNode
    Dim FileName As String
    Dim r As Long
    Dim c As Long
    
    Set objNodes = xmlDOM.SelectNodes(strNó)

    For Each objNode In objNodes
        If objNodes.Length > 0 Then
            rng.Offset(r) = objNode.Text
            r = r + 1
        Else
            Exit For
        End If
    Next objNode
End Function

Atenciosamente,

gamboaisrael .'.

 
Postado : 27/12/2012 9:32 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Eu não entendi, eu importei indo em [Dados --> De Outras Fontes --> Da Importação de dados XML], selecionei o XML...no seu caso as colunas E em diante para você estão desfiguradas?

Leia também
http://support.microsoft.com/kb/305795/pt
http://www.tomasvasquez.com.br/artigos/ ... ndo_u.html

Att

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 27/12/2012 9:52 am
gamboaisrael
(@gamboaisrael)
Posts: 68
Trusted Member
Topic starter
 

Isso mesmo, Alexandre.

Eu gostaria que após a importação, os dados ficassem dispostos da mesma maneira que ficam os dados do arquivo First.xml, ou seja, todos na mesma linha, sem a formação dessa "escada" após a coluna "E".

Quanto aos sites indicados, eu agradeço, mas já li estes e muitos outros. Contudo não encontrei neles o que eu procuro.

Grato pela atenção,

gamboaisrael .'.

 
Postado : 27/12/2012 10:03 am
(@luiz-elias)
Posts: 26
Eminent Member
 

gamboaisrael,

Bom dia!

Veja se é deste jeito que você precisa!

Utilizo o Excel 2007:
Primeiro em mapiei o código fonte do xml na planilha:

Desenvolvedor > Código Fonte > Mapas XML... > Adicionar > Selecione o XML Second > Selecione o MAPA e dê OK
No lado direito será exibido o código fonte do XML. Clique no primeiro campo do mapa (SISMSG), segure e arraste para célula A1.

Em seguida importei o xml:
Os campos serão mapaeados na planilha, cada qual em sua devida coluna. Agora importe o XML Second em: Desenvolvedor > Importar > Abra o XML

Caso o campo desenvolvedor do seu Excel não esteja habilitado será necessário habilitá-lo:

1.Abra o MS Office Excel 2010;
2.Clique na guia ARQUIVO;
3.No menu lateral (Esquerda) clique em AJUDA;
4.No menu central clique em OPÇÕES;
5.Dentro da janela Opções do Excel, no meu lateral (Esquerda) clique em PERSONALIZAR FAIXA DE OPÇÕES;
6.No menu central serão listadas opções onde você pode habilitar ou desabilitar. No grupo de opções mais a direita procure a opção DESENVOLVEDOR e marque caixa de seleção localizada a esquerda desta opção.
7.Clique no botão OK para fechar a janela e aba DESENVOLVEDOR já estará habilitada.

Espero que tenha ajudado!

Qualquer coisa, é só falar.

 
Postado : 28/12/2012 6:10 am
gamboaisrael
(@gamboaisrael)
Posts: 68
Trusted Member
Topic starter
 

Bom dia, Luiz Elias.

Muito obrigado pela ajuda. Contudo, após seguir suas orientações, meu problema persiste.

O que eu desejo é que as células a partir da coluna "E" não fique como estão no exemplo que você enviou. Por exemplo, a célula E2 está preenchida, porém a célula F2 está vazia e a celula F3 está preenchida, formando uma "escada". Eu gostaria que os dados ficassem organizados como estão no intervalo: A2:E2.

Ainda assim, agradeço sua disposição em ajudar!

Atenciosamente,

gamboaisrael .'.

 
Postado : 28/12/2012 6:38 am
gamboaisrael
(@gamboaisrael)
Posts: 68
Trusted Member
Topic starter
 

Meus amigos, continuo procurando uma solução para o problema apontado aqui neste tópico.

Serei muito grato a qualquer ajuda.

Atenciosamente,

gamboaisrael .'.

 
Postado : 03/01/2013 8:19 am
(@cleitonmedrado)
Posts: 6
Active Member
 

bom dia gamboaisrael,
para resolver seu problema com "(na linha Set objNodes = xmlDOM.SelectNodes(strNó)). O erro é o: Erro em tempo de execução nº 424 - O Objeto é obrigatório."
basta você declarar a seguinte linha Dim xmlDOM As DOMDocument como variável global pois você esta chamando um objeto xmlDOM e ele não foi declarado.
isso resolve o problema.

ex:
Dim xmlDOM As DOMDocument '<<<<<<<<<<<<<< declaração de variável global.

Private Sub teste()

Dim strArquivo As String
Dim ws As Worksheet
Dim c As Long

'Altere o valor abaixo para o arquivo que deseja abrir.
strArquivo = "C:Usersisrael.gamboaDesktopsecond.xml" ' depois segue o código normalmente......

Boa sorte.

 
Postado : 08/07/2016 7:33 am