Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jdlucena

PHPExcel - Contracheque online

Recommended Posts

Olá, pessoal!

Estou tentando criar um sistema que exibe o contracheque do funcionário a partir de um arquivo .xls!
O código abaixo exibe o 1º contracheque que é da linha 1 até a 22. Pretendo fazer o seguinte, quando o usuário logar é exibido o contracheque referente ao seu nome.

<?php
// activar Error reporting
error_reporting(E_ALL);

// carregar a classe PHPExcel
require_once 'Classes/PHPExcel.php';

// iniciar o objecto para leitura
// definir a abertura do ficheiro em modo só de leitura
$objReader = new PHPExcel_Reader_Excel5();
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("contracheque.xls");
$objPHPExcel->setActiveSheetIndex(0);

echo "<table border='0'>";
// navegar na linha
for($linha=1; $linha<=22; $linha++){
    echo "<tr>";
    // navegar nas colunas da respectiva linha
    for($coluna=0; $coluna<=18; $coluna++){
        if($linha==1){
            // escreve o cabeçalho da tabela a bold
            echo "<th>".utf8_decode($objPHPExcel->getActiveSheet()->getCellByColumnAndRow($coluna, $linha)->getValue())."</th>";
        }else{
            // escreve os dados da tabela
            echo "<td>".utf8_decode($objPHPExcel->getActiveSheet()->getCellByColumnAndRow($coluna, $linha)->getValue())."</td>";
        }
    }
    echo "</tr>";
}
echo "</table>";
?>

Por exemplo, o 1º contracheque é da funcionária Maria da Penha e o 2º contracheque é de Paulo Trindade, como faço para quando Paulo logar aparecer o contracheque dele?

 

contracheque.xls

o7rda8.gif

 

Alguma ideia de como fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem várias formas de se fazer isso.

 

Você poderia gravar na tabela do usuário o xls ( fazer um upload) e puxar ao fazer o login.

$objPHPExcel = $objReader->load("caminho/contrachequedousuario.xls");

 

Você poderia fazer um contracheque_id_usario.xls e puxar ao fazer o login

$objPHPExcel = $objReader->load("caminho/icontrachequedousurio_id).xls");

 

Vai do dinâmica que você está fazendo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Leandro, desse modo que você falou só funciona se tiver um arquivo .xls para cada funcionário, por exemplo:


pasta/contracheque


funcionario1.xls

funcionario2.xls

funcionario3.xls


Porém, são mais de 400 funcionários e todo mês é gerado um único arquivo (ex: contracheque_junho.xls) contendo todos os contracheques dos funcionários, sendo cada contracheque ocupando 22 linhas conforme mostrado na imagem, onde um arquivo com 400 funcionários tem mais de 8800 linhas.


Eu poderia exibir todas as linhas do arquivo, mas aí todos iriam ver o contracheque de todos, o que eu quero é que quando o usuário logar, seja exibido somente as 22 linhas referente ao seu contracheque.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao meu ver existem duas soluções basicamente:

1 - A simples: Ler todo o XLS e jogá-lo e uma tabela, com isto você terá um acesso mais rápido e fácil aos dados, inclusive para filtrá-los.

2 - Usar o método que usa atualmente, adicionalmente utilizar um "if" para filtrar os dados da pessoa que está pesquisando.

 

Óbvio que ambos os casos precisam que exista um campo no XLS que seja único (CPF, matrícula, etc) e que este dado esteja salvo em alguma sessão do login.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Bem, a variável $campo vai receber um campo cadastrado no banco de dados, como no exemplo abaixo...




// iniciar o objecto para leitura
// definir a abertura do ficheiro em modo só de leitura
$objReader = new PHPExcel_Reader_Excel5();
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("contracheque.xls");
$objPHPExcel->setActiveSheetIndex(0);

$campo = "001680 PAULO TRINDADE"; // coloquei manualmente por enquanto

// verificando se o usuário logado é i gual a coluna zero e linha 26
if ($campo == $objPHPExcel->getActiveSheet()->getCellByColumnAndRow(0, 26)->getValue()):

