Página 2 de 3

Abrir arquivo do excel

Enviado: 11 Jul 2022 16:29
por JoséQuintas
carlaoonline escreveu:Gero planilhas com fórmulas, gráficos e até com macros. Algumas coisas são mais fáceis e outras mais chatas.
Eu apenas gero as informações.
Eles que se virem.

Abrir arquivo do excel

Enviado: 17 Jul 2022 16:19
por lucimauro
Teria algum exemplo carlaoonline para postar aqui ?

Abrir arquivo do excel

Enviado: 17 Jul 2022 17:28
por JoséQuintas
bencz escreveu:AI q tah jovem, usar o Ado tranquilo, mas vamos supor o caso extremo, que o usuario não tenha Office instalado na maquina, nem o Br Office, complica em!
Voltando um pouco atrás...

OLE é usar rotinas do próprio Excel.
Depende diretamente do Excel instalado.

ADO é pra usar bases de dados, e o Excel acaba sendo uma delas.
NÃO precisa ter Excel, mas.... precisa do ODBC pra Excel, que a Microsoft fornece grátis, caso não esteja instalado na máquina.

Só que curiosamente não consigo abrir os arquivos que a ANP envia em formato Excel.
Só consigo depois que abro no OpenOffice e peço pra salvar no formato Excel.
Eu nem me interessei em saber o porque disso.
Então... eventualmente tem isso.

Abrir arquivo do excel

Enviado: 18 Jul 2022 09:10
por carlaoonline
Bom dia!
lucimauro escreveu:Teria algum exemplo carlaoonline para postar aqui ?
Não tenho nada didático pronto, mas vou postar aqui uma planilha feita e a função que chamei para faze-la.

Essa planilha foi chamada dessa forma.

EXPORTA_TO_NEW_EXCEL("CT_FERIAS")

Dê uma olhada na função apenas para ter uma ideia de como são os comando. Lá no site do desenvolvedor tu vai achar vários exemplos prontos e fáceis de entender.

O único ponto negativo que achei foi que para fazer as bordar tanto em uma célula quanto um quadro com várias células tem que fazer Loops e dar o comando célula por célula e lado por lado na célula, porém o bom é que grava o arquivo livre de qualquer dependencia de algo que tenha que estar instalado na máquina, tanto em Windows quanto em Linux (nesse último nunca testei).

O código está meio gambiarriado pois eu estava aprendendo os comando e ia escrevendo provisoriamente no código conforme ia aprendendo... depois ficou assim mesmo..

Código: Selecionar todos

//
// FUNCAO -> EXPORTA PARA NEW EXCEL
// Daqui para baixo refere-se ao exportar para Excel com a lib xlsxwriter, conforme o codigo e explicacoes a seguir

// jmcnamara@cpan.org  (para ajuda)   Demais formatos em -> hblibxlsxwriter.prg (se mudar tem que criar a biblioteca libhblibxlsxwriter.a novamente.
// Exporta para Excel(xlsx ou xlsm) SEM PRECISAR TER O EXCEL INSTALADO.
// COMPILAR com a lib do xlsxwriter   :     -lhblibxlsxwriter
// Precisa ter no SET LIB ou na pasta que esta compilando essas 3 libs:
//   libxlsxwriter.dll ,   libwinpthread-1.dll   e   libgcc_s_sjlj-1.dll
// Se nao tiver elas na pasta do executavel entao podera trancar ou dar erro....
// ATENCAO: Usar #include "hblibxlsxwriter.ch"  no modulo que estiver a funcao
//
// Todos os comandos possiveis estao listados no format.h que foram incorporados na lib libhblibxlsxwriter.a qdo foi compilado o hblibxlsxwriter.prg (eh nesse prg que uso os formatos do format.h pelo include)
// LibreOffice   -->  Para mostrar cauculo de formulas:  Menu Ferramentas->Opcoes->LibreOfiice Calc->Formula->Recalcular ao Carregar arquivo->Excel e sucessores->Sempre recaucular.
//
//
//               ==>>  USAR FORMULAS EM INGLES NOS COMANDOS
//
//
//                      ATENCAO    ATENCAO    ATENCAO
//
//      ==>>  Usar  ,    ao invez  de  ;     nos comandos IF   e talves em outros
//
//

// Formatar uma coluna inteira:
   // Sera aplicado a todas as celulas QUE NAO POSSUEM FORMATO ( a linha tem preferencia pela coluna -> hblibxlsxwriter.prg)
   // lxw_worksheet_set_column(aAba[01], 1, 1, 11, format)  // Largura da coluna 1 para 11 no format

// Inserir comentario na celula:
   // lxw_worksheet_write_comment(worksheet7, CELL("C3"), "Hello", text_wrap)   // quebra o texsto na celula

// Permite/aceita  Chr( 10 ) para gerar quebra de texto na celula. Pode usar write ou merge.
   // lxw_worksheet_merge_range( aAba[02], nLinha+1, 1, nLinha+2, 8, "Aparece na primeira linha"+ Chr( 10 )+"Aparece na segunda" ,formato14)

// Inserir projeto VBA
   // Para extrair o VbaProject.bin do arquivoexcel.xlsm, use o descompactador 7-zip.exe (ou no linux use: unzip -j macro01.xlsm xl/vbaProject.bin )
   // lxw_workbook_add_vba_project(projeto, "vbaProject.bin") // -> PARA FUNCIONAR TEM QUE GRAVAR COM EXTENSAO XLSM O ARQUIVO.

// Inserir uma imagem sem formatacao, usa os parametros da propria imagem.
   // lxw_worksheet_insert_image(aAba[01], 0, 0, CAMINHO+"cabecap.jpg")

// Insere Imagem com opcoes. Detalhes em -> hblibxlsxwriter.prg
   /*
    options:= { => }
    options[ "x_offset" ]:= 1
    options[ "y_offset" ]:= 2
    options[ "x_scale"  ]:= 1.2
    options[ "y_scale"  ]:= 1.1
    options[ "object_position" ]:= 1
    options[ "description" ]:= "descricao"
    options[ "url" ]:= "www.google.com"
    options[ "tip"" ]:= "Clique para acessar"

    lxw_prepare_image_options(options)

    OU

    lxw_image_options options = {.x_offset = 30,  .y_offset = 10, .x_scale  = 0.5, .y_scale  = 0.5}

    worksheet_insert_image_opt(worksheet, 2, 1, "logo.png", &options)

   */

// Cor da aba da planilha (Onde fica o nome da planilha)
   // lxw_worksheet_set_tab_color(aAba[01], 0xFF9900) // Laranja - Cor da aba

// Cor de fundo da celula ou range de celulas
   //lxw_format_set_bg_color(formato00, 0xDDD9C4) // 221-217-196 Cinza Fraco (mais escuro)
   //lxw_format_set_bg_color(formato00, 0xF2F2F2) // 242-242-242 Cinza Fraco (mais claro)
   //lxw_format_set_bg_color(formato00, 0xFFC000) // 255 192 0 Amarelo quase mostarda
   //lxw_format_set_bg_color(formato00, 0xFFFFFF) // 255 255 255 Branco (Intensidade Maxima das 3 cores RGB gera o Branco)

// Alguns formatos:
   // lxw_format_set_num_format(formato01, "0.000")       // 3.1415926
   // lxw_format_set_num_format(formato02, "#,##0")     // 3.142
   // lxw_format_set_num_format(formato03, "#,##0.00")  // 1,235
   // lxw_format_set_num_format(formato04, "0.00")      // 1,234.56
   // lxw_format_set_num_format(formato05, "mm/dd/yy")  // 31/12/21

   // lxw_format_set_hidden(formato07)   // Esconde a formula na celula.
   // lxw_format_set_font_size(  formato00, 16)  // Tamanho da fonte
   // lxw_format_set_rotation(format05, -270)  // Rotacao do conteudo
   // lxw_format_set_align(      formato00, LXW_ALIGN_CENTER)  // Centra horizontalemnte
   // lxw_format_set_align(      formato00, LXW_ALIGN_VERTICAL_CENTER) // Centra verticalmente
   // lxw_format_set_bold(       formato00)  // Fonte em bold
   // lxw_format_set_bg_color(   formato00, 0x366092) // 54 96 146 Azul medio
   // lxw_format_set_font_color( formato00, 0xFFFFFF) // Branco
   // lxw_format_set_font_name(  formato00, "Arial")  // Nome da fonte
   // lxw_format_set_border(     formato00, LXW_BORDER_THIN) // Borda em toda a cellua
   // lxw_format_set_bottom(     formato09, LXW_BORDER_THIN)  // Somente borda inferior. Aceita Top,Left, Right
   
