forked from dan-atilio/zExcelXML
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzExcelXML.prw
705 lines (596 loc) · 19.9 KB
/
zExcelXML.prw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
//Bibliotecas
#Include "Protheus.ch"
/*/{Protheus.doc} zExcelXML
Classe para manipular e gerar arquivos XML do Excel
@author Atilio
@since 28/05/2015
@version 1.0
@example
//... Começo do Exemplo ...
oExcelXml := zExcelXML():New(.F.) //Instância o Objeto
oExcelXml:SetOrigem("\xmls\teste_sb1.xml") //Indica o caminho do arquivo Origem (que será aberto e clonado)
oExcelXml:SetDestino(GetTempPath()+"yTst02.xml") //Indica o caminho do arquivo Destino (que será gerado)
oExcelXML:CopyTo("C:\TOTVS\copia.xml") //Adiciona caminho de cópia que será gerado ao montar o arquivo
oExcelXML:AddExpression("#SB1-B1_COD", SB1->B1_COD) //Adiciona expressão que será substituída
oExcelXML:AddExpression("#SB1-B1_DESC", SB1->B1_DESC) //Adiciona expressão que será substituída
oExcelXML:AddExpression("#SB1-B1_TIPO", SB1->B1_TIPO) //Adiciona expressão que será substituída
oExcelXML:AddTabExcel("#TABELA_SB1", "SB1") //Adiciona tabela dinâmica
oExcelXML:MountFile() //Monta o arquivo
oExcelXML:ViewSO() //Abre o .xml conforme configuração do Sistema Operacional,
// ou seja, se tiver Linux + LibreOffice ele irá abrir
//oExcelXML:View() //Utilizar apenas se não for utilizado o método ViewSO
// pois dessa forma é forçado a abrir pelo Excel
oExcelXml:Destroy(.F.) //Destrói os atributos do objeto
oExcelXml:ShowMessage("") //Testa demonstração de mensagem em branco
//... Fim do Exemplo ...
@see http://terminaldeinformacao.com/advpl/
/*/
Class zExcelXML
//Atributos
Data cArqOrig
Data cArqDest
Data aExpre
Data aTabelas
Data aAreas
Data aConOrig
Data aConDest
Data cArqCopy
Data lShowMsg
//Métodos
Method New() CONSTRUCTOR
Method SetOrigem()
Method SetDestino()
Method AddExpression()
Method AddTabExcel()
Method MountFile()
Method CopyTo()
Method View()
Method ViewSO()
Method Destroy()
Method ShowMessage()
Method RestAreaExcel()
EndClass
/*/{Protheus.doc} New
Construtor da classe zExcelXML
@author Atilio
@since 28/05/2015
@version 1.0
@param lShowAlerts, Lógico, Define se será mostrado alertas ou não nas chamadas dos métodos
@example
oExcelXml := zExcelXML:New(.T.)
/*/
Method New(lShowAlerts) Class zExcelXML
Default lShowAlerts := .F.
//Definindo os atributos
::cArqOrig := ""
::cArqDest := ""
::aTabelas := {}
::aAreas := {}
::aExpre := {}
::aConOrig := {}
::aConDest := {}
::cArqCopy := ""
::lShowMsg := lShowAlerts
Return Self
/*/{Protheus.doc} SetOrigem
Define o arquivo xml de origem que será lido
@author Atilio
@since 28/05/2015
@version 1.0
@param cOrigem, Caracter, Arquivo origem a ser lido
@return lRet, Retorna se foi possível setar o arquivo de Origem
@example
oExcelXml:SetOrigem("\xmls\teste_1.xml")
/*/
Method SetOrigem(cOrigem) Class zExcelXML
Local lRet := .T.
Local cMensagem := ""
//Se não for arquivo XML
If SubStr(cOrigem, Len(Alltrim(cOrigem))-3, Len(Alltrim(cOrigem))) != ".xml"
lRet := .F.
cMensagem := "[zExcelXML][004] Arquivo de ORIGEM com extensão inválida! "+;
"Verificar! - SetOrigem('"+cOrigem+"') - "+dToC(dDataBase)+" "+Time()
//Se o arquivo de origem existir, atualiza atributo
ElseIf File(cOrigem)
//Se no xml, encontrar a definição que é XML de Planilhas do Excel, arquivo OK
If '<?mso-application progid="Excel.Sheet"?>' $ MemoRead(cOrigem)
::cArqOrig := cOrigem
//Senão, retorna erro
Else
lRet := .F.
cMensagem := "[zExcelXML][002] Arquivo de ORIGEM inválido! "+;
"Verificar! - SetOrigem('"+cOrigem+"') - "+dToC(dDataBase)+" "+Time()
EndIf
//Senão, retorna erro
Else
lRet := .F.
cMensagem := "[zExcelXML][001] Arquivo de ORIGEM não foi encontrado! "+;
"Verificar! - SetOrigem('"+cOrigem+"') - "+dToC(dDataBase)+" "+Time()
EndIf
//Mostrando mensagem caso tenha
Self:ShowMessage(cMensagem)
Return lRet
/*/{Protheus.doc} SetDestino
Define o arquivo xml de destino que será gerado
@author Atilio
@since 23/06/2015
@version 1.0
@param cDestino, Caracter, Arquivo que será gerado
@param lSobrepoe, Lógico, Define se o arquivo será sobreposto (se já existir)
@return lRet, Retorna se foi possível setar o arquivo de Destino
@example
oExcelXml:SetDestino("C:\Teste\teste.xml")
/*/
Method SetDestino(cDestino, lSobrepoe) Class zExcelXML
Local lRet := .T.
Local cMensagem := ""
Default lSobrepoe := .T.
//Se não for arquivo XML
If SubStr(cDestino, Len(Alltrim(cDestino))-3, Len(Alltrim(cDestino))) != ".xml"
lRet := .F.
cMensagem := "[zExcelXML][005] Arquivo de DESTINO com extensão inválida! "+;
"Verificar! - SetDestino('"+cDestino+"') - "+dToC(dDataBase)+" "+Time()
//Se não tiver em branco
ElseIf !Empty(cDestino)
::cArqDest := cDestino
//Se o arquivo de Destino existir, atualiza atributo
If File(cDestino)
cMensagem := "[zExcelXML][003] Arquivo de Destino já existe! "+;
"Verificar! - SetDestino('"+cDestino+"') - "+dToC(dDataBase)+" "+Time()
//Se for para sobrepor, exclui o arquivo destino
If lSobrepoe
FErase(cDestino)
EndIf
EndIf
EndIf
//Mostrando mensagem caso tenha
Self:ShowMessage(cMensagem)
Return lRet
/*/{Protheus.doc} AddExpression
Adiciona uma expressão para ser substituída dentro do arquivo
@author Atilio
@since 29/07/2015
@version 1.0
@param cExpressao, Caracter, Expressão que será buscada dentro do arquivo xml
@param xConteudo, Variável, Conteúdo que irá substituir a expressão encontrada
@example
oExcelXML:AddExpression("#SB1-B1_COD", "Ok ok...")
/*/
Method AddExpression(cExpressao, xConteudo) Class zExcelXML
Local cMensagem := ""
//Se tiver expressão
If !Empty(cExpressao) .And. !("TABELA" $ cExpressao)
aAdd(::aExpre, {cExpressao, xConteudo})
//Senão
Else
cMensagem := "[zExcelXML][013] Expressão em branco ou inválida não pode ser adicionada! "+;
"Verificar! - AddExpression() - "+dToC(dDataBase)+" "+Time()+"... cExpressao: "+cExpressao+";"
EndIf
//Mostrando mensagem caso tenha
Self:ShowMessage(cMensagem)
Return Nil
/*/{Protheus.doc} AddTabExcel
Adiciona tabela que será substituída no arquivo xml
@author Atilio
@since 29/07/2015
@version 1.0
@param cNomeTab, Caracter, Nome da Tabela que será procurada no arquivo xml
@param cAliasTab, Caracter, Alias do Protheus que irá substituir os dados da tabela
@example
oExcelXML:AddTabExcel("#TABELA_SC6", "SC6")
/*/
Method AddTabExcel(cNomeTab, cAliasTab) Class zExcelXML
Local cMensagem := ""
//Se tiver expressão
If !Empty(cNomeTab) .And. !((cAliasTab)->(EoF()))
aAdd(::aTabelas, {cNomeTab, cAliasTab})
aAdd(::aAreas, {cAliasTab, GetArea(cAliasTab)})
//Senão
Else
cMensagem := "[zExcelXML][014] Tabela em branco não pode ser adicionada! "+;
"Verificar! - AddTabExcel() - "+dToC(dDataBase)+" "+Time()
EndIf
//Mostrando mensagem caso tenha
Self:ShowMessage(cMensagem)
Return Nil
/*/{Protheus.doc} MountFile
Método que monta o arquivo para geração e gera uma cópia se tiver
@author Atilio
@since 29/07/2015
@version 1.0
@example
oExcelXML:MountFile()
/*/
Method MountFile() Class zExcelXML
Local aArea := GetArea()
Local nAtual := 0
Local cContAux := ""
Local nExpre := 0
Local nTabel := 0
Local nHdl := 0
Local cMensagem := ""
Local lPula := .F.
Local aAux := {}
Local nLinExpand := 0
//Abre o arquivo para uso
Ft_FUse(::cArqOrig)
//Indo ao topo e percorrendo os registros para gerar os dados originais
Ft_FGoTop()
While !Ft_FEoF()
aAdd(::aConOrig, Ft_FReadLn())
Ft_FSkip()
EndDo
Ft_FUse()
//Agora será gerado o conteúdo destino (substituindo as expressões)
For nAtual := 1 To Len(::aConOrig)
cContAux := ::aConOrig[nAtual]
lPula := Iif(Chr(13)+Chr(10) $ cContAux, .T., .F.)
cMaskAux := ""
//Procurando expressões e substituindo
For nExpre := 1 To Len(::aExpre)
//Se encontrou a expressão, substitui a expressão pelo conteúdo
If ::aExpre[nExpre][1] $ cContAux
cTipoCamp1 := ValType(::aExpre[nExpre][2])
//Se for Data
If cTipoCamp1 == 'D'
::aExpre[nExpre][2] := dToC(xConteud)
//Senão se for numérico
ElseIf cTipoCamp1 == 'N'
cContAux := StrTran(cContAux, 'Type="String"', 'Type="Number"')
//Se a máscara tiver em branco
If Empty(cMaskAux)
::aExpre[nExpre][2] := cValToChar(::aExpre[nExpre][2])
//Senão, transforma o campo
Else
::aExpre[nExpre][2] := Alltrim(Transform(::aExpre[nExpre][2], cMaskAux))
EndIf
//Senão se for caracter
ElseIf cTipoCamp1 == 'C'
//Se tiver máscara
If !Empty(cMaskAux)
::aExpre[nExpre][2] := Alltrim(Transform(::aExpre[nExpre][2], cMaskAux))
EndIf
//Senão
Else
::aExpre[nExpre][2] := cValToChar(::aExpre[nExpre][2])
EndIf
cContAux := StrTran(cContAux, ::aExpre[nExpre][1], ::aExpre[nExpre][2])
EndIf
Next
//Pegando a linha que define a quantidade de linhas da tabela
If "expandedrowcount" $ Lower(cContAux)
nLinExpand := nAtual
EndIf
//Pegando linha ativa e deixando como 1
If "activerow" $ Lower(cContAux)
cTagAux := SubStr(cContAux, At('<ActiveRow>', cContAux), Len(cContAux))
cTagAux := SubStr(cContAux, 1, At('</ActiveRow>', cContAux)-1)
cContAux := StrTran(cContAux, cTagAux, "<ActiveRow>1")
EndIf
//Pegando coluna ativa e deixando como 1
If "activecol" $ Lower(cContAux)
cTagAux := SubStr(cContAux, At('<ActiveCol>', cContAux), Len(cContAux))
cTagAux := SubStr(cContAux, 1, At('</ActiveCol>', cContAux)-1)
cContAux := StrTran(cContAux, cTagAux, "<ActiveCol>1")
EndIf
//Adicionando no array de destino
aAdd(aAux, cContAux + Iif(lPula, "", Chr(13)+Chr(10)))
Next
//Agora será gerado o conteúdo destino (substituindo as tabelas / queries)
lTabEnc := .F.
cNomTab := ""
cAliTab := ""
cCampoNov := ""
nPosIni := 0
nPosCam := 0
nPosAux := 0
nPosFin := 0
aTabAux := {}
nAMais := 0
For nAtual := 1 To Len(aAux)
//Procurando expressões e substituindo
For nTabel := 1 To Len(::aTabelas)
If ::aTabelas[nTabel][1] $ aAux[nAtual] .And. !lTabEnc
lTabEnc := .T.
cNomTab := ::aTabelas[nTabel][1]
cAliTab := ::aTabelas[nTabel][2]
nPosIni := nAtual
nPosCam := 0
nPosFin := 0
EndIf
//Encontrando o primeiro campo
If "%"+cAliTab+"-" $ aAux[nAtual] .And. nPosCam == 0 .And. cAliTab == ::aTabelas[nTabel][2]
aTabAux := {}
//Procurando a seção ROW para identificar a linha inicial
For nPosCam := nAtual To 1 Step -1
If "<ROW" $ Upper(aAux[nPosCam])
Exit
EndIf
Next
//Procurando o fim da seção ROW para copiar as linhas que serão copiadas
For nPosAux := nPosCam To Len(aAux)
aAdd(aTabAux, aAux[nPosAux])
If "</ROW>" $ Upper(aAux[nPosAux])
Exit
EndIf
Next
EndIf
//Procurando o final da tabela
If cNomTab+"_FIM" $ aAux[nAtual] .And. cAliTab == ::aTabelas[nTabel][2]
lTabEnc := .F.
nPosFin := nAtual
nAtual := nPosIni
EndIf
Next
//Se tiver final, acontecerá o processamento
If nPosFin != 0 .And. nPosCam != 0 .And. nPosCam < nPosFin
//Substitui o início da tabela
aAux[nPosIni] := StrTran(aAux[nPosIni], cNomTab, "")
lFirst := .T.
nContAux := 1
//Enquanto a tabela tiver registros
While ! (cAliTab)->(EoF())
//Adicionando nova linha
If !lFirst
For nTst := 0 To Len(aTabAux)-1
aSize(aAux, Len(aAux)+1)
aIns(aAux, nPosCam+nTst)
aAux[nPosCam+nTst] := aTabAux[nTst+1]
Next
nAMais++
nPosFin += Len(aTabAux)
nContAux++
EndIf
For nPosAux := nPosCam To nPosCam+Len(aTabAux)
//Se tiver campo
If "%"+cAliTab+"-" $ aAux[nPosAux]
//Verificando se veio de query ou temporária
lCampoQuery := .F.
If "QRY" $ cAliTab .Or. "SQL" $ cAliTab .Or. "TMP" $ cAliTab .Or. Len(cAliTab) >= 4
lCampoQuery := .T.
EndIf
//Pegando dados do campo
cCampoNov := SubStr(aAux[nPosAux], At("%", aAux[nPosAux])+1, Len(aAux[nPosAux]))
cCampoNov := SubStr(cCampoNov, 1, RAt("%", cCampoNov)-1)
cCampoNov := StrTran(cCampoNov, cAliTab+"-", "")
cMaskAux := Iif(lCampoQuery, fMascara(cCampoNov), PesqPict(cAliTab, cCampoNov))
xConteud := &(cAliTab+"->"+cCampoNov+"")
cTipoCamp := &("ValType("+cAliTab+"->"+cCampoNov+")")
//Se for Data
If cTipoCamp == 'D'
xConteud := dToC(xConteud)
//Senão se for numérico
ElseIf cTipoCamp == 'N'
aAux[nPosAux] := StrTran(aAux[nPosAux], 'Type="String"', 'Type="Number"')
//Se a máscara tiver em branco
If Empty(cMaskAux)
xConteud := cValToChar(xConteud)
//Senão, transforma o campo
Else
xConteud := Alltrim(Transform(xConteud, cMaskAux))
EndIf
//Senão se for caracter
ElseIf cTipoCamp == 'C'
//Se tiver máscara
If !Empty(cMaskAux)
xConteud := Alltrim(Transform(xConteud, cMaskAux))
EndIf
//Senão
Else
xConteud := cValToChar(xConteud)
EndIf
aAux[nPosAux] := StrTran(aAux[nPosAux], "%"+cAliTab+"-"+cCampoNov+"%", xConteud)
EndIf
Next
nPosCam := nPosCam+Len(aTabAux)
lFirst := .F.
(cAliTab)->(DbSkip())
EndDo
//Substitui o final da tabela
aAux[nPosFin] := StrTran(aAux[nPosFin], cNomTab+"_FIM", "")
//Somente sairá do laço, após encontrar o <row>
nAtual := nPosFin + 1
While ! ("</ROW>" $ Upper(aAux[nAtual]))
nAtual++
EndDo
//Agora percorre as linhas abaixo e altera o conteúdo dos índices
For nAltLin := nAtual To Len(aAux)
//Se encontrar linha de índice
If "row ss:index=" $ Lower(aAux[nAltLin])
cIndexExc := SubStr(Lower(aAux[nAltLin]), At('row ss:index=', Lower(aAux[nAltLin])), Len(aAux[nAltLin]))
cIndexExc := StrTran(cIndexExc, 'row ss:index="', 'row ss:index=')
cIndexExc := SubStr(cIndexExc, 1, At('"', cIndexExc)-1)
nOrigInd := Val(SubStr(cIndexExc, At('=', cIndexExc)+1, Len(cIndexExc)))
aAux[nAltLin] := StrTran(aAux[nAltLin], 'Row ss:Index="'+cValToChar(nOrigInd)+'"', 'Row ss:Index="'+cValToChar(nOrigInd+nAMais)+'"')
EndIf
Next
//Zerando dados da tabela
lTabEnc := .F.
cNomTab := ""
cAliTab := ""
nPosIni := 0
nPosCam := 0
nPosFin := 0
EndIf
Next
//Se tiver linha de expandido, atualiza para não houver falha na geração do Excel
If nLinExpand > 0
cExpand := SubStr(aAux[nLinExpand], At('ExpandedRowCount', aAux[nLinExpand]), Len(aAux[nLinExpand]))
cExpand := StrTran(cExpand, 'ExpandedRowCount="', 'ExpandedRowCount=')
cExpand := SubStr(cExpand, 1, At('"', cExpand)-1)
nOrigem := Val(SubStr(cExpand, At('=', cExpand)+1, Len(cExpand)))
aAux[nLinExpand] := StrTran(aAux[nLinExpand], 'ExpandedRowCount="'+cValToChar(nOrigem)+'"', 'ExpandedRowCount="'+cValToChar(nOrigem+nAMais)+'"')
EndIf
//Clonando o conteúdo
::aConDest := aClone(aAux)
//Gerando agora o arquivo destino
FErase(::cArqDest)
nHdl := FCreate(::cArqDest)
//Gerando o conteúdo
For nAtual := 1 To Len(::aConDest)
fWrite(nHdl, ::aConDest[nAtual])
Next
FClose(nHdl)
//Se tiver que gerar cópia
If !Empty(::cArqCopy)
__CopyFile(::cArqDest, ::cArqCopy)
EndIf
//Mostrando mensagem
cMensagem := "[zExcelXML][015] Processamento finalizado! "+;
"Verificar! - MountFile() - "+dToC(dDataBase)+" "+Time()
Self:ShowMessage(cMensagem)
RestArea(aArea)
Return Nil
/*/{Protheus.doc} CopyTo
Define o nome do arquivo de cópia que será gerado no MountFile
@author Atilio
@since 23/06/2015
@version 1.0
@example oExcelXml:CopyTo("C:\testes\novo.xml")
/*/
Method CopyTo(cCopia) Class zExcelXML
Local cMensagem := ""
Local nRet := 0
Default cCopia := ""
//Se tiver em branco a cópia
If Empty(cCopia)
cMensagem := "[zExcelXML][011] Caminho do arquivo em cópia está em branco! "+;
"Verificar! - View() - "+dToC(dDataBase)+" "+Time()
Else
::cArqCopy := cCopia
EndIf
//Mostrando mensagem caso tenha
Self:ShowMessage(cMensagem)
Return Nil
/*/{Protheus.doc} View
Abre o arquivo XML utilizando a classe padrão do Protheus
@author Atilio
@since 23/06/2015
@version 1.0
@example oExcelXml:View()
/*/
Method View() Class zExcelXML
Local cMensagem := ""
Local nRet := 0
Local cArquivo := ::cArqDest
Local oExcelApp
//Somente se tiver registro
If Len(::aConDest) > 0
//Abrindo o excel e abrindo o arquivo xml
oExcelApp := MsExcel():New() //Abre uma nova conexão com Excel
oExcelApp:WorkBooks:Open(cArquivo) //Abre uma planilha
oExcelApp:SetVisible(.T.) //Visualiza a planilha
oExcelApp:Destroy() //Encerra o processo do gerenciador de tarefas
//Senão, mostra mensagem de erro
Else
cMensagem := "[zExcelXML][010] Arquivo não pode ser aberto, utilize o método MountFile() para montar os dados! "+;
"Verificar! - View() - "+dToC(dDataBase)+" "+Time()
EndIf
//Mostrando mensagem caso tenha
Self:ShowMessage(cMensagem)
Return Nil
/*/{Protheus.doc} ViewSO
Abre o arquivo XML conforme preferências do Sistema Operacional
@author Atilio
@since 23/06/2015
@version 1.0
@example oExcelXml:ViewSO()
/*/
Method ViewSO() Class zExcelXML
Local cMensagem := ""
Local nRet := 0
Local cAbsoluto := ::cArqDest
Local cDiretorio := SubStr(cAbsoluto, 1, RAt("\",cAbsoluto))
Local cArquivo := SubStr(cAbsoluto, RAt("\",cAbsoluto)+1, Len(cAbsoluto))
//Somente se tiver registro
If Len(::aConDest) > 0
//Tentando abrir o objeto
nRet := ShellExecute("open", cArquivo, "", cDiretorio, 1)
//Se houver algum erro
If nRet <= 32
cMensagem := "[zExcelXML][008] Arquivo não pode ser aberto! "+;
"Verificar! - ViewSO() - "+dToC(dDataBase)+" "+Time()
EndIf
//Senão, mostra mensagem de erro
Else
cMensagem := "[zExcelXML][009] Arquivo não pode ser aberto, utilize o método MountFile() para montar os dados! "+;
"Verificar! - ViewSO() - "+dToC(dDataBase)+" "+Time()
EndIf
//Mostrando mensagem caso tenha
Self:ShowMessage(cMensagem)
Return Nil
/*/{Protheus.doc} Destroy
Método que zera os atributos do objeto instanciando, caso ele seja reutilizado no fonte
@author Atilio
@since 23/06/2015
@version 1.0
@param lShowAlerts, Lógico, Define se será mostrado alertas ou não nas chamadas dos métodos
@example oExcelXml:Destroy()
/*/
Method Destroy(lShowAlerts) Class zExcelXML
Local cMensagem := "[zExcelXML][999] Objeto Destruído com sucesso!"
Default lShowAlerts := .F.
//Restaurando as areas
Self:RestAreaExcel()
//Definindo os atributos
::cArqOrig := ""
::cArqDest := ""
::aTabelas := {}
::aAreas := {}
::aExpre := {}
::aConOrig := {}
::aConDest := {}
::cArqCopy := ""
::lShowMsg := lShowAlerts
//Mostrando mensagem caso tenha
Self:ShowMessage(cMensagem)
Return Nil
/*/{Protheus.doc} ShowMessage
Mensagem que será mostrada
@author Atilio
@since 28/05/2015
@version 1.0
@param cMensagem, Caracter, Mensagem que será mostrada ao usuário ou no console.log
/*/
Method ShowMessage(cMensagem) Class zExcelXML
Default cMensagem := ''
//Se tiver mensagem de erro
If !Empty(cMensagem)
//Se mostra mensagem na tela
If ::lShowMsg
Aviso('Atenção', cMensagem, {'OK'}, 03)
//Senão apenas mostra mensagem no console.log
Else
ConOut(cMensagem)
EndIf
Endif
Return Nil
/*/{Protheus.doc} RestAreaExcel
Método que restaura as áreas armazenadas das tabelas utilizadas pela classe
@author Atilio
@since 01/08/2015
@version 1.0
/*/
Method RestAreaExcel() Class zExcelXML
Local nAux := 0
Local aArea := GetArea()
//Percorrendo as áreas guardadas
For nAux := 1 To Len(::aAreas)
RestArea(::aAreas[nAux][2])
Next
RestArea(aArea)
Return Nil
/*---------------------------------------------------------------------*
| Func: fMascara |
| Autor: Daniel Atilio |
| Data: 31/07/2015 |
| Desc: Função que verifica se existe máscara para determinado campo |
*---------------------------------------------------------------------*/
Static Function fMascara(cCampo)
Local cMask := ""
Local cTab := SubStr(cCampo, 1, At('_', cCampo)-1)//AliasCpo(cCampo)
//Se tiver tabela
If !Empty(cTab) .And. Len(cTab) == 3
cMask := PesqPict(cTab, cCampo)
EndIf
Return cMask