Abrir arquivo do excel

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Abrir arquivo do excel

Mensagem por JoséQuintas »

Se dá falta é porque faltou :: em algum lugar, sem isso procura fora.
É alterar CallDllStd pra ::CallDllStd

Foi lá no AddCellString
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Abrir arquivo do excel

Mensagem por JoséQuintas »

Achei este wrapper para harbour - lib intermediária pra dll

https://github.com/FTrautwein/hblibxlsxwriter

Independente disso, não sei se o que tem na rmchartclass ajuda nisso do número, pelo menos pro RMChart atendeu.
Por coincidência, nessa outra lib tá usando igual usei pra decimal.
Mas no RMChart conforme a função é uma conversão diferente.

Código: Selecionar todos

   METHOD ToDecimal( xValue )              INLINE xValue + 1.01 - 1.01
   METHOD ToDouble( xValue )
   METHOD ToLong( xValue )

   ENDCLASS

METHOD ToDouble( xValue ) CLASS RMChartClass

   LOCAL cDouble := "", oElement

   DO CASE
   CASE ValType( xValue ) == "N"
      RETURN xValue
   CASE ValType( xValue ) == "A"
      FOR EACH oElement IN xValue
         cDouble += FToC( oElement )
      NEXT
   OTHERWISE
      RETURN 0
   ENDCASE

   RETURN cDouble

METHOD ToLong( xValue ) CLASS RMChartClass

   LOCAL cLong := "", oElement

   DO CASE
   CASE ValType( xValue ) == "N"
      RETURN xValue
   CASE ValType( xValue ) == "A"
      FOR EACH oElement IN xValue
         cLong += L2Bin( oElement )
      NEXT
   OTHERWISE
      RETURN 0
   ENDCASE

   RETURN cLong
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
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:

Abrir arquivo do excel

Mensagem por clodoaldomonteiro »

Bom dia.

Tentando em xHarbour 123, BCC 7.30, não funciona ao usar worksheet_write_number, pois o sistema trava.

Código: Selecionar todos

...
...
   oExcel := Excel():New()
   oExcel:AddBook( mArqXls )
   oExcel:AddSheet( "Razao" )
...
...
   oExcel:AddCellString(6, 6, 'Saldo do mês anterior: ' )
   oExcel:AddCellNumber(6, 7, 1234.56 )
...
...
Return Nil

////////////////////////////////////////////////////////////////////////////////
//Classe para usar Excel com a LIB libxlsxwriter.dll com xHarbour 123 / BCC 7.30
//Por:
// - Wanderlei (Uso da LIB: libxlsxwriter.dll)
// - Quintas (Class para usar Excel)
// - Clodoaldo (Ajustes na Class)
//Link para consulta das funções da DLL
// - https://libxlsxwriter.github.io/worksheet_8h.html
////////////////////////////////////////////////////////////////////////////////
#pragma -w0
#pragma -es0

#include "hbclass.ch"

#Define DC_CALL_STD 0x0020

CREATE CLASS Excel

   VAR hDLL
   VAR Book
   VAR Sheet

   METHOD New()                              INLINE ::hDll := LoadLibrary( "libxlsxwriter.dll" ), Self
   METHOD End()                              INLINE FreeLibrary( ::hDLL )
   //METHOD CallDllStd( a,b,c,d,e,f,g )   INLINE DllCall( ::hDll, 0x0020, a,b,c,d,e,f,g )
   METHOD AddBook( cName )                   INLINE ::Book  := CallDllStd(::hDll, "workbook_new", hb_strToUTF8(cName) )
   METHOD AddSheet( cName )                  INLINE ::Sheet := CallDllStd(::hDll, "workbook_add_worksheet", ::Book, hb_strToUTF8(cName) )
   METHOD CloseBook()                        INLINE CallDllStd(::hDll, "workbook_close", ::Book )
   METHOD AddCellString( nRow, nCol, cText ) INLINE CallDllStd(::hDll, "worksheet_write_string", ::Sheet, nRow, nCol, hb_strToUTF8(cText) )
   METHOD AddCellNumber( nRow, nCol, nNumber, cFormat )
   METHOD ToDecimal( xValue )                INLINE xValue + 1.01 - 1.01
   METHOD ToDouble( xValue )
   METHOD ToLong( xValue )

   ENDCLASS

