Página 1 de 2

Xls nativo - remover apóstrofo!

Enviado: 21 Fev 2021 15:59
por Ceb
Boa tarde!

Uso o Xharbour 1.2.1 e há muito crio XLS nativamente com ele. Para isso, utilizo de um exemplo que acho ter baixado por aqui, onde não necessito de nenhuma ferramenta adicional.

Porém, me deparei com um problema: preciso que o XLS criado seja importado em um outro sistema. O arquivo é carregado normalmente, tanto no Excel como no LibreOffice, porém rejeitado por esse outro sistema.

Após analisar, percebi que os campos numéricos tem um apóstrofo (') no início dele, o que impede a importação do mesmo.

Segue em anexo o exemplo que uso e foto do "danado" do apóstrofo que está impedindo tal importação.

Desde já, agradeço caso alguém possa me dar uma ideia de como remover o apóstrofo e continuar a exportar nativamente meu arquivo XLS.

Att,

Ceb

Xls nativo - remover apóstrofo!

Enviado: 21 Fev 2021 17:12
por Itamar M. Lins Jr.
Olá!
Faltou o XLS do outro sistema ou os dados a serem importados.
Quem está gerando ele com apostrofo ?
Olhei e o array no exemplo é numérico.
O XLS é gerado Ok e o outro sistema coloca o apostrofo quando importa ?


Saudações,
Itamar M. Lins Jr.

Xls nativo - remover apóstrofo!

Enviado: 21 Fev 2021 17:45
por Ceb
Ei Itamar, obrigado por responder.

O arquivo pedido.xls é gerado pelo programa xls.prg que anexei anteriormente.

Quando tento importar o pedido.xls no outro sistema, acusa erro e aborta. Daí, tenho que abrir o pedido.xls e remover os apóstrofos, salvar e só então consigo importá-lo no outro sistema.

Segue o arquivo pedido.xls gerado pelo xls.prg que contem o apóstrofo.

Desde já, muito grato pela ajuda.

Att,

Ceb

Xls nativo - remover apóstrofo!

Enviado: 21 Fev 2021 19:01
por Itamar M. Lins Jr.
Olá!
Quando tento importar o pedido.xls no outro sistema, acusa erro e aborta.
O problema é saber como o "outro sistema" trabalha.
Abri aqui pelo LibreOffice no Linux e está ok.
Screenshot_20210221_185711.png
Pq vc salva o XLS em X versão do excel. Precisa saber qual versão do excel o "outro sistema" vai importar.

Saudações,
Itamar M. Lins Jr.

Xls nativo - remover apóstrofo!

Enviado: 21 Fev 2021 19:27
por Ceb
Itamar, boa noite!

O sistema de pedido eletrônico de uma distribuidora de medicamentos importa arquivo gerado no Excel 2007, 2013 e no online, importa até se for criado no LibreOffice!

O problema é que o arquivo gerado em xHarbour pelo programa xls.prg tem um apóstrofo (') na frente dos campos numéricos. Daí, o sistema da distribuidora não importa de nenhuma versão, a não ser que o apóstrofo seja removido.

Conforme sua imagem, o arquivo é aberto normalmente tanto no Excel como no LibreOffice, porém tem o apóstrofo! Se vc clicar F2 no campo ele tbm aparece. Testa aí por favor.

Eu preciso alterar o xls.prg e o xls.ch para gerar campo numérico sem o "danado" do apóstrofo (') na frente.

Att,

Ceb.

Xls nativo - remover apóstrofo!

Enviado: 21 Fev 2021 22:06
por Itamar M. Lins Jr.
Olá!
Agora entendi.
Olhei aqui. Os sistemas(LibeOffice/Excel) detectam se é numero ou letra e quando é numero coloca o apostrofo.
Se colocar:

Código: Selecionar todos

 ' "900" '
Será que vai ler ?
Se colocar uma letra na frente do numero não aparece também.

Saudações,
Itamar M. Lins Jr.

Xls nativo - remover apóstrofo!

Enviado: 21 Fev 2021 22:33
por Itamar M. Lins Jr.
Olá!
É um problema comum, veja.
https://pt.extendoffice.com/documents/e ... he.html#a3
Isso é o excel que coloca mesmo, quando abre o XLS (BIFF)
Acho que achei aqui a solução... testando...

Saudações,
Itamar M. Lins Jr.

Xls nativo - remover apóstrofo!

Enviado: 21 Fev 2021 23:12
por Itamar M. Lins Jr.
Olá!
Mais um macete para importar para o excel.
Não precisa de nada, apenas criar o arquivo dessa forma:

Código: Selecionar todos

Function main
Local nHandle
nHandle := FCREATE("pedido.xls")
FWRITE(nHandle,"<HTML><BODY><table>")
FWRITE(nHandle,"<tr><th>barra</th><th>qtd</th></tr>")
FWRITE(nHandle,"<tr><td>17123876123</td><td>1</td></tr>")
FWRITE(nHandle,"<tr><td>76313123987</td><td>1</td></tr>")
FWRITE(nHandle,"</table></body></html>")
FCLOSE(nHandle)
O formato padrão achei na internet com mais firulas, deixar aqui guardado.

Código: Selecionar todos

<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; chairset=windows-1252">
<!--[if gte mso 9]><xml> <x:ExcelWorkbook> <x:ExcelWorksheets> <x:ExcelWorksheet> <x:Name>Sheet1</x:Name> <x:WorksheetOptions> <x:Selected/> <x:Panes> <x:Pane> <x:Number>3</x:Number> <x:ActiveRow>3</x:ActiveRow> </x:Pane> </x:Panes> <x:ProtectContents>False</x:ProtectContents> <x:ProtectObjects>False</x:ProtectObjects> <x:ProtectScenairios>False</x:ProtectScenairios> </x:WorksheetOptions> </x:ExcelWorksheet> </x:ExcelWorksheets> </x:ExcelWorkbook> </xml><![endif]--> 
</head>
<body> 
<table x:str> 
<tr>
<td x:num width=64>1</td>
</tr>
<tr>
<td x:num>2</td>
</tr>
<tr>
<td x:num>3</td> 
</tr> 
</table>
</body>
</html> 
Salvar com a extensão .XLS

Esse outro cabeçalho do Itaú.

Código: Selecionar todos

<html xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns="http://www.w3.org/TR/REC-html40">
Saudações,
Itamar M. Lins Jr.

Xls nativo - remover apóstrofo!

Enviado: 22 Fev 2021 00:13
por Itamar M. Lins Jr.
Olá!
exemplo de XML do excel. Importa direto para o Libreoffice e Excel.

Código: Selecionar todos

<?xml version="1.0" encoding="utf-8"?>
<Workbook 
    xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:user="urn:my-scripts" 
    xmlns:o="urn:schemas-microsoft-com:office:office" 
    xmlns:x="urn:schemas-microsoft-com:office:excel" 
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">

    <Worksheet ss:Name="Testing Data">
        <Table>
            <Row>
                <Cell>
                    <Data ss:Type="String">Barra</Data>
                </Cell>
                <Cell>
                    <Data ss:Type="String">Quantidade</Data>                    
                </Cell>
            </Row>
            <Row>
                <Cell>
                    <Data ss:Type="Number">129812981212</Data>
                </Cell>
                <Cell>
                    <Data ss:Type="Number">1</Data>                    
                </Cell>
            </Row>
            <Row>
                <Cell>
                    <Data ss:Type="Number">234812981212</Data>
                </Cell>
                <Cell>
                    <Data ss:Type="Number">5</Data>                    
                </Cell>
            </Row>
        </Table>
    </Worksheet>

</Workbook>
Se for abrir pelo LibreOffice salvar .XLS e no Excel salvar com XML.

Saudações,
Itamar M. Lins Jr.

Xls nativo - remover apóstrofo!

Enviado: 22 Fev 2021 10:48
por Ceb
Itamar, bom dia!

Testei suas sugestões, mas continuo na dependência do Excel ou Libreoffice. Assim, já até faço gerando um CSV. Mas o que realmente queria é gerar pelo xls.prg sem o apóstrofo, pq aí sim eu não teria dependência do Excel/LibreOffice.

Conforme sua sugestão, usando o xls.prg, coloquei na frente do código de barras a letra B, ficando assim: B7891058021580. Assim gerou sem o apóstrofo ('). Agora preciso remover esse B do arquivo gerado, pedido.xls. Tentei MemoRead + StrTran + MemoWrit, até removeu, mas corrompeu o arquivo.

Segue o arquivo pedido.xls original e o pedidoA.xls (alterado pelo MemoRead + StrTran + MemoWrit). Segue tbm print comparando a estrutura de ambos.

Sem mais, agradeço.

Att,

Ceb

Xls nativo - remover apóstrofo!

Enviado: 22 Fev 2021 11:47
por Kapiaba
Ola, tente assim:

Código: Selecionar todos

#Include "FiveWin.ch"

FUNCTION PrintDosForWin()

   LOCAL cTexto     := ""
   LOCAL ON_GRANDE  := CHR(27) + CHR(33) + CHR(16) // Para Impresoras Epson
   LOCAL OFF_GRANDE := CHR(27) + CHR(33) + CHR(01) // Para Impresoras Epson
   LOCAL cPrinter   := GetDefaultPrinter()    // Seleciona la Impresora Por Defecto de Windows
   //LOCAL CRLF       := CHR(13) + CHR(10)
   LOCAL cFileName  := "TEXTO.PRN"

   cTexto += "Esta es la primera linea del texto" + CRLF
   cTexto += Replicate( "*-", 20 ) + CRLF
   cTexto += ON_GRANDE + "LETRAS GRANDES" + OFF_GRANDE + CRLF
   cTexto += "Esta es otra linea de texto..." + CRLF
   cTexto += PADL( "Izquierza", 40 ) + CRLF
   cTexto += PADC( "CENTRALIZADO", 40 ) + CRLF
   cTexto += PADR( "Derecha", 40 ) + CRLF
   cTexto += PADC( "< Linea Final >", 40, "-" ) + CRLF

   If WriteStream( cFileName, cTexto )

      // Envia la Impresion al Spool de Windows
      // PrintFileRaw( cPrinter, cFileName, "Impresion En Formato DOS desde Windows" )

      WinExec( "Notepad.exe " + cFileName )

      FERASE( cFileName )

   EndIF

RETURN NIL
// Esta Funcion la encontre por ahi...
FUNCTION WriteStream( cFile, cStream )

   LOCAL nHandle := FCreate( cFile )

   IF FError() <> 0
      RETURN( .F. )
   ENDIF

   FWrite( nHandle, cStream, Len(cStream) )

   FClose( nHandle )

RETURN ( FError() == 0 )
Abs.

Xls nativo - remover apóstrofo!

Enviado: 22 Fev 2021 14:49
por Itamar M. Lins Jr.
Olá!
Quem coloca o apostrofo é o Excel, que coloca nos campos tratando como texto.
Se mexer no arquivo, altera os cálculos e danifica o XLS.
Precisa procurar na internet o modelo adequado para gerar o XLS com campos numéricos, data, currency, etc.

Saudações,
Itamar M. Lins Jr.

Xls nativo - remover apóstrofo!

Enviado: 22 Fev 2021 16:36
por Jairo Maia
Fazendo o teste com o arquivo da sugestão do Itamar, com a letra "B" na frente, dessa forma deu pra remover o "B" e o arquivo abriu. Usei FCreate(), FOpen() e FWrite() porque não altera o formato do arquivo, enquanto MemoRead() e MemoWrit() quando salvam salvam no formato OEM. Deu certo, veja se ajuda:

Compilar usando: HBMK2 Teste.Prg xhb.hbc

Código: Selecionar todos

#include "FileIO.Ch"

nNewFile := FCreate( "Pedido1.Xls" )  // cria o arquivo a salvar o conteúdo alterado

nHadler := FOPEN( "Pedido.Xls", 2 )  // abre o arquivo no modo leitura e gravação

nFileSize := FSeek( nHadler, 0, FS_END )  // pega tamanho do arquivo

FSeek( nHadler, 0, FS_SET )  // reposiciona o cursor no inicio do arquivo

cBuffer := Space( nFileSize )  // define o tamanho de cBuffer

FREAD( nHadler, @cBuffer, nFileSize )  // carrega o arquivo em cBuffer

cBuffer := StrTran( cBuffer, [B789], " 789" )  // remove o B por um espaço (não altera o LEN do arquivo)

FWRITE( nNewFile, cBuffer, nFileSize )  // grava o novo arquivo

FClose( nNewFile )  // fecha os Handlers...

FCLOSE( nHadler )
Em Tempo: Assim também funcionou (com Hb_MemoRead() e Hb_MemoWrit():

Código: Selecionar todos

cBuffer := Hb_MemoRead( "Pedido.Xls" )

cBuffer := StrTran( cBuffer, [B789], " 789" )  // remove o B por um espaço (não altera o LEN do arquivo)

Hb_MemoWrit( "Pedido1.Xls", cBuffer )

Xls nativo - remover apóstrofo!

Enviado: 22 Fev 2021 20:26
por gilbertosilverio
Ola Amigos,

Gero meus relatórios no excel desta maneira, simplesmente salvo o arquivo DBF como XLS, e ate hoje funciona que e uma maravilha...

Código: Selecionar todos


FUNCTION EXCEL_EXPEDICAO()
    PRIVATE ARQ, aARQ:={}, cName, oBAR, cOldDrive, cOldPath, NOVODIR, oBAR
    X_SAVEPATH()
    MONTA_NA_TELA()
    IF EMPTY(cNAME)
       X_RESTOREPATH()
       RETURN NIL
    ENDIF
    ARQ:=NOVODIR+RETIRABRANCO(alltrim(cName))+[.xls]

    TITULO:={ [N_NFe],[RAZAO],[Cidade],[Bairro],[CEP],[Volume],[Valor],[Obser],[OK] }
    aAdd(aARQ, { TITULO[1]    ,  "C",    10,0 } )
    aAdd(aARQ, { TITULO[2]    ,  "C",    20,0 } )
    aAdd(aARQ, { TITULO[3]    ,  "C",    20,0 } )
    aAdd(aARQ, { TITULO[4]    ,  "C",    20,0 } )
    aAdd(aARQ, { TITULO[5]    ,  "C",    10,0 } )
    aAdd(aARQ, { TITULO[6]    ,  "C",    10,0 } )
    aAdd(aARQ, { TITULO[7]    ,  "N",    12,2 } )
    aAdd(aARQ, { TITULO[8]    ,  "C",    40,0 } )
    aAdd(aARQ, { TITULO[9]    ,  "C",    04,0 } )

    DBCREATE( ARQ, aArq, [DBFNTX], .T. )
    CLOSE DATA
    USE &ARQ NEW EXCLUSIVE
    C:=1 ; CONTA:=0

    oBar:=HProgressBar():NewBox( "Imprimindo, "+lTrim(strZERO(C,6))+" De "+lTrim(strZERO(LEN(aNFE_MOTO),6))+" Registro(s)",,,350,,LEN(aNFE_MOTO))

    DO WHILE C <= LEN(aNFE_MOTO)
       DBAPPEND()
       REPLACE N_NFE  WITH aNFE_MOTO[C,1]
       REPLACE RAZAO  WITH SUBSTR(aNFE_MOTO[C,6],1,20)
       REPLACE CIDADE WITH SUBSTR(aNFE_MOTO[C,7],1,20)
       REPLACE BAIRRO WITH SUBSTR(aNFE_MOTO[C,8],1,20)
       REPLACE CEP    WITH aNFE_MOTO[C,9]
       REPLACE VOLUME WITH aNFE_MOTO[C,4]
       REPLACE VALOR  WITH VAL(aNFE_MOTO[C,2])
       REPLACE OBSER  WITH SUBSTR(aNFE_MOTO[C,3],1,40)
       REPLACE OK     WITH SUBSTR(aNFE_MOTO[C,10],1,4)
       C++
       oBar:Step("Imprimindo, "+lTrim(strzero(C,6))+" De "+lTrim(Strzero(len(aNFE_MOTO),6))+" Registro(s)")
    ENDDO
    oBar:CLOSE()
    X_RESTOREPATH()
    Hwg_Msginfo( [Arquivo salvo em: ]+CRLF+CRLF+arq, [Aviso do sistema] ) //= c:\usuario\desktop\nomedoarquivo.xls
RETURN( nil )

FUNCTION MONTA_NA_TELA()
   cName    := [Rel_]+SUBSTR(TIME(),1,2)+[_]+SUBSTR(TIME(),4,2)+[_]+SUBSTR(TIME(),7,2)
   NovoDir  := GetDesktopFolder()+[\]
RETURN NIL

Function GetDesktopFolder()
   local objShell, GetDesktopFolder
   objShell := CreateObject("WScript.Shell")
   GetDesktopFolder := objShell:SpecialFolders:Item("Desktop")
   objShell := nil
RETURN GetDesktopFolder


Xls nativo - remover apóstrofo!

Enviado: 22 Fev 2021 21:10
por Itamar M. Lins Jr.
Olá!
Gero meus relatórios no excel desta maneira, simplesmente salvo o arquivo DBF como XLS, e ate hoje funciona que e uma maravilha...
Tem algumas maneiras, mas não é o excel que vai ler, é o tal programa dele lá.
Ai acredito que o Jairo resolveu a questão, mas gostei dessa forma também.

Saudações,
Itamar M. Lins Jr.
.