// Formatar celulas mas sem colocar conteudo.
   // lxw_worksheet_write_blank(worksheet, row, col, format)

// Unir celular (merge/mesclar)
   // lxw_worksheet_merge_range(worksheet, ++row, col, row+1, col+3, "Worksheet Merge Range Test", format )
   //lxw_worksheet_merge_range( aAba[01], 0, 0, 0, 8, "Listagem de Valores de VT - "+DTOC(DI)+" a "+DTOC(DF)  ,formato00) // Une as celulas da coordenada 1,0 ate a coordenada 1,8 Em linha unica e no formato04

// Congelar linhas e colunas (com opcoes veja _opt no hblibxlsxwriter.prg)
   // worksheet_freeze_panes(worksheet1, 1, 0) // Freeze the first row.
   // worksheet_freeze_panes(worksheet2, 0, 1) // Freeze the first column.
   // worksheet_freeze_panes(worksheet3, 1, 1) // Freeze first row/column.
   // Ver tambem -> lxw_worksheet_freeze_panes_opt(worksheet, first_row, first_col, top_row, left_col, type)   // Congelar linhas ou colunas

// Definir medidas do papel usado: (Tem lista completa de codigos no hblibxlsxwriter.prg
   // worksheet_set_paper(worksheet1, 1)  // US Letter -> 8 1/2 x 11 in
   // worksheet_set_paper(worksheet2, 9)  // A4  -> 210 x 297 mm

// Definir area de impressao: Printer area. Pode ser usado com coordenadas numericas ou de celulas.
   // worksheet_print_area(worksheet, 0, 0, 41, 10) // A1:K42.
   // lxw_worksheet_print_area(worksheet, LXW_RANGE("A1:F12") )  ou sem LXW -> worksheet_print_area(worksheet, RANGE("A1:K42"))

// Seta o ZOOM de impressao (escala de impressao) (de 10 a 400)
   // lxw_worksheet_set_print_scale(worksheet1, 75)  // escala de impressao. Vai de 10 a 400. Default=100

// Escala para fit to page:
   // lxw_worksheet_fit_to_pages(worksheet1, 1, 1) // Fit to 1x1 pages.
   // lxw_worksheet_fit_to_pages(worksheet2, 2, 1) // Fit to 2x1 pages.
   // lxw_worksheet_fit_to_pages(worksheet3, 1, 2) // Fit to 1x2 pages.

// Seta as margens de impressao
   // lxw_worksheet_set_margins(aAba[02], -1, -1, 0.63, 0.63)  // Em polegadas, Usar -1 mantem o padrao atual  // Seta as margens de impressao (left, right, top, bottom)
   
// Seta a orientacao de impressao de cada planilha
   // lxw_worksheet_set_landscape(worksheet)
   // lxw_worksheet_set_portrait(worksheet)

// Inibir ou Imprimir as linhas de grades da celula:
   // worksheet_gridlines(worksheet1, LXW_HIDE_ALL_GRIDLINES)  // Inibe
   // worksheet_gridlines(worksheet2, LXW_SHOW_PRINT_GRIDLINES) // Mostra na impressao

// Inibe qualquer valor igual a ZERO nas celulas da planilha aAba[01]
    // lxw_worksheet_hide_zero(aAba[01])

// Definir uma variavel para ser usada dentro do Excel:
   //lxw_workbook_define_name(workbook, "Exchange_rate", "=0.96")  // Aqui define a variavel Exchange_rate=0,96
   //lxw_worksheet_write_formula(worksheet, 2, 1, "=Exchange_rate", NULL) // Aqui um exemplo da aplicacao de uso de variavel...

// Inserir dados nas celulas:
   // lxw_worksheet_write_string(aAba[01], nRegAtual+2, 1, APELIDO, &formato01)  // Pode usar o MERGE tambem para inserir dados.
   // lxw_worksheet_write_number(aAba[01], nRegAtual+2, 0, NUMERO, format)
   // lxw_worksheet_write_boolean(worksheet, row, col, value, format)
   // lxw_worksheet_write_url(worksheet, 0, 0, "external:c:/temp/foo.xlsx",  format)  // link url endereco de site
   // lxw_worksheet_write_formula(aAba[01], 0,2, "=SUM(C2:C5)", format)
   // lxw_worksheet_write_array_formula(worksheet, 0, 0, 0, 0, "{=SUM(B1:C1*B2:C2)}", NIL)

// Esta desabilitado no hblibxlsxwriter.prg , mas da para habilitar. Uso .opt (parametro de opcoes)
   // lxw_worksheet_set_row_opt(worksheet, row, height, format, lxw_row_col_options *options)

// Determina qual planilha tera visibilidade inicial
   // lxw_worksheet_set_first_sheet(worksheet)

// Seta o ZOOM na tela  (de 10 a 400)
   //lxw_worksheet_set_zoom(worksheet, 30)

// Torna invisivel uma planilha
   // lxw_worksheet_hide(worksheet)

// Configura alguma fontes para serem usadas em graficos
   // font1 = {"name" => "Calibri", "color" => LXW_COLOR_BLUE, "size" => 10 }
   // font2 = {"name" => "Courier", "color" => 0x92D050, "size" => 20 }
   // font3 = {"name" => "Arial",   "color" => 0xFFFFFF, "size" => 16, "bold" => LXW_TRUE, "alingn" => LXW_ALIGN_VERTICAL_CENTER }

// Seleciona celulas
   // lxw_worksheet_set_selection(worksheet1, 3, 3, 3, 3)     // Cell D4 ou outras coordenadas.
   // lxw_worksheet_set_selection(worksheet5, RANGE("D4:G7")) // Using the RANGE macro.

// Adiciona um grafico na arquivo
  // chart2 = lxw_workbook_add_chart(projeto, LXW_CHART_COLUMN)  //        chart_types:= {LXW_CHART_COLUMN, LXW_CHART_AREA, LXW_CHART_LINE, LXW_CHART_PIE}

// Cria opcoes para a apresentacao do grafico
  // options:= { => }
  // options[ "x_offset" ]:= 1  // 4
  // options[ "y_offset" ]:= 2  // 5
  // options[ "x_scale"  ]:= 1.2
  // options[ "y_scale"  ]:= 1.1
  // options[ "object_position" ]:= 1

// Insere (mostra) o grafico COM OPCOES (opt) em uma planilha.
   // lxw_worksheet_insert_chart_opt(aAba[01], LXW_CELL("B"+ALLTRIM(STR(nLinha+4))), chart1, options)  // Insere o grafico no arquivo COM OPCOES CONFIGURADAS/PERSONALIZADAS


   // USAR  --->>>  hb_StrToUTF8(cTexto)  -->>  para exportar qualquer texto com acento, caso contrario ficara celulas em braco


FUNCTION EXPORTA_TO_NEW_EXCEL(cArq,aAba,cExtensao)  // Aba tem que vir um Array com o nome das Abas a serem criadas
local projeto, AA, BB, CC, nTotReg, nRegAtual, EE, FF , nLinha , vetor1 , vetor2, chart1, chart2, aAba2, series , categoria, valores
local DiasUteis, DiasUteisInterno, DiasUteisExterno, VETOR3:={}

aAba=IF(aAba=NIL,{"Aba01"},aAba)
cExtensao=IF(cExtensao=NIL,"xlsx",cExtensao)  // Se nao vier "xlsm" ou outro entao assume "xlsx"

// Definindo nome do arquivo a ser gerado (e sua extensao conforme parametro passado) Para extrair o VbaProject.bin do arquivoexcel.xlsm para usa-lo no add_vba_project... use o descompactador 7-zip.exe e localize o arquivo vbaproject.bin para copia-lo  (ou baixe um aplicativo para extrair -> https://metacpan.org/dist/Excel-Writer-XLSX/view/bin/extract_vba )
BB=NET8+ALLTRIM(STR(INT(SECOND())))+"."+cExtensao  // ".xlsx" ou "xlsm", nesse ultimo podera receber o vbapject.bin (macros)

AGUARDE(.T.)

// Inicializa a biblioteca...
lxw_init()

// Criar um novo projeto (arquivo xlsx ou xlsm)
projeto  = lxw_new_workbook(BB)   // lxw_workbook_new("demo.xlsx") ( lxw_workbook_new(BB) invertido tb funciona)

// Adiciona as Worksheets (Abas)
aAba2=aClone(aAba)  // Pois no add_worksheet o aAba passa para um valor numerico e perco o nome das abas....
FOR FF=1 TO LEN(aAba)  // Adiciona abas conforme vetor aAba
    aAba[FF] = lxw_workbook_add_worksheet(projeto, aAba[FF])  //(ArqXLS, NomeDaAba)
    // Agora aAba[FF] eh um numero e nao mais string....