METHOD AddCellNumber( nRow, nCol, nNumber, cFormat ) CLASS Excel

   //nNumber := ToDouble(nNumber)
   //nNumber := StrToDouble( nNumber )

   //Return CallDllStd(::hDll, "worksheet_write_number", ::Sheet, nRow, nCol, StrToDouble(nNumber), cFormat)
   Return CallDllStd(::hDll, "worksheet_write_number", ::Sheet, nRow, nCol, ::ToDouble(nNumber), cFormat)
   
METHOD ToDouble( xValue ) CLASS Excel

   LOCAL cDouble := "", oElement

   DO CASE
   CASE ValType( xValue ) == "N"
      RETURN xValue
   CASE ValType( xValue ) == "A"
      FOR EACH oElement IN xValue
         cDouble += FToC( oElement )
      NEXT
   OTHERWISE
      RETURN 0
   ENDCASE

   RETURN cDouble

METHOD ToLong( xValue ) CLASS Excel

   LOCAL cLong := "", oElement

   DO CASE
   CASE ValType( xValue ) == "N"
      RETURN xValue
   CASE ValType( xValue ) == "A"
      FOR EACH oElement IN xValue
         cLong += L2Bin( oElement )
      NEXT
   OTHERWISE
      RETURN 0
   ENDCASE

   RETURN cLong

Static Function CallDllStd( nhDll, a,b,c,d,e,f,g )
   Return DllCall( nhDll, DC_CALL_STD, a, b, c, d, e, f, g )

//Static Function ToDouble(n)
//   RETURN n //+0.01-0.01

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
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Abrir arquivo do excel

Mensagem por alaminojunior »

Wanderlei escreveu:Oi Clodoaldo,
Eu utilizo essas dll aqui com xHarbour123 e Bcc7.3
Exemplo de excel.rar
Estou testando este recurso, que a princípio está funcionando, porém:
Não consigo setar a largura das colunas.
O método worksheet_write_number (conforme já alertado pelo Clodoaldo) não retornou 0 (que é sucesso), não encerra o exe, mas o valor na célula fica sempre 0 (zero)

Pergunta: Alguém usa somente as DLL´s e tem sucesso com isso ?
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Abrir arquivo do excel

Mensagem por Itamar M. Lins Jr. »

Olá!
Tem que usar essa versão. hbxlsxwriter 1.1.5
Não sei onde baixar.

Código: Selecionar todos

// Begin code.

/*
   Test.prg
   https://groups.google.com/g/harbour-users/c/zosdM49E5Cs
   Using : Windows 10 Family 22H2
           Harbour 3.2.0dev (r2104281802)
           hbxlsxwriter 1.1.5
   Compile with -lhbwin
   This code is a basic sample for tests.
*/

// <Parameters>

// Parameters files.
#define BM_FILE_OUT  hb_dirbase() + "_Result.txt"            // Test result.
#define BM_FILE_XLSX hb_dirbase() + "_Result_Calc.xlsx"      // File Excel to create with his path.

// Parameters country and codepage.
#define BM_LANG_REQUEST    request HB_LANG_FR
#define BM_LANG_SELECT     hb_langSelect( 'FR' )
#define BM_CODE_REQUEST    request HB_CODEPAGE_FRWIN
#define BM_CODE_SELECT     hb_cdpSelect( 'FRWIN' )

// </Parameters>

#include "hbxlsxwriter.ch"

