Preciso gerar XLSX....

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

Moderador: Moderadores

lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Preciso gerar XLSX....

Mensagem por lugab »

Bom dia.

Aqui no Fórum tem muitos exemplos de conversão direta tipo DBF to XLS e XLS to DBF, inclusive um do Toledo, q é o q segue:

Código: Selecionar todos

CLEAR
SELECT 1
USE VENDAS
vArq:="VENDAS.XLS"
SET PRINTER TO (vArq)
SET DEVICE TO PRINT
vTit:="Codigo"+chr(9)+"Nome do Produto"+chr(9)+"Quantidade"+chr(9)+"Valor Unit."+chr(9)+"Valor Total"
@ 00,00 SAY vTit
v_l=1
DO WHILE !EOF()
 v_l+=1
 vValor:=STRTRAN(LTRIM(STR(VALOR,7,2)),'.',',')
 vLinha:=CODIGO+chr(9)+PRODUTO+chr(9)+LTRIM(STR(QTDE,6,0))+chr(9)+vValor+chr(9)+;
         "=C"+LTRIM(STR(v_l,5,0))+"*D"+LTRIM(STR(v_l,5,0))
 @ PROW()+1,00 SAY vLinha
 SKIP
ENDDO
vRod:=" "+chr(9)+"   TOTAL GERAL ===>>>"+chr(9)+"=SOMA(C2:C"+LTRIM(STR(v_l,5,0))+")"+;
      chr(9)+" "+chr(9)+"=SOMA(E2:E"+LTRIM(STR(v_l,5,0))+")"
@ PROW()+1,00 SAY vRod
SET PRINTER TO
SET DEVICE TO SCREEN
CLOSE ALL
TONE(400,3)
vMen:="O ARQUIVO VENDAS.XLS FOI CRIADO COM SUCESSO...;"+;
      "ABRA O ARQUIVO NO EXCEL E FA€A AS FORMATA€OES;"+;
      "NECESSARIAS."
ALERT(vMen,,"15/3")
RETU
Entretanto, eu preciso gerar uma planilha XLSX (e não XLS) com dados da memória do programa Clipper compilado com -Harbour

Será q esta contribuição do Toledo serve também para XLSX ? Se não serve, será q alguém tem um exemplo q possa publicar para nós ??

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

Preciso gerar XLSX....

Mensagem por JoséQuintas »

Se tem os fontes do Harbour 3.2 ou 3.4, vai encontrar em extras\hbxlsxml
Inclusive o primeiro exemplo é em português.

Se não me engano o XLSX é XML em formato ZIP, e essa LIB gera em XML.
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/
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Preciso gerar XLSX....

Mensagem por lugab »

Oi, José Quintas...

Se entendi direito a sua dica, XLSX é num formato diferente deste exemplo do Toledo q é em XLs, confere ?

Então, talvez, só resolva se eu gerar em XLS pela contribuição do Toledo e em seguida abrir o arquivo no Excel e salva-lo como XLSX

Certamente vai funcionar, confere ?
lugab
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Preciso gerar XLSX....

Mensagem por fladimir »

Pra gerar direto no EXCEL podendo escolher a versão do Excel teria q fazer tipo o exemplo abaixo:

Código: Selecionar todos

   IF (oExcel := Cria_OLE("Excel.Application", "Erro! O Excel n„o esta Ativado ou N„o instalada nesse Computador", .T.) ) == NIL
   	RETURN
  	ENDIF
  	
   oExcel:WorkBooks:Add()
   oSheet := oExcel:ActiveSheet

   oSheet:Name := 'Analise Geral'  
   oSheet:Cells( 1, 1 ):Value := "Codigo"
   oSheet:Cells( 1, 2 ):Value := "Descricao"
   oSheet:Cells( 1, 3 ):Value := "Qtde"
   oSheet:Cells( 1, 4 ):Value := "Estq Atual"
   oSheet:Cells( 1, 5 ):Value := "Vlr. Medio"
   oSheet:Cells( 1, 6 ):Value := "Vlr. Total"

   FOR i=1 to 6
      oSheet:Cells( 1, i ):Font:Bold           := .T.
      oSheet:Cells( 1, i ):Font:ColorIndex     := 2     //-- Cor da letra
      oSheet:Cells( 1, i ):Interior:ColorIndex := 11    //-- Cor de Fundo
      oSheet:Cells( 1, i ):HorizontalAlignment := -4108 // Alinhamento Centro
      oSheet:Columns(i):ColumnWidth := 15  // Tamanho da Coluna
   NEXT
   oSheet:Columns(2):ColumnWidth := 40  // Tamanho da Coluna

   oSheet:Cells( 1, 1 ):Select()
   oExcel:Visible := .F.

   nLinPlan   := 2
   xTotalEstq := xTotalCust := xTotalVend := 0

