Página 1 de 1

Preciso gerar XLSX....

Enviado: 15 Jun 2015 14:31
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,

Preciso gerar XLSX....

Enviado: 15 Jun 2015 15:23
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.

Preciso gerar XLSX....

Enviado: 15 Jun 2015 18:43
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 ?

Preciso gerar XLSX....

Enviado: 15 Jun 2015 20:27
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

Preciso gerar XLSX....

Enviado: 15 Jun 2015 21:16
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

Preciso gerar XLSX....

Enviado: 15 Jun 2015 21:54
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

Preciso gerar XLSX....

Enviado: 18 Jun 2015 00:02
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

Preciso gerar XLSX....

Enviado: 18 Jun 2015 00:29
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

Preciso gerar XLSX....

Enviado: 18 Jun 2015 01:11
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

Preciso gerar XLSX....

Enviado: 18 Jun 2015 08:17
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.

Preciso gerar XLSX....

Enviado: 22 Jun 2015 05:09
por lugab
Beleza. Fladimir, vou testar