NEXT



//-------------------------------------------------------------------------
// Criando formatos (do formato00 ate formato08) e setando as configuracoes
//-------------------------------------------------------------------------
for FF=0 to 18
    AA="formato"+RIGHT("00"+ALLTRIM(STR(FF)),2)
    &AA=lxw_workbook_add_format(projeto)  // Cria/inmicializa o formato
next

     lxw_format_set_align(      formato00, LXW_ALIGN_CENTER)  // Titulo
     lxw_format_set_align(      formato00, LXW_ALIGN_VERTICAL_CENTER)
     lxw_format_set_bold(       formato00)
     lxw_format_set_bg_color(   formato00, 0x366092) // 54 96 146 Azul medio
     lxw_format_set_font_color( formato00, 0xFFFFFF)
     lxw_format_set_font_name(  formato00, "Arial")
     lxw_format_set_border(     formato00, LXW_BORDER_THIN)

     lxw_format_set_num_format( formato01, "0000")        // 3141 // Numero do func
     lxw_format_set_font_color( formato01, 0x366092)      // 54 96 146 Azul medio

     lxw_format_set_num_format( formato02, "DD/MM/YYYY")  // 31/12/2021  // DFata
     lxw_format_set_align(      formato02, LXW_ALIGN_CENTER)
     
     lxw_format_set_bold(       formato03)   // Cabecalho
     lxw_format_set_bg_color(   formato03, 0xFFC000) // 255 192 0 Amarelo quase mostarda
     lxw_format_set_align(      formato03, LXW_ALIGN_CENTER)
     lxw_format_set_align(      formato03, LXW_ALIGN_VERTICAL_CENTER) // Alinhamento vertical na celula

     lxw_format_set_bold(       formato04)  // LIsta clara
     lxw_format_set_bg_color(   formato04, 0x00FFFF)
     lxw_format_set_align(      formato04, LXW_ALIGN_VERTICAL_CENTER) // Alinhamento vertical na celula

     lxw_format_set_align(      formato05, LXW_ALIGN_CENTER)  // Lista escura

     lxw_format_set_font_color( formato06, 0xFF0000)  // Palavra "pendente" em vermelho
     lxw_format_set_align(      formato06, LXW_ALIGN_CENTER)

     lxw_format_set_num_format( formato07, "#,##0.00") // 1,256.50  // Valores das ferias na tabela abaixo da listagem

     lxw_format_set_align(      formato08, LXW_ALIGN_CENTER) // Cabecalho
     lxw_format_set_align(      formato08, LXW_ALIGN_VERTICAL_CENTER)
     lxw_format_set_fg_color(   formato08, 0xD7E4BC)
     lxw_format_set_bold(       formato08)
     lxw_format_set_border(     formato08, LXW_BORDER_THIN)
     
     lxw_format_set_bold(       formato09) // Palavra Total
     lxw_format_set_bottom(     formato09, LXW_BORDER_THIN)

     lxw_format_set_num_format( formato10, "0000")        // 3141 // Numero do func SUBLINHADO
     lxw_format_set_font_color( formato10, 0x366092)      // 54 96 146 Azul medio
     lxw_format_set_bottom(     formato10, LXW_BORDER_THIN)

     lxw_format_set_border(     formato11, LXW_BORDER_THIN) // Com toda borda

     lxw_format_set_bold(       formato12) // Soma dos vts e some dos V Alimentacao SUBLINHADO
     lxw_format_set_bottom(     formato12, LXW_BORDER_THIN)
     lxw_format_set_num_format( formato12, "#,##0.00") // 1,256.50  // Valores das ferias na tabela abaixo da listagem

     lxw_format_set_bottom(     formato13, LXW_BORDER_THIN)  // Ultima linha Sublinhada numero
     lxw_format_set_num_format( formato13, "#,##0.00") // 1,256.50  // Valores das ferias na tabela abaixo da listagem

     lxw_format_set_bold(       formato14)  // Cabecalho do recibo com BORDA
     lxw_format_set_border(     formato14, LXW_BORDER_THIN)
     lxw_format_set_align(      formato14, LXW_ALIGN_CENTER) // Alinhamento vertical na celula
     lxw_format_set_text_wrap(  formato14)  // Permite/aceita  Chr( 10 ) para gerar quebra de texto na celula.  Ex.:            lxw_worksheet_merge_range( aAba[02], nLinha+1, 1, nLinha+2, 8, "Aparece na primeira linha"+ Chr( 10 )+"Aparece na segunda" ,formato14)

     lxw_format_set_right(      formato15, LXW_BORDER_THIN)  // Bordas para o quadro do recibo
     lxw_format_set_left(       formato16, LXW_BORDER_THIN)   // Bordas para o quadro do recibo
     lxw_format_set_bottom(     formato17, LXW_BORDER_THIN) // Bordas para o quadro do recibo
     lxw_format_set_top(        formato18, LXW_BORDER_THIN) // Bordas para o quadro do recibo


//-------------------------------------------------------------------------
// FIM da criacao e configuracao do formatos
//-------------------------------------------------------------------------



//-----------------------------------------------------------
// Configuracoes iniciais (Antes do Loop dos registros)
//-----------------------------------------------------------
DO CASE
   CASE cArq="CD_VT"

        lxw_worksheet_set_margins(aAba[02], -1, -1, 0.63, 0.63)  // Em polegadas, Usar -1 mantem o padrao atual  // Seta as margens de impressao (left, right, top, bottom)

        // Para extrair o VbaProject.bin do arquivoexcel.xlsm, use o descompactador 7-zip.exe (ou no linux use: unzip -j macro01.xlsm xl/vbaProject.bin )
        lxw_workbook_add_vba_project(projeto, "vbaProject.bin") // Ex.:  Extenso_valor(A1)  -> PARA FUNCIONAR TEM QUE GRAVAR COM EXTENSAO XLSM O ARQUIVO.
        lxw_worksheet_write_formula(aAba[02], 2, F-1, "=Extenso_Valor(ValoresVT!A5)" )

        SET RELATION TO COD_VT INTO CD_VT  // Ira pegar o campo COD_VT  no CADFUNC.DBF e localizar o respectivo lancamento no CD_VT.DBF
        
        //  =====ATENCAO: SET RELATION SO ACEITA UMA AREA =====
        // SET RELATION TO VA     INTO SAL_CATEG
        // SET RELATION TO CNPJ   INTO CD_CNPJ
        // dbClearRelation() // Fecha relacoes.
        // dbRelation()  // Retorna a expresao do Set RELATION
        // dbRSelect()   // Retorna a area do arquivo destino que esta relacionado.
        // ordSetRelation()  // Relacionar uma área de trabalho especificada à área de trabalho atual
        
        lxw_format_set_font_size(  formato00, 12)
        //VETOR3:={"Func.","Apelido","Setor","Cod","Descri" + CHR( 135 ) + CHR ( 198) + "o do VT","Dias","$ Di" + CHR( 160 ) + "rio","Valor Total","Aliment."}
        VETOR3:={"Func.","Apelido","Setor","Cod","Descri" + CHR( 135 ) + CHR ( 198) + "o do VT","Dias","$ Diario","Valor Total","Aliment."}

        lxw_worksheet_merge_range( aAba[01], 1, 0, 1, 8, "Listagem de Valores de VT - De "+DTOC(DI)+" a "+DTOC(DF) ,formato00) // Une as celulas da coordenada 1,0 ate a coordenada 1,8 Em linha unica e no formato04

        FOR F=1 TO 9
            lxw_worksheet_write_string(aAba[01], 2, F-1, hb_StrToUTF8( VETOR3[F] ) ,formato08 )
        NEXT
        
        lxw_worksheet_set_column(aAba[01], 0, 0, 05, NIL)  // Largura da coluna 0 para 05
        lxw_worksheet_set_column(aAba[01], 1, 1, 11, NIL)  // Largura da coluna 1 para 11
        lxw_worksheet_set_column(aAba[01], 3, 3, 04, NIL)  // Largura da coluna 3 para 04
        lxw_worksheet_set_column(aAba[01], 4, 4, 15, NIL)  // Largura da coluna 4 para 14
        lxw_worksheet_set_column(aAba[01], 5, 5, 05, NIL)  // Largura da coluna 5 para 05
        lxw_worksheet_set_column(aAba[01], 6, 6, 10, NIL)  // Largura da coluna 6 para 10
        lxw_worksheet_set_column(aAba[01], 7, 7, 10, NIL)  // Largura da coluna 7 para 10
        lxw_worksheet_set_column(aAba[01], 8, 8, 10, NIL)  // Largura da coluna 8 para 10
        
        lxw_worksheet_set_column(aAba[02], 0, 0, 03, NIL)  // Largura da coluna 0 para 03
        lxw_worksheet_set_column(aAba[02], 8, 8, 10, NIL)  // Largura da coluna 8 para 10
        lxw_worksheet_set_column(aAba[02], 9, 9, 03, NIL)  // Largura da coluna 9 para 03

        DiasUteisExterno=DIAS_UTEIS(DI,DF,"E")	// Pega total de dias uteis dos Externos
	       DiasUteisInterno=DIAS_UTEIS(DI,DF,"I") // Pega total de dias uteis dos Internos


   CASE cArq="CT_FERIAS"  // Mas esta aberto o CADFUNC com alias CADFERIAS...
        vetor1:={0,0,0,0,0,0,0,0,0,0,0,0}  // Quantidade de funcionarios que vence ferias naquele mes
        vetor2:={0,0,0,0,0,0,0,0,0,0,0,0}  // Soma do salario categoria dos func daquele mes.
        USE_ARQ("SAL_CATEG",,"NEW",,"SAL_CAT_FE")
        OrdSetFocus("SC")
        USE_ARQ("CT_FERIAS",,"NEW",,"LANCAFERIA")
        OrdSetFocus("FUNC")
        SELE("CADFERIAS")
        SET RELATION TO SC INTO SAL_CAT_FE
        
        // Pintando uma area
        lxw_worksheet_print_area(projeto, LXW_RANGE("A1:A12") )

        lxw_worksheet_merge_range( aAba[01], 0, 0, 0, 8, hb_StrToUTF8( "Controle de F" + CHR( 130 ) + "rias" ),formato00) // Une as celulas da coordenada 1,0 ate a coordenada 1,8 Em linha unica e no formato04



