Abrir arquivo do excel
Enviado: 11 Jul 2022 16:29
Eu apenas gero as informações.carlaoonline escreveu:Gero planilhas com fórmulas, gráficos e até com macros. Algumas coisas são mais fáceis e outras mais chatas.
Eles que se virem.
Eu apenas gero as informações.carlaoonline escreveu:Gero planilhas com fórmulas, gráficos e até com macros. Algumas coisas são mais fáceis e outras mais chatas.
Voltando um pouco atrás...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!
Não tenho nada didático pronto, mas vou postar aqui uma planilha feita e a função que chamei para faze-la.lucimauro escreveu:Teria algum exemplo carlaoonline para postar aqui ?
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
Código: Selecionar todos
FUNCTION lxw_workbook_add_vba_project( workbook, sheetname)
RETURN CallDll( "workbook_add_vba_project", workbook, sheetname )
É o ponto forte dessa ferramenta!Linguagemclipper escreveu:Se der pra criar uma planilha no Excel sem precisar ter ele instalado mesmo vai ser o ouro!!!
Bom dia,Wanderlei escreveu:Oi Clodoaldo,
Eu utilizo essas dll aqui com xHarbour123 e Bcc7.3
Código: Selecionar todos
worksheet1 := DllCall(nHDll, DC_CALL_STD, "workbook_add_worksheet", workbook, hb_strToUTF8( 'Razão' ) ) //Nome da AbaCó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
Pois é... basta alterar AddCellString() pra converter pra UTF-8, e não precisa fazer isso em parte nenhuma do fonte normal.clodoaldomonteiro escreveu:Vi que temos que converter todos os campos Caracteres em UTF8
Testando a Classe, dá erro por falta da função CallDllStd(), sendo q vc criou ele como Metodo.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) ENDCLASSPois é... basta alterar AddCellString() pra converter pra UTF-8, e não precisa fazer isso em parte nenhuma do fonte normal.clodoaldomonteiro escreveu:Vi que temos que converter todos os campos Caracteres em UTF8
É 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.
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()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 )