Planilha XML padrão Excel

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Planilha XML padrão Excel

Mensagem por clodoaldomonteiro »

Obrigado a todos pelas dicas.

Quintas, vc já até tinha me falado das suas soluções para XML, vou ver elas se encontro algo pra melhorar meu XMLês, hehe.

Consegui validar o XML, sem XSD, com as soluções raiz da MS usando "DOM (Document Object Model)" o método :parseError e mostrando mensagem na tela.

Código: Selecionar todos

 //Para consulta:
// https://learn.microsoft.com/pt-br/sql/relational-databases/sqlxml-annotated-xsd-schemas-xpath-queries/bulk-load-xml/xml-bulk-load-examples-sqlxml-4-0?view=sql-server-ver16
// https://pt.repairmsexcel.com/blog/corrigir-erros-de-xml#:~:text=Para%20corrigir%20este%20erro%20de,fa%C3%A7a%20uma%20verifica%C3%A7%C3%A3o%20para%20isso.

   ...
   ...

         objXml := CreateObject("MSXML2.DOMDocument.6.0")
         objXml:async := .f.
         objXml:load(mArqTemp)
            
         If objXml:parseError:errorCode != 0
            myErr := objXml:parseError
            msg := 'Erro ao validar temporário (XML).'
            msg += CRLF + 'Verifique se a pasta existe e se o arquivo está aberto por outra aplicação.'
            msg += CRLF + 'Arquivo Temp: ' + mArqTemp
            msg += CRLF + 'Messagem erro: ' + myErr:reason
            msg += CRLF + 'Line erro: '    + Str(myErr:Line)
            msg += CRLF + 'Line Pos erro: ' + Str(myErr:linepos)
            msg += CRLF + 'File Pos erro: ' + Str(myErr:filepos)
            msg += CRLF + 'Src Text erro: ' + myErr:srcText
            msg += CRLF + 'url erro: '     + myErr:url

            MsgError( msg )
               
            objXml := nil

            Return .f.
               
         Endif
            
         myErr := nil
         objXml := nil
   ...
   ...

Bom da MS é que tem tudo, as vezes até demais, e no meu caso, "MSXML2.DOMDocument.6.0" supriu todas as necessidades.

Abraços
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Ana Mitoooo
Usuário Nível 3
Usuário Nível 3
Mensagens: 118
Registrado em: 17 Out 2018 10:00
Localização: Sobradinho/DF

Planilha XML padrão Excel

Mensagem por Ana Mitoooo »

Código do meu post anterior com erros, agora corrigido, testado e aprovado

Código: Selecionar todos

#include "hbmxml.ch"
 
Static xml_sError__ := ''
Static xml_bError__ := .F.
 
/* ----------------------------------- */
/* Main()
/* ----------------------------------- */
Proc Main()

   SetMode( 32, 80 )

   cls

   ssheet_Create()

   // Verifica XML
   If xml_bError__
      hb_Alert( 'ERRO: ' + xml_sError__ )
   else
      hb_Alert( 'Arquivo XML Criado ' )
   End

   Return