// Create datas for test.
function DatasCreate()
   local aDatas := {}
   aadd( aDatas, { "Rent", "diciembre 28 2023", 1000, hb_date( 2023, 12, 28 ) } )
   aadd( aDatas, { "Gas" , "febrero 1 2000"   ,  100, hb_date( 2000,  2,  1 ) } )
   aadd( aDatas, { "Food", "enero 17 2024"    ,  300, hb_date( 2024,  1, 17 ) } )
   aadd( aDatas, { "Gym" , "abril 1 2000"     ,   50, hb_date( 2000,  4,  1 ) } )
   return aDatas

procedure Main

   local i                  // Count variable number.
   local c                  // Column num.
   local l                  // Row num.
   local aDatas             // Datas for test write.
   local fBold              // Bold format.
   local fDate              // Date format.
   local fMoney             // Money format.
   local fNum2              // 2 dec format.
   local oBook              // Book object.
   local oSheet             // Sheet object.

   // Country and codepage.
   BM_LANG_REQUEST ; BM_LANG_SELECT
   BM_CODE_REQUEST ; BM_CODE_SELECT

   set( _SET_CONFIRM   , .T.          )
   set( _SET_WRAP      , .T.          )
   set( _SET_DELETED   , .T.          )
   set( _SET_SCOREBOARD, .F.          )
   set( _SET_EXACT     , .T.          )
   set( _SET_SOFTSEEK  , .T.          )
   set( _SET_MESSAGE   , maxrow() - 1 )
   set( _SET_MCENTER   , .T.          )
   set( _SET_DATEFORMAT, "DD/MM/YY"   )
   set( _SET_EXCLUSIVE , .F.          )
   set( _SET_CURSOR    ,    1         )
   set( _SET_EPOCH     , 1990         )
   set( _SET_EOF       , .F.          )

   setmode( 25, 80 )
   setcolor( "GR+/B" )
   @ 0, 0, maxrow(), maxcol() box space( 9 )

   ferase( BM_FILE_OUT  )
   ferase( BM_FILE_XLSX )

   set( _SET_ALTFILE  , BM_FILE_OUT )
   set( _SET_ALTERNATE, .T.         )

   ? "Test https://groups.google.com/g/harbour-users/c/zosdM49E5Cs"
   ?
   ? "hbxlsxwriter version :", lxw_version()
   ? "Harbour version      :", hb_version( 0 )

   // Create datas for test.
   aDatas := DatasCreate()

   // Create a new workbook and add a worksheet.
   oBook  := workbook_new( BM_FILE_XLSX )
   oSheet := workbook_add_worksheet( oBook )

   // Create the used numberformats.
   fBold := workbook_add_format( oBook )
   format_set_bold( fBold )
   fDate := workbook_add_format( oBook )
   format_set_num_format( fDate, "mm/dd/yyyy" )
   fMoney := workbook_add_format( oBook )
   format_set_num_format( fMoney, "$#,##0.00" )
   fNum2 := workbook_add_format( oBook )
   format_set_num_format( fNum2, "#,##0.00" )

   // Write titles.
   l := 0 ; c := -1
   c++ ; worksheet_write_string( oSheet, l, c, "Item"   )
   c++ ; worksheet_write_string( oSheet, l, c, "Cost"   )
   c++ ; worksheet_write_string( oSheet, l, c, "Money"  )
   c++ ; worksheet_write_string( oSheet, l, c, "Date 1" )
   c++ ; worksheet_write_string( oSheet, l, c, "Num"    )

   // Change the columns width for clarity.
   worksheet_set_column( oSheet, 0, 0, 16 )
   worksheet_set_column( oSheet, 1, 1, 24 )
   worksheet_set_column( oSheet, 2, 2, 10 )
   worksheet_set_column( oSheet, 3, 3, 12 )
   worksheet_set_column( oSheet, 4, 4, 10 )

   // Write datas.
   for i := 1 to len( aDatas )
      l++ ; c := -1
      c++ ; worksheet_write_string(   oSheet, l, c, aDatas[ i, 1 ]         )
      c++ ; worksheet_write_string(   oSheet, l, c, aDatas[ i, 2 ]         )
      c++ ; worksheet_write_number(   oSheet, l, c, aDatas[ i, 3 ], fMoney )
      c++ ; worksheet_write_datetime( oSheet, l, c, aDatas[ i, 4 ], fDate  )
      c++ ; worksheet_write_number(   oSheet, l, c, aDatas[ i, 3 ], fNum2  )
   endfor

   // Write sum.
   l++
   c := 0 ; worksheet_write_string(  oSheet, l, c, "Total", fBold )
   c := 2 ; worksheet_write_formula( oSheet, l, c, "=SUM(" + bh_IntToCell( 2, c + 1 ) + ":" + bh_IntToCell( l, c + 1 ) + ")", fMoney )
   c := 4 ; worksheet_write_formula( oSheet, l, c, "=SUM(" + bh_IntToCell( 2, c + 1 ) + ":" + bh_IntToCell( l, c + 1 ) + ")", fNum2  )

   // Close the workbook.
   workbook_close( oBook )

   ?
   set( _SET_ALTERNATE, .F. )
   set( _SET_ALTFILE  , ""  )