echo "<table border='0'>";
// mostra somente 22 linhas
$linha = 23;
$linho = $linha+22;

// navegar na linha
for($linha; $linha<=$linho; $linha++){
echo "<tr>";
// navegar nas colunas da respectiva linha
for($coluna=0; $coluna<=18; $coluna++){
if($linha==1){
// escreve o cabeçalho da tabela a bold
echo "<th>".utf8_decode($objPHPExcel->getActiveSheet()->getCellByColumnAndRow($coluna, $linha)->getValue())."</th>";
}else{
// escreve os dados da tabela
echo "<td>".utf8_decode($objPHPExcel->getActiveSheet()->getCellByColumnAndRow($coluna, $linha)->getValue())."</td>";
}
}
echo "</tr>";
}
echo "</table>";
endif;


Dessa forma ele exibe somente o contracheque do usuário Paulo, verificando se $campo é igual ao conteúdo da coluna 0 e linha 26... e exibindo mais 22 linhas.


Mas preciso fazer com que ele percorra toda a coluna de forma automática para achar o valor correspondente a variável $campo e mostrar o contrecheque correspondente ao usuário logado, pois dessa forma outro usuário vai logar e irá verificar somente a coluna 0 e linha 26.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então coloque isto tudo dentro de outro for, para ir alterando os valores de 0,26 pelos das próximas linhas que ele deve verificar, até achar a linha do próprio usuário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui seguindo a dica do ESerra...valeu!

 

Porém, na planilha tem uma campo de Admissão e esse campo está em formato de data, quando exibo no php ele aparece como geral, por exemplo:

 

contracheque.xml

Admissão: 01/01/1996

 

index.php

Admissão: 35065

 