WHILE TMP_ITENS->(!EOF())
      Mostra("Gerando..."+ STR( (( (nLinPlan-1) / TMP_ITENS->(LastRec()) )*100),3)+"%")
      oSheet:Cells( nLinPlan, 1 ):Value := Alltrim(TMP_ITENS->codi)
      oSheet:Cells( nLinPlan, 2 ):Value := Alltrim(TMP_ITENS->Desc)
		oSheet:Cells( nLinPlan, 3 ):Value := TMP_ITENS->Qtde
		oSheet:Cells( nLinPlan, 4 ):Value := TMP_ITENS->ESTQATUAL
      oSheet:Cells( nLinPlan, 5 ):Value := TMP_ITENS->VL_TOT/TMP_ITENS->QTDE
      oSheet:Cells( nLinPlan, 6 ):Value := TMP_ITENS->VL_TOT

      //-- Totaliza
     ntotQtd   += TMP_ITENS->Qtde
      nTotValor += TMP_ITENS->Vl_TOT

      // Formatar célula:
      oSheet:Cells( nLinPlan, 1   ):NumberFormat := "000000"
      oSheet:Cells( nLinPlan, 4 ):NumberFormat := "#.##0,00"
      oSheet:Cells( nLinPlan, 5 ):NumberFormat := "#.##0,00"
      oSheet:Cells( nLinPlan, 6 ):NumberFormat := "#.##0,00"

      //oExcel.ActiveSheet.UsedRange.EntireColumn.Autofit

		// Alinhamento das celulas:
      oSheet:Cells( nLinPlan, 1 ):HorizontalAlignment := 3 //-- Centro
      oSheet:Cells( nLinPlan, 5 ):HorizontalAlignment := 4 //-- Right
      oSheet:Cells( nLinPlan, 6 ):HorizontalAlignment := 4 //-- Right
																		
      cIntervalo := 'A' + ALLTRIM(STR(nLinPlan)) + ':F' + ALLTRIM(STR(nLinPlan))

      nLinPlan++
	TMP_ITENS->( DBSKIP() )
END


   oSheet:Cells( nLinPlan, 4 ):Value               := ntotQtd
   oSheet:Cells( nLinPlan, 4 ):Font:Bold           := .T.
   oSheet:Cells( nLinPlan, 4 ):Font:ColorIndex     := 02  //-- Cor da letra Branca
   oSheet:Cells( nLinPlan, 4 ):HorizontalAlignment :=  4  //-- Right
   oSheet:Cells( nLinPlan, 4 ):NumberFormat        := "#.##0,00"

   oSheet:Cells( nLinPlan, 6 ):Value               := nTotValor
   oSheet:Cells( nLinPlan, 6 ):Font:Bold           := .T.
   oSheet:Cells( nLinPlan, 6 ):Font:ColorIndex     := 02  //-- Cor da letra Branca
	oSheet:Cells( nLinPlan, 6 ):HorizontalAlignment :=  4  //-- Right
   oSheet:Cells( nLinPlan, 6 ):NumberFormat        := "#.##0,00"

	oSheet:Range( 'A' + ALLTRIM(STR(nLinPlan)) + ':F' + ALLTRIM(STR( nLinPlan ))):Interior:ColorIndex := 21

   // Colocar Bordas:
   cIntervalo := 'A1:F' + ALLTRIM(STR( nLinPlan ) )
   oSheet:Range(cIntervalo):Borders(1):LineStyle:= 1
   oSheet:Range(cIntervalo):Borders(2):LineStyle:= 1
   oSheet:Range(cIntervalo):Borders(3):LineStyle:= 1
   oSheet:Range(cIntervalo):Borders(4):LineStyle:= 1

   * Retrieve the FileFormat
   nFileFormat = oExcel:WorkBooks(1):FileFormat
	
	cArq := CurDirSys() + 'ProdOrcAgrp' + cTerminal + '.xls'
	Ferase( cArq)
   oSheet:SaveAs( cArq, 56  )  // Salva no Excel 8.0// AKI VC DEFINE A VERSAO DO TEU EXCEL... QTO MAIOR MAIS ATUAL... EU COLOQUEI A 8 Q ABRE MEIO Q EM TODOS HJ MAS PODE COLOCAR MAIS ALTA

   inkey(1)
   Executa(cArq) // AKI ABRE A PLANILHA EQUIVALENTE A RUN NOMEDAPLANILHA.XLS

   oExcel:WorkBooks:Close()
   oExcel:Quit()
   oExcel := NIL // Libera o Excel

   DBCLOSEALL()
RETURN
Aki segue uma prévia das versoes... eu uso a 8, a XLSX deve ser a 12