ENDCASE
//-----------------------------------------------------------
// FIM das Configuracoes iniciais (Antes do Loop dos registros)
//-----------------------------------------------------------


//-----------------------------------------------------------
// Inicio das Insercoes de dados - LOOP dos REGISTROS
//-----------------------------------------------------------
nLinha=1
GO TOP
nTotReg=ORDKEYCOUNT()  // <-- Ja sabemos qual sera a ultima linha de dados  (linha atual + EE)

FOR nRegAtual=1 TO nTotReg   // DO WHILE !EOF()
    DO CASE
       CASE ARK="CD_VT"

            DiasUteis=IF(UPPER(SETOR)="E",DiasUteisExterno,DiasUteisInterno)

            formato=IF(nRegAtual=nTotReg,"formato17","NIL")
            formato2=IF(nRegAtual=nTotReg,"formato10","formato01")
            formato3=IF(nRegAtual=nTotReg,"formato13","formato07")

            /* Planilha  ValoresVT  */

            lxw_worksheet_write_number(aAba[01], nRegAtual+2, 0, NUMERO, &formato2)
            AAA=hb_StrToUTF8( To_Lower(APELIDO) )
            lxw_worksheet_write_string(aAba[01], nRegAtual+2, 1, AAA, &formato)

            lxw_worksheet_write_string(aAba[01], nRegAtual+2, 2, hb_StrToUTF8( To_Lower(SETOR) ), &formato)
            lxw_worksheet_write_number(aAba[01], nRegAtual+2, 3, COD_VT, &formato)
            lxw_worksheet_write_string(aAba[01], nRegAtual+2, 4, hb_StrToUTF8( To_lower(CD_VT->DESCRI) ), &formato)

            AAA="=IF(C"+ALLTRIM(STR(nRegAtual+3))+"="+chr(34)+"Externo"+chr(34)+",F"+alltrim(str(nTotReg+6))+",F"+alltrim(str(nTotReg+7))+")"
            lxw_worksheet_write_formula(aAba[01], nRegAtual+2, 5, AAA , &formato) // Quantidade de func no mes


            AAA="=IF(D"+ALLTRIM(STR(nRegAtual+3))+"<50,"+ALLTRIM(STR(CD_VT->VALOR*2))+",H"+ALLTRIM(STR(nRegAtual+3))+"/F"+ALLTRIM(STR(nRegAtual+3))+")"
            //AAA=StrTran(AAA, ".", ",")   // Troca em AAA o "." por ","  Ex.:   =SE(D7<50;F7*G7;"6.10")   -->>   =SE(D7<50;F7*G7;"6,10")
            lxw_worksheet_write_formula(aAba[01], nRegAtual+2, 6, AAA, &formato3)


            AAA="=IF(D"+ALLTRIM(STR(nRegAtual+3))+"<50,F"+ALLTRIM(STR(nRegAtual+3))+"*G"+ALLTRIM(STR(nRegAtual+3))+","+ALLTRIM(STR(CD_VT->VALOR))+")"
            //AAA=StrTran(AAA, ".", ",")   // Troca em AAA o "." por ","  Ex.:   =SE(D7<50;F7*G7;"6.10")   -->>   =SE(D7<50;F7*G7;"6,10")
            lxw_worksheet_write_formula(aAba[01], nRegAtual+2, 7, AAA, &formato3)


            // nAlimentacao=IF("OPERADOR"$UPPER(CARGO),600,300)  // Substituir pelo valor do COD no arquivo CODIGOS conforme lancamento na CADFUNC campo VA
            nAlimentacao=IF(VA<>0 .AND. SAL_CATEG->(DbSeek(CADFUNC->VA)),SAL_CATEG->SAL_CAT,0)   // Se existir no SAL_CATEG.DBF um codigo SC igual ao lancado no campo VA no CADFUNC.DBF entao lanca ele, senao lanca 0.
            lxw_worksheet_write_number(aAba[01], nRegAtual+2, 8, nAlimentacao, &formato3)


            /* Planilha  Recibos  */

            lxw_worksheet_merge_range( aAba[02], nLinha+1, 1, nLinha+2, 8, hb_StrToUTF8( "RECIBO DE VALE TRANSPORTE A ALIMENTA" + CHR( 128 ) + CHR ( 199) + "O")+ Chr( 10 )+    hb_StrToUTF8("DECRETO N" + CHR( 167 )) + " 95247 DE 17/11/87" ,formato14) // Une as celulas das coordenadas  e quebra de linha com set_wrap no formato14
            lxw_worksheet_merge_range( aAba[02], nLinha+3, 1, nLinha+3, 6, "Func. "+RIGHT("000"+ALLTRIM(STR(NUMERO)),4)+" - "+ALLTRIM(hb_StrToUTF8(NOME))  ,NIL) // Une as celulas das coordenadas
            lxw_worksheet_write_string(aAba[02], nLinha+3, 7, "Valor-> ", formato05)
            AAA="=Recibos!I"+ALLTRIM(STR(nLinha+9))
            lxw_worksheet_write_formula(aAba[02], nLinha+3, 8, AAA, formato12)

            lxw_worksheet_merge_range( aAba[02], nLinha+4, 1, nLinha+4, 8, "Empresa: "+ IF(CNPJ<>0 .AND. CD_CNPJ->(DbSeek(CADFUNC->CNPJ)), hb_StrToUTF8( CD_CNPJ->RAZAO ),"") , formato11) // Une as celulas das coordenadas

            lxw_worksheet_write_string(aAba[02], nLinha+5, 1, "Quant.", formato05)
            lxw_worksheet_merge_range( aAba[02], nLinha+5, 2, nLinha+5, 6, hb_StrToUTF8( "Discrimina" + CHR( 135 ) + CHR ( 198) + "o" ),formato05) // Une as celulas das coordenadas
            lxw_worksheet_write_string(aAba[02], nLinha+5, 7, "Unit.", formato05)
            lxw_worksheet_write_string(aAba[02], nLinha+5, 8, "Total", formato05)

            lxw_worksheet_write_formula(aAba[02], nLinha+6, 1, "=ValoresVT!F"+alltrim(str(nRegAtual+3))+"*2", NIL)
            lxw_worksheet_merge_range( aAba[02], nLinha+6, 2, nLinha+6, 6, " Vale transporte", NIL)
            lxw_worksheet_write_formula(aAba[02], nLinha+6, 7, "=ValoresVT!G"+alltrim(str(nRegAtual+3))+"/2", formato07)
            lxw_worksheet_write_formula(aAba[02], nLinha+6, 8, "=Recibos!B"+alltrim(str(nLinha+7))+"*Recibos!H"+alltrim(str(nLinha+7))   , formato07)
            
            lxw_worksheet_merge_range( aAba[02], nLinha+7, 2, nLinha+7, 6, hb_StrToUTF8( " Vale alimenta" + CHR( 135 ) + CHR ( 198) + "o" ), NIL)
            lxw_worksheet_write_formula(aAba[02], nLinha+7, 8, "=ValoresVT!I"+alltrim(str(nRegAtual+3)), formato07)
            
            lxw_worksheet_write_string(aAba[02], nLinha+8, 7, "Soma -> ", formato05)
            lxw_worksheet_write_formula(aAba[02], nLinha+8, 8, "=Recibos!I"+alltrim(str(nLinha+7))+"+Recibos!I"+alltrim(str(nLinha+8)) , formato12)

            lxw_worksheet_merge_range( aAba[02], nLinha+9, 1, nLinha+9, 8, hb_StrToUTF8( "   Recebi  conforme acima descriminado e para a utiliza" + CHR( 135 ) + CHR ( 198) + "o no m" + CHR( 136 ) + "s, a quantia de:") , Formato18)
            lxw_worksheet_write_formula(aAba[02], nLinha+10, 1, "=Extenso_Valor(I"+ALLTRIM(STR(nLinha+9))+")" , NIL )
            lxw_worksheet_write_string(aAba[02], nLinha+12, 1, hb_StrToUTF8("   Autorizo o desconto de at"+CHR( 130)+" 3% no meu sal"+CHR( 160)+"rio ref. ao vale transporte."), NIL)
            lxw_worksheet_write_formula(aAba[02], nLinha+14, 1, "=ValoresVT!E"+alltrim(str(nTotReg+9)) , NIL)
            lxw_worksheet_write_string(aAba[02], nLinha+14, 4, "Ass.:"+REPL("_",40), NIL)

            
            // Monta o quadro ao redor do recibo:
            FOR AAA=nLinha+3 to nLinha+15
                lxw_worksheet_write_blank(aAba[02], AAA, 0, formato15)
                lxw_worksheet_write_blank(aAba[02], AAA, 9, formato16)
            NEXT
            FOR AAA=1 to 8
                lxw_worksheet_write_blank(aAba[02], nLinha+15, AAA, formato17)
            NEXT

            nLinha=nLinha+(IF( nRegAtual/3=INT(nRegAtual/3) ,18,16 ) )
            
      CASE cArq="CT_FERIAS"  // Mas esta aberto o CADFUNC com alias CADFERIAS...
            AA=MONTH(REGISTRO)
            VETOR1[AA]++ // Incementou em 1 a quantidade de func que tiram ferias no mes MONTH(REGISTRO)
            CC=SC
            IF CC<>0 .AND. SAL_CAT_FE->SC<>0 // Se nao for 0  (Existe SET RELATION entre CADFUNC e SAL_CAT)
               VETOR2[AA]=VETOR2[AA]+SAL_CAT_FE->SAL_CAT // Incrementou com o valor do Sala Cat do Func o vetor2 MONTH(REGISTRO)
            ENDIF
            lxw_worksheet_write_number(aAba[01], nLinha, 0, NUMERO, formato01)
            lxw_worksheet_write_string(aAba[01], nLinha, 1, To_Lower(APELIDO), NIL)
            lxw_worksheet_write_datetime(aAba[01], nLinha, 2, REGISTRO, formato02)
            // Aqui verifica as ultimas 5 ferias que o funcionarios tirou (ou nao)
            AA=NUMERO
            SELE("LANCAFERIA")
            Set Scope to
            OrdScope( 0, AA )
            OrdScope( 1, AA )
            CC=3
            FOR FF=YEAR(DATE()) TO YEAR(DATE())-5  STEP -1  // Percorre os ultimos 5 anos
                LOCATE FOR YEAR(GOZO_INI)=FF  // Localiza SE existe algum lancamento de ferias com aquele ano
                IF FOUND()  // Se exitir, entao imprime na celula coluna CC
                   lxw_worksheet_write_datetime(aAba[01], nLinha, CC, GOZO_INI, formato02) // Lista sempre os ultimos 5 anos
                 ELSE // Se nao existir lancamento de ferias para aquele ano...

                   IF YEAR(CADFERIAS->REGISTRO)+1 <=FF
                      lxw_worksheet_write_string(aAba[01], nLinha, CC, "pendente", formato06) // Lista sempre os ultimos 5 anos
                    ELSE
                     lxw_worksheet_write_string(aAba[01], nLinha, CC, "------------", formato05 ) // Lista sempre os ultimos 5 anos
                   ENDIF

                ENDIF
                CC++
            NEXT
            SELE("CADFERIAS")
            
            nLinha++

       OTHERWISE
            AGUARDE(.F.)
            lxw_workbook_close(projeto)
            RETURN
    ENDCASE
   

    SKIP