Como faz para corrigir?

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por hostbasico
      Ao inserir um arquivo esta dando a seguinte mensagem: Undefined index
       
      O código da linha que esta dando o erro é este:
      utf8_decode($objPHPExcel->getActiveSheet()->getCellByColumnAndRow($coluna, $linha)->getValue());
       
      Agradeço desde já.
    • Por marcelosbraga01
      Boa noite Senhores,
      gostaria que vocês me dessem uma luz. Estou desenvolvendo um portal, no entanto sou novo em desenvolvimento.
      Eu criei já um formulário de login, agora preciso criar dentro do meu portal uma área onde o Servidor terá acesso a todos os seus contracheques.
      Vou fazer a importação dos dados mensalmente de forma que quando o usuário for redirecionado para a página de contracheques aparecera um link com todos os meses importados: 
      Ex:
      Março/2018
      Fevereiro/2018
      Janeiro/2018
      Assim quando solicitar (clicando) no mês desejado, ele abra para o usuário um arquivo pdf com os dados.
      É possível fazer desta forma?
      O que devo procurar, estudar?
      Existe alguma coisa que pode me auxiliar?
      Vocês podem por favor me darem uma direção?
      Qual o grau de dificuldade lembrando que eu não tenho grande prática em PHP e quase toda minha página está em HTML;
      OBs: Já estou usando sessão;
       
       
      Desde já agradeço a atenção de todos;
    • Por diego.baiao
      Olá bom dia a todos! 
       
      Pessoal preciso fazer um relatório que venha a gerar um arquivo xlsx automaticamente, de uma consulta do banco de dados, estou usando o "PHPEXcel" para isso. 
      Tenho  essa necessidade abaixo:
      >>  Esse arquivo tem que gerar abas automaticamente quando o limite chegar a 1 milhão de linhas sabemos que o excel a partir de 2003 o limite de linhas por "planilha" ou "aba" é de "um milhão" 1k,  estou arredondado para baixo, o certo é 1.048.576 linhas por 16.384 colunas por aba/planilha.  
      Exemplo: Então resumindo vou tirar um relatório deu 3 milhões e meio de registros, serão 4 abas/planilhas, sendo 3 abas com um milhão cada e mais 1 aba com meio milhão. Sendo que ele deve fazer tudo sozinho se tiver 10 milhões e assim vai, eu consigo já gerar o arquivo com a consulta vindo do banco, mais não consigo gravar todas as linhas na tabela e muito menos fazer criar as abas automaticamente. 
      *** estou seguindo essa referencia abaixo com uso no phpexcel,  neste ensina o uso para criar novas "abas/planilhas" no arquivo a ser gerado mais não consigo colocar em pratica. 
      (http://interessespessoais.com/programacaoweb/criar-varias-folhas-num-ficheiro-excel-com-a-classe-phpexcel/)
       
      Dados importantes: 
      1 - número de linhas por aba é 1 milhão de linhas; 
      2 - as colunas são fixas então nunca irá ter mais ou menos ao que já tem criado( vai da coluna "A" a "O' são 15 colunas o total);
      3 - possui um cabeçalho fixo, vou deixar fictício esses dados não são relevantes ( serão eles mesmos "A', "B", "C" ... "O"). 
      >> no código abaixo o cabeçalho vai ser sempre a primeira linha logo abaixo da coluna como fiz ali "A1" chamei de "id" seria a primeira delas. 
       
      >> nesse caso para não ficar pesado a consulta e demora no resultado eu estou trazendo  15 linhas(registros) minha tentativa é gera 3 abas com 5 registros em cada uma delas.
      Dando certo ai mudo para a suposta quantidade de registros que queira alcançar. hehe
       
      Segue meu código abaixo já gerando o relatório porem com uma linha editada rs.
      "Mais ao menos gera no formato certo sem erros". 
      <?php /* Rodando esta gravando o xlsx */ require_once "conexao.php"; require_once 'Classes/PHPExcel.php'; // DEFINE O FUSO HORARIO COMO O HORARIO DE BRASILIA date_default_timezone_set('America/Sao_Paulo'); //cria a conexao com o banco $conexao_pdo = new PDO("pgsql:host=$host dbname=$dbname user=$user password=$senha"); //laço para exibir se a conesão foi bem sucedida if ($conexao_pdo) { echo 'Conexão com o PostgreSQL realizada com sucesso!!<br>'; } else { echo 'Falha na conexão com o PostgreSQL!'; } // grava milesegundo no arquivo gerado $data_hora = date('d/m/Y H:i:s', time()); $microtime = microtime(true); $time = explode(".", $microtime); $mSecs = $time[1]; if (strlen($mSecs) == 3){ $mSecs = $mSecs."0"; }elseif (strlen($mSecs) == 2){ $mSecs = $mSecs."00"; } function limpaData($data_hora){ $rem = array ('-',':',' ','/','.'); $sub = array ('_','_','_','_','_'); return str_replace($rem, $sub, $data_hora); } $data = limpaData($data_hora)."_".$mSecs; //pega data e concatena com microsegundos //consulta via pdo // nesse caso para nao ficar pesado trago 15 linhas minha tentativa é gera 3 abas com 5 registros em cada uma delas $consulta = $conexao_pdo->query( "SELECT * FROM ENVIOS.ENVIO_CONTATO LIMIT 15" ); //muda o modo padrão de busca para um objeto PDOStatement $consulta->setFetchMode(PDO::FETCH_ASSOC); $count = $consulta->rowCount(); // pega o numero de registros na consulta if ($count > 0) { while($row = $consulta->fetch()) { // Criar um novo objecto PHPExcel $objPHPExcel = new PHPExcel(); // Inserir dados nas células A1 e A2 $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A1', 'id') ->setCellValue('A2', $row['id']); } } // // Indicação da criação do ficheiro $file = $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $file->save("downloads\periodo_" .$data. ".xlsx"); ?> O arquivo é gerado na pasta "downloads" dentro do projeto, porém com apenas 1 dado ( so fiz ele ir na primeira celular "A" e gravar um dado no caso um "id" da minha consulta, teria que fazer isso com o resto das informações, "B" os "nomes", "C" as "idades" e assim vai...   não sei como fazer um loop nessa situação com foreach, while, for, etc... 
       
      * O meu problema esta sendo mais com logica de programação vou estudar para ver se consigo ir adiante, mais se conseguirem derem uma força eu agradeço.
       
      Segue duas prints abaixo: 
      1 - do arquivo gerado >> http://prntscr.com/hv37mh
      2 - do arquivo aberto >> http://prntscr.com/hv385u 
       
    • Por Luiz Gustavo Costa Ceolin
      Boa tarde!!
      Estou utilizando para exportação de dados PHPExcel na minha aplicação em Laravel 5.2.
      Quando vou exportar um numero maior que 1000 registros, o phpexcel demora muito para gerar os arquivos e caso for mais de 8000 registros, ocorre perda de dados e da como pagina não encontrada.
      Na minha tela de exportação, eu permito com que o usuário selecione as colunas que ele quer ter no arquivo.
      Segue HTML das colunas
      <div class="clearfix form-group"> <div class="col-md-2"> <div class="clearfix"> <label class="pull-left" for="colunas"> *Ficha </label> </div> <div class="pull-left"> <select class="form-control" multiple="multiple" id="colunas" name="colunas[]"> <option value="Contrato" selected="select"> Contrato </option> <option value="Processo" selected="select"> Processo </option> <option value="Dossiê/NPJ" selected="select"> Dossiê/NPJ </option> <option value="Executado" selected="select"> Executado </option> <option value="Pessoa" selected="select"> Pessoa </option> <option value="CPF/CNPJ" selected="select"> CPF/CNPJ </option> <option value="Fiadores/Avalistas/Terceiros" selected="select"> Fiadores/Avalistas/Terceiros </option> <option value="Cliente" selected="select"> Cliente </option> <option value="Carteira" selected="select"> Carteira </option> <option value="UF" selected="select"> UF </option> <option value="Comarca" selected="select"> Comarca </option> <option value="Ficha" selected="select"> Ficha </option> <option value="Incidente" selected="select"> Incidente </option> <option value="Valor" selected="select"> Valor </option> <option value="Data_Ajuizamento" selected="select"> Data Ajuizamento </option> <!-- <option value="Data Despacho" selected="select"> Data Despacho </option> --> </select> </div> </div> <div class="col-md-4"> <div class="clearfix"> <label class="pull-left"> *Informações Processuais </label> </div> <div class="pull-left"> <select class="form-control" multiple="" id="colunas" name="colunas[]"> <option value="Situacao_Andamento" selected="select"> Situação Andamento </option> <option value="Revisional" selected="select"> Revisional </option> <option value="Processo_Revisional" selected="select"> Processo Revisional </option> <option value="Cessão_de_Crédito" selected="select"> Cessão de Crédito </option> <option value="Embargos" selected="select"> Embargos </option> <option value="Processos_Embargos" selected="select"> Processos Embargos </option> <option value="Existencia_de_Garantia" selected="select"> Existencia de Garantia </option> <option value="Identificação_Garantia" selected="select"> Identificação Garantia </option> <option value="Recuperação_de_Crédito" selected="select"> Recuperação de Crédito </option> <option value="Citação" selected="select"> Citação </option> <option value="Partes_Citadas" selected="select"> Partes Citadas </option> <option value="Pagamento_Recuperação" selected="select"> Pagamento Recuperação</option> <option value="Especificar_Recuperação" selected="select"> Especificar Recuperação </option> <option value="Mandados_Negativos" selected="select"> Mandados Negativos </option> <option value="Acordo" selected="select"> Acordo </option> <option value="Pagamento_Acordo" selected="select"> Pagamento Acordo </option> <option value="Data_Acordo" selected="select"> Data Acordo </option> <option value="Leilão" selected="select"> Leilão </option> <option value="Data_Leilão" selected="select"> Data Leilão </option> <option value="Data_Rematação" selected="select"> Data Rematação </option> <option value="Valor_Rematação" selected="select"> Valor Rematação </option> <option value="Descrição_Leilão" selected="select"> Descrição Leilão </option> <option value="Ativo" selected="select"> Ativo </option> </select> </div> </div> </div>  
      Em seguida no meu arquivo de Controller faço a busca na base
       
      $exec = DB::table('execucao_acompanhamento as a') ->join('execucao_clientes as b','a.cliente_id','=','b.id') ->join('execucao_carteira as c','a.carteira_id','=','c.id') ->join('gn_cidades as d','a.comarca_id','=','d.id') ->join('execucao_status as f','a.status_id','=','f.id') ->join('execucao_tipo_pessoa as g','a.pessoa','=','g.id') ->join('execucao_citacao as h','a.citacao','=','h.id') ->join('execucao_recuperacao_credito as i','a.rec_credito','=','i.id') ->join('execucao_pagamento_recuperacao as j','a.pagamento_rec','=','j.id') ->join('execucao_leilao as k','a.leilao','=','k.id') ->join('execucao_acordo as l','a.acordo_id','=','l.id') ->leftjoin('execucao_pagamento as m','a.pagamento_id','=','m.id') ->join('execucao_revisional as n','a.revisional','=','n.id') ->join('execucao_cessao_credito as o','a.cessao_credito','=','o.id') ->join('execucao_embargos as p','a.embargos','=','p.id') ->join('execucao_existencia_garantia as q','a.exist_garantia','=','q.id') ->select('a.contrato as Contrato','a.processo as Processo','a.financiado as Executado','f.name as Situacao_Andamento','b.name as Cliente','c.name as Carteira','d.name as Comarca','d.uf as UF','a.data_ajuizamento as Data_Ajuizamento','a.cpf_cnpj as CPF/CNPJ','a.dossie as Dossiê/NPJ','a.valor as Valor','a.ficha as Ficha','a.incidente as Incidente','g.name as Pessoa','a.fiadores as Fiadores/Avalistas/Terceiros','h.name as Citação','a.partes_citadas as Partes_Citadas','i.name as Recuperação_de_Crédito','j.name as Pagamento_Recuperação','a.especificacao_rec as Especificar_Recuperação','a.mandados_negativos as Mandados_Negativos','k.name as Leilão','a.data_leilao as Data_Leilão','a.data_rematacao as Data_Rematação','a.valor_leilao as Valor_Rematação','a.descricao_leilao as Descrição_Leilão','l.name as Acordo','m.name as Pagamento_Acordo','n.name as Revisional','a.processo_revisional as Processo_Revisional','o.name as Cessão_de_Crédito','p.name as Embargos','a.processo_embargos as Processos_Embargos','a.data_acordo as Data_Acordo','q.name as Existencia_de_Garantia','a.ident_bem as Identificação_Garantia','a.active as Ativo') ->orderBy('a.modified','desc') ->limit(5000) ->get();  
      Após armazenar os dados na variavel $exec, eu sigo com a função de exportação do PHPExcel.
      $array_colunas = Request::get('colunas'); // recebe as colunas que o usuário selecionou Excel::create('Resultado Busca avançada', function($excel) use($array_colunas, $exec) { $excel->sheet('Resultado Busca avançada', function($sheet) use($array_colunas, $exec) { $sheet->row(1, $array_colunas); // insere a primeira linha com os nomes das colunas $cont = 1; foreach ($exec as $key => $val) // inicia foreach com os dados do meu select { $cont = $cont+1; $valores = array(); for ($i=0; $i < count($array_colunas); $i++) // inicia um for em cima da qtd de colunas que ususario selecionou { $valores[] = $val->$array_colunas[$i]; // armazena na variavel array $valores o resultado de cada coluna que o usuario selecionou } $sheet->row($cont, $valores); // insere na linha do arquivo os valores } }); })->export('xlsx');  
      Caso alguém já tenha passado por isso ou conheça uma outra forma de executar essa ação de uma forma mais otimizada, fico no aguardo.
       
    • Por jdlucena
      Estou usando o PHPExcel para mostrar campos de uma planilha excel no PHP, porém tem um campo com o seguinte dado:
       
      03/01/1900 05:00:00
      No qual é exibido: 77:00
       
      Preciso que mostre no PHP o mesmo valor que exibe no excel, o valor de 77:00
       
      O valor que está sendo mostrado é 3.2083333
       
      Como faço para exibir 77:00???
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.