//   wapi_ShellExecute( nil, "open", BM_FILE_OUT )
   wapi_ShellExecute( nil, "open", BM_FILE_XLSX )
//   wait
   return

// Tools functions common.

// Convert the row and col to cell name.
function bh_IntToCell( nRow, nCol )
   local n       := abs( nCol )
   local cReturn := ""
   do while n > 0
      if mod( n, 26 ) == 0                          // For character "Z".
         cReturn := "Z" + cReturn
         n := int( n / 26 ) - 1
      else
         cReturn := chr( 64 + mod( n, 26 ) ) + cReturn
         n := int( n / 26 )
      endif
   enddo
   cReturn += hb_ntos( nRow )
   return cReturn

// End code.

Best regards,
Bernard.
Código, extraído do forum Harbour user.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Abrir arquivo do excel

Mensagem por Jairo Maia »

Olá Pessoal,

Curioso sobre esse exemplo que o Itamar postou, fui procurar se achava algo sobre a lib "libhbxlsxwriter".

Achei aqui: https://github.com/diegofazio/hbxlsxwriter

Então baixei, e compilei os exemplos, e funcionam. Porém, os que mais me interessaram foram os seguintes:

- tutorial1.prg
- tutorial2.prg
- tutorial3.prg


Compilei, e eles geram as planilhas, mas AS FÓRMULAS NÃO FUNCIONAM. Se clico em Total, elas estão lá, mas não executam as somas em nenhum exemplo.

NOTA1: No exemplo tutorial1.prg, se abro a planilha e excluo a primeira linha (fica uma linha vazia na linha 1) que fica em branco, a fórmula então funciona, mas não consegui gerar o exemplo sem a linha em branco.

NOTA2: Os exemplos tutorial2.prg e tutorial3.prg, geram a planilha sem a primeira lnha em branco, mas as fórmulas também não funcionam.

Uma pena, gostaria muito que funcionasse para eu poder trocar os relatórios que gero em .CSV, e depois abro e coloco as fórmulas manualmente para enviar ao cliente, por uma planilha gerada diretamente em .XLSX.

Vou continuar tentando, mas se mais alguém tiver a curiosidade de estudar esses exemplos, talvez contribua.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Abrir arquivo do excel

Mensagem por ivanil »

Ola;

Sobre esta questão:
Jairo Maia. escreveu:Uma pena, gostaria muito que funcionasse para eu poder trocar os relatórios que gero em .CSV, e depois abro e coloco as fórmulas manualmente para enviar ao cliente, por uma planilha gerada diretamente em .XLSX.
Você pode criar as fórmulas no CSV que ao abrir no Excel, será executado normalmente, às vezes preciso fazer isso, veja:

codigo;nome;salario;"salario+10%"
="00001";"José de Alencar";1500,00;=c2*1,10

A única coisa que não conseguimos determinar no CSV são as formatações. (cores/fontes/colunas...)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Abrir arquivo do excel