NEXT //ENDDO
//-----------------------------------------------------------
// FIM das Insercoes de dados  No LOOP do DBF()
//-----------------------------------------------------------


//----------------------------------------------------------------
// Formatacao das celulas e finalizacoes apos o loop dos registros
//----------------------------------------------------------------
DO CASE
   CASE cArq="CD_VT"
   
        lxw_worksheet_write_string(aAba[01], nRegAtual+2, 6, "Total ->", formato09)
        lxw_worksheet_write_formula(aAba[01], nRegAtual+2, 7, "=SUM(H4:H"+ALLTRIM(STR(nRegAtual+2))+")", formato12)
        lxw_worksheet_write_formula(aAba[01], nRegAtual+2, 8, "=SUM(I4:I"+ALLTRIM(STR(nRegAtual+2))+")", formato12)

        lxw_worksheet_write_string(aAba[01], nRegAtual+4, 4, hb_StrToUTF8("Dias " + CHR( 163 ) + "teis Externo"), NIL)
        lxw_worksheet_write_string(aAba[01], nRegAtual+5, 4, hb_StrToUTF8("Dias " + CHR( 163 ) + "teis Interno"), NIL)
        lxw_worksheet_write_number(aAba[01], nRegAtual+4, 5, DiasUteisExterno, NIL)
        lxw_worksheet_write_number(aAba[01], nRegAtual+5, 5, DiasUteisInterno, NIL)
        
        lxw_worksheet_write_string(aAba[01], nRegAtual+7, 4, "Ref. "+n_Mes(MONTH(DF))+"/"+RIGHT(ALLTRIM(STR(YEAR(DF))),2), NIL)


   CASE cArq="CT_FERIAS"  // Mas esta aberto o CADFUNC com alias CADFERIAS...
        lxw_worksheet_merge_range( aAba[01], nLinha, 0, nLinha, 8, ALLTRIM(STR(ORDKEYCOUNT()))+" Registros listados",formato00) // Une as celulas da coordenada nLinha,0 ate a coordenada nLinha,8 Em linha unica e no formato04
        

        lxw_worksheet_write_string(aAba[01], 1, 0, "Func.", formato03)
        lxw_worksheet_write_string(aAba[01], 1, 1, "Apelido", formato03)
        lxw_worksheet_write_string(aAba[01], 1, 2, "Registro", formato03)
        CC=3
        FOR FF=YEAR(DATE()) TO YEAR(DATE())-5  STEP -1
           lxw_worksheet_write_number(aAba[01], 1, CC, FF, formato03) // Lista sempre os ultimos 5 anos
           lxw_worksheet_set_column(  aAba[01], 0, CC, 10, NIL)  // Largura da coluna 'CC' para 10
           CC++
        NEXT
        lxw_worksheet_set_row(aAba[01], 0, 20, NIL) // Define a linha 1 com altura 20
        lxw_worksheet_set_row(aAba[01], 1, 25, NIL) // Define a linha 2 com altura 25
        
        lxw_worksheet_set_column(aAba[01], 0, 0, 06, NIL)  // Largura da coluna 0 para 06
        lxw_worksheet_set_column(aAba[01], 1, 1, 15, NIL)  // Largura da coluna 1 para 15
        lxw_worksheet_set_column(aAba[01], 2, 2, 12, NIL)  // Largura da coluna 2 para 12
        lxw_worksheet_set_column(aAba[01], 3, 8, 12, NIL)  // Largura da coluna 3 ate a 8 em 10

       //----- Cria o grafico quantidade  (com o primeiro metodo de programacao)  ----

          // Aqui gera grafico no Google Chart...
          // https://chart.googleapis.com/chart?cht=p3&chd=t:60,30,10&chs=500x200&chl=Entregues|Ocorrencia|Transito&chtt=teste%20do%20dudu
        
       //---- Tabela com os valores do grafico -------------------------
        lxw_worksheet_write_string(aAba[01],  nLinha+4, 1, "Mes", Formato03) // Nome do Mes
        lxw_worksheet_write_string(aAba[01],  nLinha+4, 2, "Quant", Formato03) // Quantidade de func no mes
        lxw_worksheet_write_string(aAba[01],  nLinha+4, 3, "Valor", Formato03) // Valor total do mes
        lxw_worksheet_write_string(aAba[01],  nLinha+4, 4, "1/3", Formato03) // Valor total do mes
        lxw_worksheet_write_string(aAba[01],  nLinha+4, 5, "Total", Formato03) // Valor total do mes

        FOR FF=1 TO 12
            lxw_worksheet_write_string(aAba[01],  nLinha+4+FF, 1, LEFT(N_MES(FF),3), NIL) // Nome do Mes
            lxw_worksheet_write_number(aAba[01],  nLinha+4+FF, 2, VETOR1[FF], NIL) // Quantidade de func no mes
            lxw_worksheet_write_number(aAba[01],  nLinha+4+FF, 3, VETOR2[FF], formato07) // Valor total do mes
            lxw_worksheet_write_number(aAba[01],  nLinha+4+FF, 4, VETOR2[FF]*.33, formato07) // 1/3 do Valor do mes
            lxw_worksheet_write_number(aAba[01],  nLinha+4+FF, 5, VETOR2[FF]*1.33, formato07) // Valor total do mes + 1 terco
        NEXT

        lxw_worksheet_write_string(aAba[01],   nLinha+4+FF, 1,  "Total->"       , NIL)
        lxw_worksheet_write_formula(aAba[01],  nLinha+4+FF, 2, "=SUM(C"+ALLTRIM(STR(nLinha+6))+":C"+ALLTRIM(STR(nLinha+17))+")", NIL) // Quantidade de func no mes
        lxw_worksheet_write_formula(aAba[01],  nLinha+4+FF, 3, "=SUM(D"+ALLTRIM(STR(nLinha+6))+":D"+ALLTRIM(STR(nLinha+17))+")", formato07) // Valor total do mes
        lxw_worksheet_write_formula(aAba[01],  nLinha+4+FF, 4, "=SUM(E"+ALLTRIM(STR(nLinha+6))+":E"+ALLTRIM(STR(nLinha+17))+")", formato07) // 1/3 do Valor do mes
        lxw_worksheet_write_formula(aAba[01],  nLinha+4+FF, 5, "=SUM(F"+ALLTRIM(STR(nLinha+6))+":F"+ALLTRIM(STR(nLinha+17))+")", formato07) // Valor total do mes + 1 terco


        lxw_worksheet_write_string(aAba[01],   nLinha+5+FF, 1,  "Caso os totais nao sejam mostrados, Prescione Ctrl+Shift+F9 p/ recalcular." , NIL)
       //---- Fim da Tabela com os valores do grafico -------------------


        chart1 = lxw_workbook_add_chart(projeto, LXW_CHART_COLUMN)  //        chart_types:= {LXW_CHART_COLUMN, LXW_CHART_AREA, LXW_CHART_LINE, LXW_CHART_PIE}

        // Adicionando serie com CATEGORIA e VALORES em branco para serem setados depois  
        series = lxw_chart_add_series(chart1, NIL, NIL)

        // Configuranco os dados da serie com dados em branco (NIL), pode usar qualque um dos tipos de coordenadas que melhor convier....
        
        // NA LINHA ABAIXO TEM QUE SER O    aAba2   ao Inves do aAba, pois esse segundo item se transformou em um numero na linha acima -> aAba[FF] = lxw_workbook_add_worksheet(projeto, aAba[FF]) 
        lxw_chart_series_set_categories(series, aAba2[01], nLinha+5, 1, nLinha+16, 1) // "=Sheet1!$A$2:$A$7"  - Nomes que vao embaixo de cada barra
        lxw_chart_series_set_values(series,     aAba2[01], nLinha+5, 2, nLinha+16, 2) // "=Sheet1!$C$2:$C$7"  - Valores que guiarao a altura das barras
        // lxw_chart_series_set_name_range(series, aAba[01], 0, 2)       // "=Sheet1!$C$1"       - Nome da legenda ( a padrao eh 'Serie 1' )

        // Titulo do grafico, nome horizontal X e nome vertical Y 
        lxw_chart_title_set_name(chart1,        "Quantidade de ferias por Mes")
        // lxw_chart_axis_set_name(LXW_GET_X_AXYS(chart), "Test number") // Legenda Horizintal inferior
        // lxw_chart_axis_set_name(LXW_GET_Y_AXYS(chart), "Sample length (mm)")  // Legenda lateral esquerda
        
        lxw_chart_legend_set_position(chart1, LXW_CHART_LEGEND_NONE)  // LXW_CHART_LEGEND_BOTTOM)         lxw_chart_legend_set_font(chart, font6 ) //LXW_GET_CHART_FONTS('Arial', 10, LXW_FALSE, LXW_FALSE, LXW_FALSE, 30, 0x7030A0 ) )
        lxw_chart_set_style(chart1, 43)  // Stilo 43
        
        
