Jump to content
Fórum Script Brasil
  • 0

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


peterhall

Question

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 to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 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?

Edited by Frank K Hosaka
Link to comment
Share on other 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 to comment
Share on other 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

 

Edited by peterhall
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.9k
×
×
  • Create New...