Página 2 de 2
Planilha XML padrão Excel
Enviado: 14 Set 2023 13:01
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
Planilha XML padrão Excel
Enviado: 15 Set 2023 06:46
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
Planilha XML padrão Excel
Enviado: 15 Set 2023 09:17
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.
Planilha XML padrão Excel
Enviado: 15 Set 2023 09:23
por Wanderlei
Bom dia Clodoaldo,
no seu exemplo faltou essa função: xmlWriteRow
Tem como postar ela aqui?
Planilha XML padrão Excel
Enviado: 15 Set 2023 15:29
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.
Planilha XML padrão Excel
Enviado: 18 Set 2023 09:49
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.