/*  Essa funcao de parametros para o grafico esta em ->   hblibxlsxwriter.prg
FUNCTION lxw_prepare_chart_options(options)
LOCAL pOptions
IF HB_ISHASH( options )
   pOptions:= LXW_GET_CHART_OPTIONS(;
      HB_HGETDEF( options, "x_offset", Nil ),;
      HB_HGETDEF( options, "y_offset", Nil ),;
      HB_HGETDEF( options, "x_scale" , Nil ),;
      HB_HGETDEF( options, "y_scale" , Nil ),;
      HB_HGETDEF( options, "object_position", Nil ) )
ELSE
   pOptions:= options
ENDIF

*/
    // Faz a chamada da funcao acima desse forma para gerar parametro de exibicao do grafico na planilha.
    options:= { => }    
    options[ "x_offset" ]:= 1  // 4
    options[ "y_offset" ]:= 2  // 5
    options[ "x_scale"  ]:= 1.2
    options[ "y_scale"  ]:= 1.1
    // options[ "object_position" ]:= 1
    



       // Usar "lxw_worksheet_insert_chart_opt"  ao inves de  "lxw_worksheet_insert_chart" para ter efeito as opcoes acima.
       // lxw_worksheet_insert_chart(aAba[01], LXW_CELL("B"+ALLTRIM(STR(nLinha+4))), chart1, options)  // Insere o grafico no arquivo
					  lxw_worksheet_insert_chart_opt(aAba[01], LXW_CELL("B"+ALLTRIM(STR(nLinha+4))), chart1, options)  // Insere o grafico no arquivo COM OPCOES CONFIGURADAS/PERSONALIZADAS

        //---------------------------------------------------------------


       //----- Cria o grafico valores (com o segundo metodo de programacao) -----
        chart2 = lxw_workbook_add_chart(projeto, LXW_CHART_COLUMN)  //        chart_types:= {LXW_CHART_COLUMN, LXW_CHART_AREA, LXW_CHART_LINE, LXW_CHART_PIE}
        lxw_chart_title_set_name(chart2, "Valor por Mes (acrescido de 1/3)")
        categoria=aAba2[01]+"!$B$"+ALLTRIM(STR(nLinha+6))+":$B$"+ALLTRIM(STR(nLinha+17))
        valores=aAba2[01]+"!$F$"+ALLTRIM(STR(nLinha+6))+":$F$"+ALLTRIM(STR(nLinha+17))
        series=lxw_chart_add_series(chart2, categoria, valores )
        lxw_chart_set_style(chart2, 44)  // Style 44
        lxw_chart_legend_set_position(chart2, LXW_CHART_LEGEND_NONE)  // LXW_CHART_LEGEND_BOTTOM)         
        //lxw_chart_series_set_name(series, "=Sheet1!$B$1") // Nome da legenda ( a padrao eh 'Serie 1' )
        
        //  lxw_worksheet_insert_chart(aAba[01], LXW_CELL("B"+ALLTRIM(STR(nLinha+20))), chart2)  // Insere o grafico no arquivo      
        lxw_worksheet_insert_chart_opt(aAba[01], LXW_CELL("B"+ALLTRIM(STR(nLinha+20))), chart2, options)  // Insere o grafico no arquivo COM OPCOES CONFIGURADAS/PERSONALIZADAS              
        //---------------------------------------------------------------        
        

        LANCAFERIA->(DbCloseArea())  // Fechou CT_FERIAS com alias LANCAFERIA
        SAL_CAT_FE->(DbCloseArea())  // Fechou SAL_CATEG com alias SAL_CAT_FE
