Ir para conteúdo
Fórum Script Brasil
  • 0

Gerar excel com várias sheets através de phpspreadsheet (php/mysql)


peterhall

Pergunta

Preciso gerar um excel com várias sheets através de php/mysql e estou usando o phpspreadsheet. O objetivo é indicar um ou mais ID, e em cada sheet no excel, colocar a informação desses IDs, exemplo: ID1 = sheet1, ID2 = sheet2, etc...

Este é o script que montei. Se mudar a array para variavel e retirar o foreach, consigo gerar o arquivo de excel apenas com um ID e uma sheet. Se mudo para vários IDs com array e foreach gera o arquivo excel mas com uma sheet em branco. O que precisa ser ajustado aqui?

<?php
include ("conexao_banco.php");
require ("vendor/autoload.php");
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();

$array = array('A0001','A0002'); 
$date1 = '2023-08-14';
$date2 = '2023-08-15';


foreach($array as $account){
    $sheet = $spreadsheet->getActiveSheet();
    $sheet->setTitle($account);

    $sql = $conn->prepare("call procedure (?, ?, ?)");
    $sql->bind_param("sss", $conta, $date1, $date2);
    $sql->execute();    
    $res = $sql->get_result();    
    $i = 1;    
    while($row = $res->fetch_assoc()){    
        $sheet->setCellValue("A$i", $row["IDACCOUNT"]);
        $sheet->setCellValue("B$i", $row["DATE1"]);
        $sheet->setCellValue("C$i", $row["DATE2"]);
        $sheet->setCellValue("D$i", $row["COLUMN1"]);
        $sheet->setCellValue("E$i", $row["COLUMN2"]);       
        $i++;
    }

    $sheet->insertNewRowBefore(1, 1);

    $sheet->setCellValue("A1", "IDACCOUNT");
    $sheet->setCellValue("B1", "DATE1");
    $sheet->setCellValue("C1", "DATE2");
    $sheet->setCellValue("D1", "COLUMN1");
    $sheet->setCellValue("E1", "COLUMN2");

    // for bold on header
    $highestColumn = $sheet->getHighestColumn();
    $sheet->getStyle('A1:E1:' . $highestColumn . '1' )->getFont()->setBold(true);
}

// saving file
$filename = "teste.xlsx";
$writer = new Xlsx($spreadsheet);
$writer->save($filename);
?>

 

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 1

Eu fiz assim:

...
foreach($array as $key => $account){
    if($key!==0){
        $spreadsheet->createSheet($key);
        $sheet=$spreadsheet->getSheet($key);} else {
        $sheet=$spreadsheet->getActiveSheet();}
    $sheet->setTitle($account);
...

Mas fiquei curioso com a consulta do PDO. Tem jeito de publicar a estrutura do banco de dados e a procedure?

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0
Em 18/08/2023 em 15:28, Frank K Hosaka disse:

Mas fiquei curioso com a consulta do PDO. Tem jeito de publicar a estrutura do banco de dados e a procedure?

 

Estou a enfrentar esse problema. Quando chamo um só valor através de variável, faz a consulta e gera o excel, com várias a procedure não roda.

Link para o comentário
Compartilhar em outros sites

  • 0
Em 22/08/2023 em 15:45, Frank K Hosaka disse:

Para ajudá-lo melhor, preciso da estrutura da tabela que você está usando bem como a lista da procedure dentro do banco de dados, eu não consegui imitar o seu código aqui no meu PC, e se possível com alguns dados da tabela também.

a procedure é formada com subqueries onde é chamada um identificador string que depois pega o ID com validação de periodo (data inicial e final) e depois listado os registros, segue o exemplo:

 

CREATE DEFINER=`user`@`%` PROCEDURE `procedure_exemplo`(
    IN `CONTA` VARCHAR(11),
    IN `DATA1` DATE,
    IN `DATA2` DATE
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
begin

set @ID = (select ID from tabela where identificador = CONTA);
set @DATA1 = (SELECT DATA1);
set @DATA2 = (SELECT DATA2);

select 
        k.*
from

(select
        x.*
from

(
(select identificador, col1, col2, col3, col4, col5, data from tabela1 1a where identificador = @ID
union
select identificador, col1, col2, col3, col4, col5, data from tabela1_historico 1b where identificador = @ID)

union

(select identificador, col1, col2, col3, col4, col5, data from tabela2 2a where identificador = @ID
union
select identificador, col1, col2, col3, col4, col5, data from tabela2_historico 2b where identificador = @ID)

union

(select identificador, col1, col2, col3, col4, col5, data from tabela3 3a where identificador = @ID
union
select identificador, col1, col2, col3, col4, col5, data from tabela3_historico 3b where identificador = @ID)
order by 5,1) as x) as k

where k.DATA>= @DATA1 and k.DATA < DATE_ADD(@DATA2, INTERVAL 1 DAY);

END

 

Editado por peterhall
Link para o comentário
Compartilhar em outros sites

  • 0

Eu não vejo como conciliar essa procedure que você passou com a primeira procedure que você apresentou:

$sql = $conn->prepare("call procedure (?, ?, ?)");
    $sql->bind_param("sss", $conta, $date1, $date2);

principalmente o "sss". Pelo que entendi na nova procedure existem 6 tabelas (tabela1, tabela1_historico, tabela2, tabela2_historico), mas todos com os mesmos campos. Tem como passar o exemplo de apenas um único registro,

com identificador, col1, ..., col5, data?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...