Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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'>";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
/applications/core/interface/imageproxy/imageproxy.php?img=http://i60.tinypic.com/o7rda8.gif&key=6cc7c67ce667baa067aac185dede889109712c0f393a05f132b78d6d43c85c70" alt="o7rda8.gif" />
Alguma ideia de como fazer isso?
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.
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.
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.
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.
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?
Tudo certo... obrigado ESerra!
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.