1987 Excel 2.0 para Windows (Existiu uma versão do excel para DOS, mas não teve aceitacao)
1990 Excel 3.0
1992 Excel 4.0
1993 Excel 5.0 (Office 4.2 & 4.3, versão 32-bit apenas para Windows NT )
1995 Excel 7.0 (Office '95)
1997 Excel 8.0 (Office '97)
1999 Excel 9.0 (Office 2000)
2001 Excel 10.0 (Office XP)
2003 Excel 11.0 (Office 2003)
2007 Excel 12.0 (Office 2007

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Preciso gerar XLSX....

Mensagem por lugab »

Pô, Fladimir, que legal, vou testar. É Harbour ou xHarbour ?

Sabe se o exemplo requer alguma lib ou .ch ou .h ?

Muitíssimo obrigado
lugab
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Preciso gerar XLSX....

Mensagem por fladimir »

Uso no Harbour, mas da pra usar no xHarbour.

Qto a lib se não me engano é a hbwin, mas não tenho certeza, as libs q uso no meu projeto harbour são as abaixo:

-lhbxpp
-lhbct
-lhbtip
-lhbwin // acho q é essa aki não tenho certeza, se não for na minha opinião sobre hbxpp / xhb
-lxhb
-lhbhpdf
-lhbcomm

-llibmysql
-lhbmysql
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Preciso gerar XLSX....

Mensagem por lugab »

Oi Fladimir,

Faltou a Funcao Cria_ole() e não compilou.

Vc poderia passar ela para mim ? To usando Harbour 2.0 com a lib hbwin
lugab
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Preciso gerar XLSX....

Mensagem por fladimir »

Código: Selecionar todos

/*------------------------------------------------------------------------------
 * Cria Objeto OLE
 */	
function Cria_OLE(cObj_OLE, cMsg, lGetActiveObj)
	local oObj_OLE := NIL

	DEFAULT cMsg TO 'Erro ao tentar carregar objeto;;Tente novamente'
	DEFAULT lGetActiveObj TO .F.

	if lGetActiveObj
	   TRY
	      oObj_OLE := GetActiveObject( cObj_OLE )
	   CATCH
			TRY
				oObj_OLE := CREATEOBJECT(cObj_OLE)
			CATCH
		   	PTalert(cMsg, {'Ok'}, vcw)
		   	return NIL //oObj_OLE
			END
		END
	else
		TRY
			oObj_OLE := CREATEOBJECT(cObj_OLE)
		CATCH
	   	Alert(cMsg)
	   	return oObj_OLE
		END
	endif	
	
return oObj_OLE
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Preciso gerar XLSX....

Mensagem por lugab »

Oi, Fladimir, ...

Existe um arquivo chamado Tmp_itens q é necessário para testar

Código: Selecionar todos

WHILE TMP_ITENS->(!EOF())
   Mostra("Gerando..."+ STR( (( (nLinPlan-1) / TMP_ITENS->(LastRec()) )*100),3)+"%")
    oSheet:Cells( nLinPlan, 1 ):Value := Alltrim(TMP_ITENS->codi)
    oSheet:Cells( nLinPlan, 2 ):Value := Alltrim(TMP_ITENS->Desc)
   oSheet:Cells( nLinPlan, 3 ):Value := TMP_ITENS->Qtde
   oSheet:Cells( nLinPlan, 4 ):Value := TMP_ITENS->ESTQATUAL
   oSheet:Cells( nLinPlan, 5 ):Value := TMP_ITENS->VL_TOT/TMP_ITENS->QTDE
   oSheet:Cells( nLinPlan, 6 ):Value := TMP_ITENS->VL_TOT

   //-- Totaliza
  ntotQtd += TMP_ITENS->Qtde
  nTotValor += TMP_ITENS->Vl_TOT

   // Formatar c‚lula:
   oSheet:Cells( nLinPlan, 1 ):NumberFormat := "000000"
   oSheet:Cells( nLinPlan, 4 ):NumberFormat := "#.##0,00"
   oSheet:Cells( nLinPlan, 5 ):NumberFormat := "#.##0,00"
   oSheet:Cells( nLinPlan, 6 ):NumberFormat := "#.##0,00"

   //oExcel.ActiveSheet.UsedRange.EntireColumn.Autofit

  // Alinhamento das celulas:
   oSheet:Cells( nLinPlan, 1 ):HorizontalAlignment := 3 //-- Centro
   oSheet:Cells( nLinPlan, 5 ):HorizontalAlignment := 4 //-- Right
   oSheet:Cells( nLinPlan, 6 ):HorizontalAlignment := 4 //-- Right
                  
   cIntervalo := 'A' + ALLTRIM(STR(nLinPlan)) + ':F' + ALLTRIM(STR(nLinPlan))

   nLinPlan++
 TMP_ITENS->( DBSKIP() )
END

Como posso obter ele ? Deve ser criado em tempo de execução ? Se sim, quais seriam os campos ?

PS: Eu uso Harbour 2.0 e linky a Hbwin.lib
lugab
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Preciso gerar XLSX....

Mensagem por fladimir »

Tmp_itens é um DBF temporário q crio ao executar o relatório e alimento os campos conforme a necessidade, mas poderia ser uma tabela qualquer, produtos por exemplo, é os campos vc pode alterar para os teus mesmo mesmo.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Preciso gerar XLSX....

Mensagem por lugab »

Beleza. Fladimir, vou testar
lugab
Responder