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/phpspreadsheetPhpSpreadsheet ä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.phpfil 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.phpfil 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/phpmailerNä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

