Come esportare i dati del database MySQL in Excel utilizzando PHP
Recentemente ho pubblicato un articolo Come leggere file CSV ed Excel in PHP utilizzando PhpSpreadsheet e uno dei lettori ha chiesto di esportare i record del database MySQL in un file Excel. L’utente potrebbe aver bisogno dei propri dati nel file Excel o CSV in modo da poterli leggere o condividere facilmente. In questo articolo abbiamo discusso di come esportare i dati da un database in file Excel e CSV. Oltre a questo, studieremo anche come inviare questo file esportato come allegato all’e-mail.
Iniziare
Per iniziare, devi prima installare la libreria PhpSpreadsheet. Consiglio di utilizzare Composer per l’installazione della libreria. Apri il terminale nella directory principale del tuo progetto ed esegui il comando:
composer require phpoffice/phpspreadsheet
PhpSpreadsheet è la libreria che fornisce supporto per la lettura e la scrittura di diversi tipi di formati di file. Di seguito è riportato lo screenshot dei formati di file supportati.
Il nostro obiettivo finale è esportare i record della tabella del database in un file Excel/CSV. Prendo come esempio la tabella "prodotti". Creiamo una tabella "prodotti" nel database eseguendo la query seguente.
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;
Successivamente, aggiungi alcune voci fittizie nella tabella in modo da visualizzare alcuni record nel file esportato.
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');
Dopo questo creare un db.php
file in cui scriveremo la connessione al database.
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);
}
Assicurati di sostituire i segnaposto con i valori effettivi nel codice sopra. Nella parte successiva del tutorial, assegnerò una sezione separata sull’esportazione dei dati in Excel, in CSV e sull’invio dell’e-mail con un file esportato come allegato.
Esporta i dati del database MySQL in Excel usando PHP
Hai installato la libreria e sei pronto con una tabella di database con voci fittizie. Ora puoi andare avanti e scrivere il codice effettivo che esporterà un file Excel con i dati inseriti.
Crea un index.php
file nella directory principale. In questo file, scriverò una query SELECT per recuperare i dati dal database, scrivere questi dati in Excel e infine farli scaricare 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 esegui questo file PHP su un browser, un file Excel inizierà a essere scaricato automaticamente e questo foglio Excel avrà il seguente output.
Esporta i dati del database MySQL in CSV usando PHP
Nella sezione precedente, abbiamo esportato i dati in un file Excel. Se qualcuno sta cercando di esportare dati in un file CSV, devi modificare alcune righe nel codice sopra.
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');
Invia un’e-mail con un file come allegato
Finora in questo articolo abbiamo visto come scaricare il file in formato CSV ed Excel. Alcuni utenti potrebbero voler inviare il file esportato come allegato all’e-mail. Vediamo come realizzarlo.
Per prima cosa installa la libreria PHPMailer usando il comando:
composer require phpmailer/phpmailer
Dopo aver installato la libreria, puoi utilizzare qualsiasi server SMTP per inviare un’e-mail. Tocca a voi. Puoi utilizzare il server SMTP fornito dall’hosting, AWS SES o il server SMTP di Gmail. Se stai utilizzando il server SMTP di Gmail, leggi il nostro articolo Invia e-mail utilizzando il server SMTP di Gmail dallo script PHP che spiega la configurazione necessaria per questo.
Il codice è scritto in precedenza scarica il file automaticamente. Ma ora, invece di renderlo scaricabile, salveremo il file nella directory e poi lo invieremo come allegato. In breve, avremo il codice qui sotto per salvare il file.
...
$filename = 'products.csv';
if (!file_exists('files')) {
mkdir('files', 0755);
}
$Excel_writer->save('files/'.$filename);
Il nostro codice finale per inviare l’allegato in un’e-mail sarà il seguente:
<?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;
}
Sostituisci i segnaposto con i valori effettivi e l’email verrà inviata con un allegato all’indirizzo email del destinatario.
Spero che tu capisca come esportare i record del database MySQL nel file Excel o CSV e anche inviarlo come allegato. Per favore condividi i tuoi pensieri e suggerimenti nella sezione commenti qui sotto.
articoli Correlati
- Come trasferire file su server remoto in PHP
- Invia e-mail utilizzando Mailjet (alternativa al server SMTP di Gmail) in PHP
- Come convertire HTML in PDF in PHP