11 بهمن 1400
استفاده از جاوااسکریپت برای تبدیل جداول به فایل اکسل، در جای خود بسیار کاربردی است اما - برای من - مشکل جایی خودش را نشان میداد که حجم دادهها بالا بود؛ در نتیجه هنگام خروجی گرفتن اکسل، برنامه دچار خطا، کُندی یا نقص میشد.
در این مقاله قصد داریم با کمک php اطلاعات فراخوانی شده از دیتابیس را به صورت جدول نمایش داده و سپس آن را به فایل اکسل تبدیل کنیم. بنابراین در اولین گام کلاس PHP_XLSXWriter را به برنامه خود اضافه میکنیم. میتوانید به قسمت دانلود این صفحه رفته و فایلهای مربوطه را دریافت کنید.
<?php include("xlsxwriter.class.php"); ?>
مثال زیر سادهترین شکل استفاده از این کلاس است. خروجی کار یک فایل اکسل با مقادیر 1، Ali و علی است:
<?php include("xlsxwriter.class.php"); $xlsArr = array('1','Ali','علی'); $writer = new XLSXWriter(); $writer->writeSheetRow('Sheet1', $xlsArr); $writer->writeToFile('report.xlsx'); ?>
حال همراه با ایجاد برنامهای که در بالا بدان اشاره شد، به تشریح پارامترهای دیگر این کلاس نیز میپردازیم. در ابتدا دیتابیس را که حاوی اطلاعات ماست فراخوانی کرده و در جدول نمایش میدهیم. همزمان دادههای جدول را در آرایهای ذخیره میکنیم تا در تشکیل فایل اکسل از آن استفاده کنیم.
<?php $host = "localhost"; //هاست $user = "root"; //نام کاربری $pass = ""; //رمز عبور $db = "my_db"; //نام دیتابیس $table = "my_tbl"; //نام جدول $dsn = "mysql:host=$host;dbname=$db;charset=utf8"; $options = [ PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; try { $pdoConn = new PDO($dsn, $user, $pass, $options); } catch (Exception $e) { exit("خطای اتصال"); } ?>
CREATE TABLE `my_tbl` ( `id` int(11) NOT NULL, `title` varchar(50) NOT NULL DEFAULT '', `amount` varchar(15) NOT NULL DEFAULT '0', `count` int(5) NOT NULL DEFAULT '0', `datetime` varchar(50) NOT NULL DEFAULT '' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='جدول من'; INSERT INTO `my_tbl` (`id`, `title`, `amount`, `count`, `datetime`) VALUES (1, 'پیراهن', '200000', 10, '2022-01-01 12:00:00'), (2, 'شلوار', '300000', 20, '2022-02-01 12:00:00'), (3, 'جوراب', '20000', 15, '2022-03-01 12:00:00'), (4, 'کلاه', '100000', 5, '2022-04-01 12:00:00'), (5, 'کفش', '300000', 12, '2022-05-01 12:00:00'); ALTER TABLE `my_tbl` ADD PRIMARY KEY (`id`); ALTER TABLE `my_tbl` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
<?php header('Content-Type: text/html; charset=utf-8'); include("db.php"); include("xlsxwriter.class.php"); $tbl = "<table>"; $tbl .= "<thead>"; $tbl .= "<tr>"; $tbl .= "<th>ردیف</th>"; $tbl .= "<th>عنوان</th>"; $tbl .= "<th>مبلغ</th>"; $tbl .= "<th>تعداد</th>"; $tbl .= "<th>تاریخ</th>"; $tbl .= "</tr>"; $tbl .= "</thead>"; $tbl .= "<tbody>"; $rowArr = array(); $header = array( 'ردیف'=>'integer', 'عنوان'=>'string', 'مبلغ'=>'price', 'تعداد'=>'integer', 'تاریخ'=>'YYYY-MM-DD HH:MM:SS' ); $option1 = array( 'font'=>'Tahoma', 'font-size'=>10, 'font-style'=>'bold', 'fill'=>'#aaa', 'halign'=>'center', 'border'=>'left,right,top,bottom', 'widths'=>[10,10,15,10,20] ); $sql = "SELECT * FROM $table"; $stmt = $pdoConn->prepare($sql); $stmt->execute(); $row = $stmt->fetchAll(); for($i=0;$i<count($row);$i++) { $id = $row[$i]['id']; $title = $row[$i]['title']; $amount = $row[$i]['amount']; $count = $row[$i]['count']; $date = $row[$i]['datetime']; $tbl .= "<tr>"; $tbl .= "<td>".$id."</td>"; $tbl .= "<td>".$title."</td>"; $tbl .= "<td>".$amount."</td>"; $tbl .= "<td>".$count."</td>"; $tbl .= "<td>".$date."</td>"; $tbl .= "</tr>"; $option2 = array( ['font-size'=>6], ['font-style'=>'bold','wrap_text'=>true], ['fill'=>'#ffc'], ['color'=>'#00f'], ['border'=>'bottom','width'=>300] ); array_push($rowArr, array($id,$title,$amount,$count,$date)); } $tbl .= "</tbody>"; $tbl .= "</table>"; echo $tbl; $writer = new XLSXWriter(); $writer->setRightToLeft(true); $writer->writeSheetHeader('Sheet1', $header, $option1); foreach($rowArr as $row) $writer->writeSheetRow('Sheet1', $row, $option2); $writer->writeToFile('report.xlsx'); echo "<a href=\"report.xlsx\">دانلود اکسل</a>"; ?>
همانطور که در فایل index.php مشاهده میکنید برای ساخت فایل اکسل از دادهها، چند مولفه اصلی داریم و تعدادی پارامتر فرعی:
سطر new XLSXWriter() یک آبجکت از کلاس را ایجاد میکند
سطر writeSheetHeader('Sheet1', $header) هدر یا عنوان ستونهای فایل را جایگذاری میکند
سطر writeSheetRow('Sheet1', $row) مقادیر هر ردیف فایل اکسل را مقداردهی میکند
سطر writeToFile('report.xlsx') فایل خروجی را ذخیره میکند
سایر پارامترها: بهکمک این کلاس میتوانیم جزییات بیشتری به فایل اکسل ایجاد شده بیفزاییم؛ مثلا با استفاده از setRightToLeft خروجی را راست به چپ کنیم، همینطور با افزودن پارامتر $option در writeSheetHeader یا writeSheetHeader مشخص کنیم که هر سلول چه خصوصیات یا فرمتی داشته باشد. ویژگیهایی مثل فونت، اندازه، رنگ، پسزمینه، عرض، ارتفاع، خطوط و فرمتهایی مانند text، Integer، price، date و نظایر آن که با مشاهده «دمو» یا دانلود مثال این مقاله میتوانید نتیجه کار را مشاهده فرمایید.