saulogm / advpl-excel

Classe em ADVPL para criar, ler ou editar planilhas do excel no formato xlsx
https://github.com/saulogm/advpl-excel/wiki
Apache License 2.0
49 stars 23 forks source link

Uso da função EncodeUTF8() #8

Closed marcos-abrahao closed 4 years ago

marcos-abrahao commented 4 years ago

Nas proximidades da linha 3657, não está sendo testado a chamada a funcão EncodeUTF8(aString[nCont][1]) retornar NIL, causando erro na linha se a conversão para UTF8 falhar.

marcos-abrahao commented 4 years ago

THREAD ERROR ([3708], adalberto.xavier, BKCSNOTAS0564) 14/07/2020 11:13:31 type mismatch on + on YEXCEL:XLS_SHAREDSTRINGS(YEXCEL.PRW) 11/06/2020 09:34:58 line : 3657

saulogm commented 4 years ago

Oi Marcos Poderia me passar como simular esse problema. Se você já conseguiu identificar como solucionar esse problema também seria bem vindo.

A principio essa lista do tHashMap da linha 2657 deveria ter apenas caracteres, não fazendo sentido eu verificar o seu conteúdo.

marcos-abrahao commented 4 years ago

Boa tarde! Uma tabela continha a string "LINDIC�SSIA SILVA DE CASTRO " e ocasionou o erro. Fiz o seguinte para contornar:

Method xls_sharedStrings(nFile) class YExcel Local nCont Local aString Local cRet := "" Local cEncod:= "" ::oString:list(@aString) aSort(aString,,,{|x,y| x[2]<y[2] }) cRet += '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' cRet += '' FWRITE(nFile,cRet) cRet := "" For nCont:=1 to Len(aString) cRet += '' cEncod := EncodeUTF8(aString[nCont][1]) If cEncod == Nil MsgStop(aString[nCont][1],"Yexcel") cEncod := "" EndIf cRet += '<![CDATA['+cEncod+']]>' cRet += '' FWRITE(nFile,cRet) cRet := "" Next cRet += '' FWRITE(nFile,cRet) cRet := "" Return cRet

saulogm commented 4 years ago

Com base na sua sugestão fiz o seguinte ajuste. Já subir para a versão principal.

        cTexto  := EncodeUTF8(aString[nCont][1])
        If Valtype(cTexto)!="C"
            cTexto  := aString[nCont][1]
            cTexto  := Replace(cTexto,chr(129),"")
            cTexto  := Replace(cTexto,chr(141),"")
            cTexto  := Replace(cTexto,chr(143),"")
            cTexto  := Replace(cTexto,chr(144),"")
            cTexto  := Replace(cTexto,chr(157),"")
            cTexto  := EncodeUTF8(cTexto)
            If Valtype(cTexto)!="C"
                cTexto  := ""
            EndIf
        EndIf
        cRet    += '<t><![CDATA['+cTexto+']]></t>'

ajustado.

marcos-abrahao commented 4 years ago

Obrigado Saulo! Perfeito!