/* ----------------------------------- */
/* Cria Planilha em XML
/* ----------------------------------- */
Proc ssheet_Create()
 
   Local i, n
   Local oXML
   Local hXML := hb_Hash()
 
   hXML[ "Cols" ] := 16
   hXML[ "Rows" ] := 10
 
   // Log erros XML
   mxmlSetErrorCallback( @ssheet_XmlError() )
 
   // Sem quebra de linha
   mxmlSetWrapMargin( 0 )
 
   // Manipulação XML
   oXml := mxmlLoadString( NIL, ssheet_XmlBase(), MXML_OPAQUE_CALLBACK )
 
   // Verifica XML
   If xml_bError__
      hb_Alert( 'ERRO: ' + xml_sError__ )
   End
 
   // Localiza TAG/Node
   hXML[ "Table" ] := mxmlFindElement( oXml, oXml, "Table", NIL, NIL, MXML_DESCEND )
   If Empty( hXML[ "Table" ] )
      hb_Alert( 'Erro: Tag ' + "Table" )
   Else
 
      // Formata Colunas
      For i := 1 To hXML[ "Cols" ]
         hXML[ 'Column' ] := mxmlNewElement( hXML[ "Table" ], 'Column' )
         mxmlElementSetAttr( hXML[ "Column" ], 'ss:Index', hb_NTos( i ) )
         mxmlElementSetAttr( hXML[ "Column" ], 'ss:AutoFitWidth', '0' )
         mxmlElementSetAttr( hXML[ "Column" ], 'ss:Width', '64' )
      Next
 
      // Linha Cabeçalho
      hXML[ 'Row' ] := mxmlNewElement( hXML[ "Table" ], 'Row' )
      mxmlElementSetAttr( hXML[ "Row" ], 'ss:AutoFitHeight', '0' )
      For i := 1 To hXML[ "Cols" ]
         hXML[ 'Cell' ] := mxmlNewElement( hXML[ "Row" ], 'Cell' )
         mxmlElementSetAttr( hXML[ "Cell" ], 'ss:StyleID', 'Header' )
         hXML[ 'Data' ] := mxmlNewElement( hXML[ "Cell" ], 'Data' )
         mxmlElementSetAttr( hXML[ "Data" ], 'ss:Type', 'String' )
         mxmlNewText( hXML[ 'Data' ], 0, StrZero( i, 9 ) )
      Next
 
      // Dados Tabela
      For i := 1 To hXML[ "Rows" ]
 
         hXML[ 'Row' ] := mxmlNewElement( hXML[ "Table" ], 'Row' )
         mxmlElementSetAttr( hXML[ "Row" ], 'ss:AutoFitHeight', '0' )
 
         For n := 1 To hXML[ "Cols" ]
           hXML[ 'Cell' ] := mxmlNewElement( hXML[ "Row" ], 'Cell' )
           hXML[ 'Data' ] := mxmlNewElement( hXML[ "Cell" ], 'Data' )
           mxmlElementSetAttr( hXML[ "Data" ], 'ss:Type', 'String' )
           mxmlNewText( hXML[ 'Data' ], 0, StrZero( i, 9 ) )
         Next
 
      Next
 
      // Ajusta dados da planilha (Linhas e Colunas)
      mxmlElementSetAttr( hXML[ "Table" ], 'ss:ExpandedColumnCount', hb_NToS( hXML[ "Cols" ] ) )
      mxmlElementSetAttr( hXML[ "Table" ], 'ss:ExpandedRowCount', hb_NToS( hXML[ "Rows" ] + 1 ) )
 
   Endif
 
   mxmlSaveFile( oXml, 'c:\temp\planilha.xls' )
   mxmlDelete( oXml )
 
   Return

/* ----------------------------------- */
/* Log erros XML
/* ----------------------------------- */
Static Proc ssheet_XmlError( s_Erro )
 
   xml_sError__ += s_Erro + hb_Eol()
   xml_bError__ := .T.
 
   Return
 
/* ----------------------------------- */
/* Xml_Base INTO <v>
/* ----------------------------------- */
#xcommand Xml_Base INTO <v> => #pragma __text|<v>+=%s;<v>:=""

/* ----------------------------------- */
/* XML Base para Planilha em XML
/* ----------------------------------- */
Func ssheet_XmlBase()
 
Local cXml
 
Xml_Base into cXml
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Author>Ana Mitoooo</Author>
  <Version>12.00</Version>
 </DocumentProperties>
 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>12600</WindowHeight>
  <WindowWidth>28755</WindowWidth>
  <WindowTopX>0</WindowTopX>
  <WindowTopY>75</WindowTopY>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
  <Style ss:ID="Header">
   <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
   <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
    ss:Bold="1"/>
  </Style>
  <Style ss:ID="ShortDate">
   <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
   <NumberFormat ss:Format="Short Date"/>
  </Style>
  <Style ss:ID="Standard">
   <NumberFormat ss:Format="Standard"/>
  </Style>
 </Styles>
 <Worksheet ss:Name="XML SpreadSheet">
  <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1" x:FullRows="1" ss:DefaultRowHeight="15">
  </Table>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <PageSetup>
    <Header x:Margin="0.31496062000000002"/>
    <Footer x:Margin="0.31496062000000002"/>
    <PageMargins x:Bottom="0.78740157499999996" x:Left="0.511811024" x:Right="0.511811024" x:Top="0.78740157499999996"/>
   </PageSetup>
   <Unsynced/>
   <Print>
    <ValidPrinterInfo/>
    <PaperSizeIndex>9</PaperSizeIndex>
    <HorizontalResolution>360</HorizontalResolution>
    <VerticalResolution>360</VerticalResolution>
   </Print>
   <Selected/>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
</Workbook>
EndText
 
cXml := StrTran( cXml, hb_Eol(), '' )
cXml := StrTran( cXml,  ' </', '</' )
cXml := StrTran( cXml,  '/> ', '/>' )
 
Return cXml
Anexos
ss_create.prg
(6.11 KiB) Baixado 48 vezes
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Planilha XML padrão Excel

Mensagem por clodoaldomonteiro »