ENDCASE
//-----------------------------------------------------------------------
// FIM da formatacao das celulas e finalizacoes apos o loop dos registros
//-----------------------------------------------------------------------



// Finalizando/Fechando o projeto
inkey(1)  // Aguarda 1 segundo para fechar o projeto (Penso que certo erros podem ser devido a nao gravacao do cache antes da abertura do arquivo).
lxw_workbook_close(projeto)  // Finaliza o Workbook (projeto)
inkey(1)  // Aguarda 1 segundo para fechar o projeto (Penso que certo erros podem ser devido a nao gravacao do cache antes da abertura do arquivo).


/*   AQUI, IMPRIME O CONTEUDO DAS CELULAS....

QOUT( lxw_name_to_row("B2"), lxw_name_to_col("B2") )
QOUT( lxw_name_to_col("C:C"), lxw_name_to_col_2("C:D") )
QOUT( lxw_name_to_row("A1:K42"), lxw_name_to_col("A1:K42"),;
      lxw_name_to_row_2("A1:K42"), lxw_name_to_col_2("A1:K42") )
col_name:= SPAC(10)
lxw_col_to_name(@col_name, 100, 0 )
QOUT( col_name )

*/





AGUARDE(.F.)

// Abrindo o arquivo gerado pelo projeto no aplicativo padrao do usuario na maquina.
// hb_run( explorer /select, "e:\teste\prog.exe" )  // Abre o exporer com o arquivo selecionado
ShellExecuteOpen( BB )   // Funcao Local (abre o programa padrao do windows para o arquivo passado)

RETURN


Não sei se já arrumaram, mas o projeto original não possibilitava incluir macros do VBA, dando uma estudada no código eu ví que era possível e inclui essa função:


-->> Essa funcao abaixo nao existia no hblibxlsxwriter.prg original do github,
eu a criei baseada no formato da lxw_workbook_add_worksheet( workbook, sheetname) da linha 202
e funcionou.
ENTAO ACRESCER ESSAS 2 LINHAS ABAIXO NO hblibxlsxwriter.prg (abaixo da linha 202 +-)

Código: Selecionar todos

           FUNCTION lxw_workbook_add_vba_project( workbook, sheetname)
            RETURN CallDll( "workbook_add_vba_project", workbook, sheetname )   


Ela serve para incluir arquivos de macro (vbaproject.bin) no excel gerado,
esse arquivo vbaproject.bin que contem a macro deve ser extraido
de uma planilha com o 7zip

Abrir arquivo do excel

Enviado: 18 Jul 2022 12:44
por lucimauro
Ola, vou dar uma olhada aqui
Obrigado pela atenção.

Abrir arquivo do excel

Enviado: 19 Jul 2022 19:26
por Linguagemclipper
Carlão disse tudo!
No meu caso tinha um chefe que queria que o relatório saisse em Excel no modelo dado pela auditoria mesmo ela dizendo que meu relatório em PDF já constava todas as informações necessárias.
Tem uma outra pessoa que estava listando os processos no Excel para dar um ok... Sendo que o sistema já constava registro do andamento dos processos... Aliás, percebí que o sistema dava mais informações que eles estavam usando.
Enfim, baixei a lib que você indicou, mas não conseguí compilar porque falta um arquivo xlsxwriter.h, você tem ele aí? Deixei até um issue lá no github.
Se der pra criar uma planilha no Excel sem precisar ter ele instalado mesmo vai ser o ouro!!!
Só uma última pergunta: ele funciona no xHarbour também? Não ví arquivo .bc ou orientação para compilar em xHarbour.

Abrir arquivo do excel

Enviado: 20 Jul 2022 10:15
por carlaoonline
Bom dia!
Linguagemclipper escreveu:Se der pra criar uma planilha no Excel sem precisar ter ele instalado mesmo vai ser o ouro!!!
É o ponto forte dessa ferramenta!


Segue arquivos em anexo.
Libs_para_xlsxwriter.zip
Libs para o projeto xlsxwriter
(614 KiB) Baixado 136 vezes

Para gerar o arquivo XLSX , essas 3 libs precisam estar na mesma pasta onde roda o executável:

libgcc_s_sjlj-1.dll
libwinpthread-1.dll
libxlsxwriter.dll


No meu caso, independente se compilei o executável com MIngW ou com Bcc58, essas 3 libs funcionam em ambos.

Eu crio executáveis em dois ambientes de trabalho:

Com o Harbour e MingW do pacote HMG.3.5

e

Com Harbour e Bcc58 (uso o Harbour do pacote MiniGui)


Para compilar com MingW use a lib "libhblibxlsxwriter.a"

Para compilar com Bcc58 use a lib "hblibxlsxwriter.lib"

Talvez funcionem com outros compiladores, ou terá que criar a lib a partir dos fontes do xlsxwriter com o compilador que cria o seu executável.


Coloque o arquivo "xlsxwriter.h" na pasta Include do Harbour
Coloque a pasta "xlsxwriter" na pasta include do Harbour (essa pasta contém arquivos .h e mais uma pasta chamada "third_party")



Exemplo de linha de comando que uso para criar executável:

hbmk2.exe prog -mt -compr -strip -gtwvg -lhblibxlsxwriter -icon=icone.ico HBCT.HBC XHB.HBC HBHPDF.HBC gtwvg.hbc


------- Compilando com MingW e o Harbour do HMG3.5 -------------------------------------------------
SET LIB:
LIB=C:\hmg.3.5\lib;C:\hmg.3.5\MINGW\lib;C:\hmg.3.5\MINGW\i686-w64-mingw32\lib;C:\hmg.3.5\HARBOUR\lib\win\mingw;C:\hmg.3.5\HARBOUR\lib

SET INCLUDE:
INCLUDE=C:\hmg.3.5\HARBOUR\include;C:\hmg.3.5\INCLUDE;C:\hmg.3.5\HARBOUR\contrib\gtwvg;C:\hmg.3.5\MINGW\i686-w64-mingw32\include;C:\hmg.3.5\HARBOUR\contrib\xhb;C:\hmg.3.5\HARBOUR\contrib\hbwin;C:\hmg.3.5\HARBOUR\include\xlsxwriter

HB_INSTALL_PREFIX=C:\hmg.3.5\HARBOUR
HB_PATH=C:\hmg.3.5\HARBOUR
HMGPATH=C:\hmg.3.5\

Nesse caso usa a lib "libhblibxlsxwriter.a" que está na pasta "C:\HMG.3.5\MINGW\lib"
--------------------------------------------------------------------------------------------------------------------------------




------- Compilando com Bcc58 e o harbour do MiniGui -----------------------------------------------------

Com o SET LIB:
LIB=C:\MiniGUI\Harbour\lib;C:\MiniGUI\Lib

Com o SET INCLUDE:
INCLUDE=C:\MiniGUI\Harbour\include;C:\MiniGUI\Include;C:\MiniGUI\harbour\include\xlsxwriter

HB_INSTALL_PREFIX=C:\minigui\harbour
HB_PATH=C:\minigui\harbour
HMGPATH=C:\minigui\harbour

Nesse caso usa a lib "hblibxlsxwriter.lib" que está na pasta "C:\MiniGUI\harbour\lib"

-------------------------------------------------------------------------------------------------------------------------------

Ambos os Harbours usados são:

Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/

Muda apenas o compilador e a localizacao do pasta do Harbour em cada ambiente.

Abrir arquivo do excel

Enviado: 05 Jul 2023 11:33
por clodoaldomonteiro
Boas, Carlao.
Teria como usar libxlsxwriter com xHarbour 123, BCC 73?

Tentei usar mas faltou as seguintes funções:
"HB_DYNCALL(), HB_HOUR(), HB_MINUTE(), HB_SEC(), HB_HGETDEF()"

Inclui o arquivo: libxlsxwriter.lib na pasta \lib do xHarbour e hblibxlsxwriter.ch para a pasta \include.

Desde já agradeço a ajuda.

Abrir arquivo do excel

Enviado: 11 Jul 2023 16:40
por carlaoonline
Opa!

Tchê, não sei como seria para xHarbour, uso com Harbour 3.2 e bcc 5.8. Mas se não me engano no site tem uma explicação para xHarbour, no caso teria que criar a lib que compila com teu executável para xHarbour a partir dos fontes e essas 3 dll's que devem ficar na pasta do executável servem para qualquer aplicação do jeito que estão.

Abrir arquivo do excel

Enviado: 12 Jul 2023 07:14
por Wanderlei
Oi Clodoaldo,
Eu utilizo essas dll aqui com xHarbour123 e Bcc7.3
Exemplo de excel.rar
Exemplo de Excel com a dll
(494.07 KiB) Baixado 92 vezes

