Hur man exporterar MySQL-databasdata till Excel med PHP
Nyligen publicerade jag en artikel Hur man läser CSV- och Excel-filer i PHP med hjälp av PhpSpreadsheet och en av läsarna frågade om att exportera MySQL-databasposter till Excel-fil. Användaren kan behöva sin data i Excel- eller CSV-filen så att de enkelt kan läsa eller dela den. I den här artikeln diskuterade vi hur man kan exportera data från en databas till Excel- och CSV-filer. Utöver detta kommer vi också att studera hur man kan skicka den exporterade filen som en bilaga i e-postmeddelandet.
Komma igång
För att komma igång måste du först installera PhpSpreadsheet- biblioteket. Jag rekommenderar att du använder Composer för installation av biblioteket. Öppna terminalen i din projektkatalog och kör kommandot:
composer require phpoffice/phpspreadsheet
PhpSpreadsheet är biblioteket som ger stöd för läsning och skrivning av olika typer av filformat. Nedan visas skärmdumpen av filformat som stöds.
Vårt slutmål är att exportera databastabellposter till Excel / CSV-fil. Jag tar tabellen "produkter" som ett exempel. Låt oss skapa en tabell "produkter" i databasen genom att köra frågan nedan.
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;
Lägg sedan till några dummyposter i tabellen så att du ser några poster i den exporterade filen.
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');
Skapa sedan en db.php
fil där vi skulle skriva databasanslutningen.
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);
}
Se till att ersätta platshållarna med de faktiska värdena i ovanstående kod. I nästa del av handledningen tilldelar jag ett separat avsnitt om att exportera data till Excel, till CSV och skicka e-postmeddelandet med en exporterad fil som en bilaga.
Exportera MySQL-databasdata till Excel med PHP
Du har installerat biblioteket och är redo med en databastabell med dummy-poster. Nu kan du fortsätta och skriva den faktiska koden som exporterar en Excel-fil med data fylld i den.
Skapa en index.php
fil i rotkatalogen. I den här filen skriver jag en SELECT-fråga för att hämta data från databasen, skriva dessa data till Excel och slutligen ladda ner den automatiskt.
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');
När du kör den här PHP-filen i en webbläsare kommer en Excel-fil att ladda ner automatiskt och detta Excel-ark kommer att ha följande utdata.
Exportera MySQL-databasdata till CSV med PHP
I föregående avsnitt exporterade vi data till Excel-fil. Om någon vill exportera data i en CSV-fil måste du ändra några rader i ovanstående kod.
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');
Skicka ett e-postmeddelande med filen som en bilaga
Hittills i den här artikeln har vi sett hur man laddar ner filen i CSV- och Excel-format. Vissa användare kanske vill skicka den exporterade filen som en bilaga i e-postmeddelandet. Låt oss se hur man uppnår det.
Installera först PHPMailer- biblioteket med kommandot:
composer require phpmailer/phpmailer
När du har installerat biblioteket kan du använda vilken SMTP-server som helst för att skicka ett e-postmeddelande. Det är upp till dig. Du kan använda din värdbaserade SMTP-server, AWS SES eller Gmail SMTP-server. Om du går med Gmail SMTP-servern läs vår artikel Skicka e-post med Gmail SMTP-server från PHP-skript som förklarar konfigurationen som behövs för den.
Koden skrivs ned tidigare och laddar ner filen automatiskt. Men nu, istället för att göra den nedladdningsbar, kommer vi att spara filen i katalogen och sedan skicka den som en bilaga. Kort sagt, vi kommer att ha koden nedan för att spara filen.
...
$filename = 'products.csv';
if (!file_exists('files')) {
mkdir('files', 0755);
}
$Excel_writer->save('files/'.$filename);
Vår sista kod för att skicka bilagor i ett e-postmeddelande kommer att vara följande:
<?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;
}
Ersätt platshållarna med de faktiska värdena och e-postmeddelandet skickas med en bilaga till mottagarens e-postadress.
Jag hoppas att du förstår hur du exporterar MySQL-databasposter till Excel- eller CSV-filen och även skickar den som en bilaga. Dela dina tankar och förslag i kommentarsektionen nedan.
relaterade artiklar
- Hur man överför filer till fjärrserver i PHP
- Skicka e-post med Mailjet (alternativ till Gmail SMTP-server) i PHP
- Hur man konverterar HTML till PDF i PHP