Ana Mitoooo escreveu:Código do meu post anterior com erros, agora corrigido, testado e aprovado
Muito bom seu código, vou estudar ele pra ver se ajusto no meu, e até incluir Cabeçalho e Rodapé da planilha.

Grato pela ajuda.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
Wanderlei
Usuário Nível 3
Usuário Nível 3
Mensagens: 196
Registrado em: 25 Jan 2008 13:19
Localização: Goiânia - GO

Planilha XML padrão Excel

Mensagem por Wanderlei »

Bom dia Clodoaldo,
no seu exemplo faltou essa função: xmlWriteRow
Tem como postar ela aqui?
Wanderlei Cardoso
Analista / Programador
XHarbour + GtWvW + FiveWin + HwGui + Firebird
Skype: cwanderlei
cwanderlei@yahoo.com.br
(62)98171-3059 - whatsapp

Imagem
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Planilha XML padrão Excel

Mensagem por clodoaldomonteiro »

Wanderlei escreveu:Bom dia Clodoaldo,
no seu exemplo faltou essa função: xmlWriteRow
Tem como postar ela aqui?
Está na segunda postagem das funções, mas segue ela aqui:

Código: Selecionar todos

   /////////////////////////////////////////////////////////////////////////////
   //Para Cell com Formula, usa-se ss:Formula.
   // - Ex.: col D [= A + B - C]. Levanta-se a array RC[x], onde seria o valor da posição de D - a posição da col a ser usada.
   // - Explicando RC[] (R = Row e C = Col)
   // - Ficando: < ... ss:Formula="=RC[-4]+RC[-3]-RC[-2]"><Data ...
FUNCTION xmlWriteRow(nHandle, aTabela )
   LOCAL mRow, i, x

   For i := 1 TO Len(aTabela)
      mRow := [   <Row ss:AutoFitHeight="0">] + CRLF

      For x := 1 To Len(aTabela[i])

         If Valtype(aTabela[i, x]) = 'N'
            mRow += [    <Cell ss:StyleID="ValorContabil"><Data ss:Type="Number">] + LTrim(Str(aTabela[i, x], 11,2)) + [</Data></Cell>] + CRLF

         ElseIf Valtype(aTabela[i, x]) = 'A'
            If aTabela[i, x, 1] = 'Saldo'
               mRow += [    <Cell ss:StyleID="CellSaldo"><Data ss:Type="Number">] + LTrim(Str(aTabela[i, x, 2], 11,2)) + [</Data></Cell>] + CRLF

            ElseIf aTabela[i, x, 1] = 'Total'
               mRow += [    <Cell ss:StyleID="CellTotal"><Data ss:Type="Number">] + LTrim(Str(aTabela[i, x, 2], 11,2)) + [</Data></Cell>] + CRLF

            Else
               mRow += [    <Cell ss:StyleID="ValorContabil"><Data ss:Type="Number">] + LTrim(Str(aTabela[i, x], 11,2)) + [</Data></Cell>] + CRLF

            Endif

         ElseIf Valtype(aTabela[i, x]) = 'H'
            mRow += [    <Cell ss:StyleID="ValorContabil" ss:Formula="] + aTabela[i, x]["Formula"] +["><Data ss:Type="Number">] + LTrim(Str(aTabela[i, x]["Number"], 11,2)) + [</Data></Cell>] + CRLF

         Else
            mRow += [    <Cell><Data ss:Type="String" x:Ticked="1">] + xmlAjustaString( aTabela[i, x] ) + [</Data></Cell>] + CRLF

         Endif
      Next

      mRow += [   </Row>] + CRLF

      FWrite(nHandle, mRow, Len(mRow))

   Next nI

   RETURN nil

Abraços.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Planilha XML padrão Excel

Mensagem por clodoaldomonteiro »

Para ajustar o XML, a fim de incluir os botões de filtro na área da tabela, bas acrescentar a informação abaixo:

Código: Selecionar todos

//xBase
   mEof += [  <AutoFilter x:Range="R3C1:R]+ LTrim(Str(nRFilter)) +[C]+ LTrim(Str(nCFilter)) +["] + CRLF
   mEof += [   xmlns="urn:schemas-microsoft-com:office:excel">] + CRLF
   mEof += [  </AutoFilter>] + CRLF

//no XMI
  <AutoFilter x:Range="R3C1:R97C35"
   xmlns="urn:schemas-microsoft-com:office:excel">
  </AutoFilter>
A Tag "AutoFilter" vai ter a propriedade "Ranger" setada com o início e fim da área de Filtro em: "R3C1:R97C35", onde R = Row e C - Col (Linha e Coluna inicial x Linha e Coluna Final).

Abraços.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Responder