[Resolvido] Relatorio com PHPExcel
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.
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](http://prntscr.com/hv37mh)
2 - do arquivo aberto >> [http://prntscr.com/hv385u](http://prntscr.com/hv385u)Discussão (14)
Carregando comentários...