Mensagem por Jairo Maia »

Olá Ivanil,
ivanil escreveu:Você pode criar as fórmulas no CSV que ao abrir no Excel
Ivanil, isso não funciona. Talvez funcione no Microsoft Excel, mas no cliente eles usam visualizadores de Planilhas, ou um desses: LibreOffice Calc ou Apache OpenOffice Calc para visualizar e editar planilhas, e neles esse método não funciona.

Não tenho o Excel, não preciso dele pra nada, eu uso o LibreOffice para meus testes e/ou ajustes para exportação de planilhas quando preciso, e nele não funciona.

Mas obrigado, valeu pela atenção.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Abrir arquivo do excel

Mensagem por ivanil »

Ola Jairo;

Eu trabalho com excel/libreOffice e OpenOffice e nestes 3 funcionam naturalmente,
Jairo Maia escreveu: ou um desses: LibreOffice Calc ou Apache OpenOffice Calc para visualizar e editar planilhas, e neles esse método não funciona.
Boa sorte;

at.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Abrir arquivo do excel

Mensagem por Jairo Maia »

ivanil escreveu:Eu trabalho com excel/libreOffice e OpenOffice e nestes 3 funcionam naturalmente,
Ivanil, você poderia por gentileza postar (anexar) um exemplo de arquivo .CSV que funcione com você? Talvez não estou conseguindo montar o arquivo corretamente, vendo um exemplo funcional, ajudaria muito.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Abrir arquivo do excel

Mensagem por ivanil »

Ivanil escreveu:Você pode criar as fórmulas no CSV que ao abrir no Excel, será executado normalmente, às vezes preciso fazer isso, veja:

codigo;nome;salario;"salario+10%"
="00001";"José de Alencar";1500,00;=c2*1,10
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Abrir arquivo do excel

Mensagem por Itamar M. Lins Jr. »

Olá!
NOTA1: No exemplo tutorial1.prg, se abro a planilha e excluo a primeira linha (fica uma linha vazia na linha 1) que fica em branco, a fórmula então funciona, mas não consegui gerar o exemplo sem a linha em branco.
NOTA2: Os exemplos tutorial2.prg e tutorial3.prg, geram a planilha sem a primeira lnha em branco, mas as fórmulas também não funcionam.
Estou vendo com o autor ou autores... Vamos aguardar algum posicionamento, pq teve atualizações na matriz, e ele(s) ainda não atualizaram os repositórios dele(s).

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Abrir arquivo do excel

Mensagem por Itamar M. Lins Jr. »

Olá!
Pronto! É conversando (ou tentando) que a gente se entende.

Francesco Perillo respondeu!
I don't remember this problem with the samples but you can test my fork that a more recent c lib and i added several harbour checks
https://github.com/fperillo/fphbxlsxwriter

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Abrir arquivo do excel

Mensagem por Itamar M. Lins Jr. »

Olá!
O Diego respondeu tbm.
I tested those samples. This were the results.

Diego.
Tutor 1,2,3:
Tutor_1-2-3.rar
(14.54 KiB) Baixado 60 vezes
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Abrir arquivo do excel

Mensagem por Jairo Maia »

Olá Itamar,
Itamar M. Lins Jr. escreveu:O Diego respondeu tbm.
O que o Diego fez, foi gerar a planilha. Gerar também gero aqui usando os exemplos, e igualmente as que ele postou, o campo Total fica com 0 (zero), quando deveria já ao abrir a planilha, ele estar preenchido com o total. Essa é a questão nesses exemplos.

NOTA: Baixei a versão que você postou também, gerei a lib, compilei os exemplos e não mudou nada o resultado.

NOTA1: Se nas planilhas alterar qualquer campo de valores e confirmar, então sim aparece o resultado no campo Total, o que significa que a fórmula está funcional, apenas quando abre pela primeira vez e não altera nada é que fica zerado.

Valeu por enquanto, vou voltar nisso oportunamente. Se conseguir algum avanço posto aqui...
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Responder