Abrir arquivo do excel

Enviado: 12 Jul 2023 08:21
por clodoaldomonteiro
Wanderlei escreveu:Oi Clodoaldo,
Eu utilizo essas dll aqui com xHarbour123 e Bcc7.3
Exemplo de excel.rar
Bom dia,
Fico muito grato pela ajuda, vou testar e postar aqui os resultados.

Abraços.

Abrir arquivo do excel

Enviado: 12 Jul 2023 11:37
por clodoaldomonteiro
Olá Wanderlei

Vi que temos que converter todos os campos Caracteres em UTF8, pois até mesmo, o .xlsx é uma pasta compactada, com XML padrão UTF8.

Ficou assim:

Código: Selecionar todos

   worksheet1  := DllCall(nHDll, DC_CALL_STD, "workbook_add_worksheet", workbook, hb_strToUTF8( 'Razão' ) )  //Nome da Aba
Vou seguir fazendo testes.

Abrir arquivo do excel

Enviado: 12 Jul 2023 12:36
por JoséQuintas
Deve ter coisa pronta pra harbour, mas..... a mesma coisa em classe.

Código: Selecionar todos

#define LF Chr(13)+chr(10)

FUNCTION ExcelTeste()

   LOCAL nLin := 2, nCol := 1, oExcel

   oExcel := Excel():New()
   oExcel:AddBook( "lista_de_clientes.xlsx" )
   oExcel:AddSheet( "clientes" )

   oExcel:AddCellString( 1, nCol, "CODIGO" )
   oExcel:AddCellString( 1, nCol + 1 , "NOME" )

   *--->Select no banco para pegar os dados<---*
   vSql := "select" + LF
   vSql += "   c.codcli," + LF
   vSql += "   c.nome" + LF
   vSql += "from clientes c" + LF
   vSql += "order by c.nome" + LF
   oQuery := oSql:Query( vSql )
   oQuery:Skip()
   DO WHILE !oQuery:EOF()
      oExcel:AddCellString( nLin, nCol, oQuery:Fieldget(1) )
      oExcel:AddCellString( nLin, nCol + 1, oQuery:Fieldget(2) )
      nLin++
      nCol := 1
      oQuery:Skip()
   ENDDO
   oQuery:Close()

   oExcel:CloseBook()
   oExcel:End()

   RETURN .T.

CREATE CLASS Excel

   VAR hDLL
   VAR Book
   VAR Sheet

   METHOD New()                         INLINE ::hDll := LoadLibrary( "libxlswriter.dll" ), Self
   METHOD End()                         INLINE FreeLibrary( :hDLL )
   METHOD CallDllStd( a,b,c,d,e,f,g )   INLINE DllCall( nHDll, 0x0020, a,b,c,d,e,f,g )
   METHOD AddBook( cName )              INLINE ::Book := ::CallDllStd("workbook_new", cName )
   METHOD AddSheet( cName )             INLINE ::Sheet := ::CallDllStd("workbook_add_worksheet", ::workbook, cName )
   METHOD CloseBook()                   INLINE ::CallDllStd( "workbook_close", ::Book )
   METHOD AddCellString( nRow, nCol, cText ) INLINE CallDllStd("worksheet_write_string", ::Sheet, nRow, nCol, cText, NIL)

   ENDCLASS
clodoaldomonteiro escreveu:Vi que temos que converter todos os campos Caracteres em UTF8
Pois é... basta alterar AddCellString() pra converter pra UTF-8, e não precisa fazer isso em parte nenhuma do fonte normal.

É interessante isso pra mostrar o que é classe/objeto..... o objeto é a planilha excel, e está fazendo coisas na planilha excel.
As variáveis são... da planilha excel, as ações são ... da planilha excel.
E se imprimir, a folha vai ser um objeto que vai estar na sua mão, objeto é isso, só que no computador não se pega na mão.
Fica tudo "juntinho", tudo que tem a ver com o objeto, com a planilha excel.

A indicação ::nome indica que isso tá dentro da classe/objeto, não é uma variável de fora

Também mostra que, quando está tudo "juntinho" no objeto, evita ter que ficar toda hora passando parâmetros já conhecidos no conjunto.

As tarefas pra trabalhar com Excel acabam ficando organizadas num fonte, e o fonte de trabalho fica bem mais limpo.

Abrir arquivo do excel

Enviado: 12 Jul 2023 13:06
por clodoaldomonteiro
JoséQuintas escreveu:Deve ter coisa pronta pra harbour, mas..... a mesma coisa em classe.

Código: Selecionar todos

#define LF Chr(13)+chr(10)

FUNCTION ExcelTeste()

   LOCAL nLin := 2, nCol := 1, oExcel

   oExcel := Excel():New()
   oExcel:AddBook( "lista_de_clientes.xlsx" )
   oExcel:AddSheet( "clientes" )

   oExcel:AddCellString( 1, nCol, "CODIGO" )
   oExcel:AddCellString( 1, nCol + 1 , "NOME" )

   *--->Select no banco para pegar os dados<---*
   vSql := "select" + LF
   vSql += "   c.codcli," + LF
   vSql += "   c.nome" + LF
   vSql += "from clientes c" + LF
   vSql += "order by c.nome" + LF
   oQuery := oSql:Query( vSql )
   oQuery:Skip()
   DO WHILE !oQuery:EOF()
      oExcel:AddCellString( nLin, nCol, oQuery:Fieldget(1) )
      oExcel:AddCellString( nLin, nCol + 1, oQuery:Fieldget(2) )
      nLin++
      nCol := 1
      oQuery:Skip()
   ENDDO
   oQuery:Close()

   oExcel:CloseBook()
   oExcel:End()

   RETURN .T.

CREATE CLASS Excel

   VAR hDLL
   VAR Book
   VAR Sheet

   METHOD New()                         INLINE ::hDll := LoadLibrary( "libxlswriter.dll" ), Self
   METHOD End()                         INLINE FreeLibrary( :hDLL )
   METHOD CallDllStd( a,b,c,d,e,f,g )   INLINE DllCall( nHDll, 0x0020, a,b,c,d,e,f,g )
   METHOD AddBook( cName )              INLINE ::Book := ::CallDllStd("workbook_new", cName )
   METHOD AddSheet( cName )             INLINE ::Sheet := ::CallDllStd("workbook_add_worksheet", ::workbook, cName )
   METHOD CloseBook()                   INLINE ::CallDllStd( "workbook_close", ::Book )
   METHOD AddCellString( nRow, nCol, cText ) INLINE CallDllStd("worksheet_write_string", ::Sheet, nRow, nCol, cText, NIL)

   ENDCLASS
clodoaldomonteiro escreveu:Vi que temos que converter todos os campos Caracteres em UTF8
Pois é... basta alterar AddCellString() pra converter pra UTF-8, e não precisa fazer isso em parte nenhuma do fonte normal.

É interessante isso pra mostrar o que é classe/objeto..... o objeto é a planilha excel, e está fazendo coisas na planilha excel.
As variáveis são... da planilha excel, as ações são ... da planilha excel.
E se imprimir, a folha vai ser um objeto que vai estar na sua mão, objeto é isso, só que no computador não se pega na mão.
Fica tudo "juntinho", tudo que tem a ver com o objeto, com a planilha excel.

A indicação ::nome indica que isso tá dentro da classe/objeto, não é uma variável de fora

Também mostra que, quando está tudo "juntinho" no objeto, evita ter que ficar toda hora passando parâmetros já conhecidos no conjunto.

As tarefas pra trabalhar com Excel acabam ficando organizadas num fonte, e o fonte de trabalho fica bem mais limpo.
Testando a Classe, dá erro por falta da função CallDllStd(), sendo q vc criou ele como Metodo.

Código: Selecionar todos

Error: Unresolved external '_HB_FUN_CALLDLLSTD' referenced from C:\TEMP\SCP21H\EXCELTESTE.OBJ
Error: Unable to perform link
hbmk2: Error: Running linker. 2
ilink32.exe @C:\Users\CLODOA~1\AppData\Local\Temp\w9s5jt.lnk

hbmk2: Error: Referenced, missing, but unrecognized Harbour function(s):   CALLDLLSTD()

Abrir arquivo do excel

Enviado: 12 Jul 2023 14:19
por clodoaldomonteiro
Assim deu certo, Wanderlei e Quintas:

Código: Selecionar todos

////////////////////////////////////////////////////////////////////////////////
//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)
////////////////////////////////////////////////////////////////////////////////
#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), NIL)

   ENDCLASS

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

Obrigado pela ajuda de todos.