Como exportar dados do banco de dados MySQL para Excel usando PHP
Recentemente publiquei um artigo Como ler arquivos CSV e Excel em PHP usando planilha PhpSpreadsheet e um dos leitores perguntou sobre a exportação de registros de banco de dados MySQL para arquivo Excel. O usuário pode precisar de seus dados no arquivo Excel ou CSV para que possa ler ou compartilhar facilmente. Neste artigo, discutimos como é possível exportar dados de um banco de dados para arquivos Excel e CSV. Além disso, estudaremos também como enviar este arquivo exportado como anexo no e-mail.
Começando
Para começar, primeiro você precisa instalar a biblioteca PhpSpreadsheet. Recomendo usar o Composer para instalação da biblioteca. Abra o terminal no diretório raiz do seu projeto e execute o comando:
composer require phpoffice/phpspreadsheet
PhpSpreadsheet é a biblioteca que fornece suporte para leitura e gravação de diferentes tipos de formatos de arquivo. Abaixo está a captura de tela dos formatos de arquivo suportados.
Nosso objetivo final é exportar os registros da tabela do banco de dados para um arquivo Excel / CSV. Estou tomando a tabela de ‘produtos’ como exemplo. Vamos criar uma tabela ‘produtos’ no banco de dados executando a consulta abaixo.
CREATE TABLE `products` ( `id` int(11) NOT NULL AUTO_INCREMENT,
`product_name` varchar(255) NOT NULL,
`product_sku` varchar(255) NOT NULL,
`product_price` varchar(255) NOT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Em seguida, adicione algumas entradas fictícias na tabela para ver alguns registros no arquivo exportado.
INSERT INTO `products` (`id`, `product_name`, `product_sku`, `product_price`) VALUES
(1, 'Apple', 'app_111', '$1000'),
(2, 'Lenovo', 'len_222', '$999'),
(3, 'Samsung', 'sam_689', '$1200'),
(4, 'Acer', 'ace_620', '$900');
Depois disso, crie um db.php
arquivo onde escreveríamos a conexão do banco de dados.
db.php
<?php
$db_host = 'DATABASE_HOST';
$db_username = 'DATABASE_USERNAME';
$db_password = 'DATABASE_PASSWORD';
$db_name = 'DATABASE_NAME';
$db = new mysqli($db_host, $db_username, $db_password, $db_name);
if($db->connect_error){
die("Unable to connect database: ". $db->connect_error);
}
Certifique-se de substituir os marcadores de posição pelos valores reais no código acima. Na próxima parte do tutorial, alocarei uma seção separada sobre a exportação de dados para Excel, para CSV, e envio de e-mail com um arquivo exportado como anexo.
Exportar dados do banco de dados MySQL para Excel usando PHP
Você instalou a biblioteca e está pronto com uma tabela de banco de dados com entradas fictícias. Agora você pode prosseguir e escrever o código real que exportará um arquivo Excel com os dados preenchidos.
Crie um index.php
arquivo no diretório raiz. Neste arquivo, gravarei uma consulta SELECT para buscar dados do banco de dados, gravarei esses dados no Excel e, finalmente, farei o download automaticamente.
index.php
<?php
require_once "vendor/autoload.php";
require_once "db.php";
use PhpOfficePhpSpreadsheetSpreadsheet;
use PhpOfficePhpSpreadsheetWriterXlsx;
$spreadsheet = new Spreadsheet();
$Excel_writer = new Xlsx($spreadsheet);
$spreadsheet->setActiveSheetIndex(0);
$activeSheet = $spreadsheet->getActiveSheet();
$activeSheet->setCellValue('A1', 'Product Name');
$activeSheet->setCellValue('B1', 'Product SKU');
$activeSheet->setCellValue('C1', 'Product Price');
$query = $db->query("SELECT * FROM products ORDER BY id DESC");
if($query->num_rows > 0) {
$i = 2;
while($row = $query->fetch_assoc()) {
$activeSheet->setCellValue('A'.$i, $row['product_name']);
$activeSheet->setCellValue('B'.$i, $row['product_sku']);
$activeSheet->setCellValue('C'.$i, $row['product_price']);
$i++;
}
}
$filename = 'products.xlsx';
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename='. $filename);
header('Cache-Control: max-age=0');
$Excel_writer->save('php://output');
Quando você executa este arquivo PHP em um navegador, um arquivo Excel começará a ser baixado automaticamente e esta planilha Excel terá a seguinte saída.
Exportar dados do banco de dados MySQL para CSV usando PHP
Na seção anterior, exportamos os dados para um arquivo Excel. Se alguém deseja exportar dados em um arquivo CSV, você precisa alterar algumas linhas no código acima.
csv.php
<?php
require_once "vendor/autoload.php";
require_once "db.php";
use PhpOfficePhpSpreadsheetSpreadsheet;
use PhpOfficePhpSpreadsheetWriterCsv;
$spreadsheet = new Spreadsheet();
$Excel_writer = new Csv($spreadsheet);
$spreadsheet->setActiveSheetIndex(0);
$activeSheet = $spreadsheet->getActiveSheet();
$activeSheet->setCellValue('A1', 'Product Name');
$activeSheet->setCellValue('B1', 'Product SKU');
$activeSheet->setCellValue('C1', 'Product Price');
$query = $db->query("SELECT * FROM products ORDER BY id DESC");
if($query->num_rows > 0) {
$i = 2;
while($row = $query->fetch_assoc()) {
$activeSheet->setCellValue('A'.$i, $row['product_name']);
$activeSheet->setCellValue('B'.$i, $row['product_sku']);
$activeSheet->setCellValue('C'.$i, $row['product_price']);
$i++;
}
}
$filename = 'products.csv';
header('Content-Type: application/text-csv');
header('Content-Disposition: attachment;filename='. $filename);
header('Cache-Control: max-age=0');
$Excel_writer->save('php://output');
Envie um e-mail com o arquivo como anexo
Até agora neste artigo, vimos como fazer o download do arquivo em formato CSV e Excel. Alguns usuários podem querer enviar o arquivo exportado como um anexo no e-mail. Vamos ver como conseguir isso.
Primeiro instale a biblioteca PHPMailer usando o comando:
composer require phpmailer/phpmailer
Depois de instalar a biblioteca, você pode usar qualquer servidor SMTP para enviar um e-mail. Você decide. Você pode usar o servidor SMTP fornecido pela hospedagem, AWS SES ou servidor SMTP do Gmail. Se você estiver usando o servidor SMTP do Gmail, leia nosso artigo Enviar e-mail usando o servidor SMTP do Gmail a partir de script PHP, que explica a configuração necessária para isso.
O código é escrito anteriormente baixa o arquivo automaticamente. Mas agora, em vez de torná-lo disponível para download, salvaremos o arquivo no diretório e o enviaremos como anexo. Resumindo, teremos abaixo o código para salvar o arquivo.
...
$filename = 'products.csv';
if (!file_exists('files')) {
mkdir('files', 0755);
}
$Excel_writer->save('files/'.$filename);
Nosso código final para enviar anexo em um e-mail será o seguinte:
<?php
require_once "vendor/autoload.php";
require_once "db.php";
use PhpOfficePhpSpreadsheetSpreadsheet;
use PhpOfficePhpSpreadsheetWriterCsv;
//Import PHPMailer classes into the global namespace
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;
$spreadsheet = new Spreadsheet();
$Excel_writer = new Csv($spreadsheet);
$spreadsheet->setActiveSheetIndex(0);
$activeSheet = $spreadsheet->getActiveSheet();
$activeSheet->setCellValue('A1', 'Product Name');
$activeSheet->setCellValue('B1', 'Product SKU');
$activeSheet->setCellValue('C1', 'Product Price');
$query = $db->query("SELECT * FROM products ORDER BY id DESC");
if($query->num_rows > 0) {
$i = 2;
while($row = $query->fetch_assoc()) {
$activeSheet->setCellValue('A'.$i, $row['product_name']);
$activeSheet->setCellValue('B'.$i, $row['product_sku']);
$activeSheet->setCellValue('C'.$i, $row['product_price']);
$i++;
}
}
$filename = 'products.csv';
if (!file_exists('files')) {
mkdir('files', 0755);
}
$Excel_writer->save('files/'.$filename);
// send as an attachment
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'SMTP_HOST';
$mail->SMTPAuth = true;
$mail->Username = 'SMTP_USERNAME'; //username
$mail->Password = 'SMTP_PASSWORD'; //password
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;
$mail->setFrom('FROM_EMAIL_ADDRESS', 'FROM_NAME');
$mail->addAddress('RECEPIENT_EMAIL_ADDRESS', 'RECEPIENT_NAME');
$mail->addAttachment('files/'.$filename);
$mail->isHTML(true);
$mail->Subject = 'Our Exported File';
$mail->Body = 'Our Exported File';
$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo 'Message could not be sent. Mailer Error: '. $mail->ErrorInfo;
}
Substitua os marcadores pelos valores reais e o email será enviado com um anexo ao endereço de email do destinatário.
Espero que você entenda como exportar registros do banco de dados MySQL para o arquivo Excel ou CSV e também enviá-lo como um anexo. Por favor, compartilhe seus pensamentos e sugestões na seção de comentários abaixo.
Artigos relacionados
- Como transferir arquivos para servidor remoto em PHP
- Enviar e-mail usando Mailjet (alternativa ao servidor SMTP do Gmail) em PHP
- Como converter HTML para PDF em PHP