หลังจากที่เรียนรู้การแทรกรูปภาพแล้วในบทเรียนรู้นี้มาแทรกตารางเข้าไปในเอกสาร MS Word จาก MS Word Template กันครับ
เริ่มจากการตั้งค่าไฟล์ MS Word Template ให้ได้ตารางตามต้องการก่อน เช่น
จะเห็นว่ามีตัวแปร ${no} ${item} ${amount} และ ${price_sum}
จากนั้นเขียนโปรแกรมในการ Clone Row ของตาราง โดยใช้การ Loop ดังนี้
$datas = [
['no' => 1, 'item' => 'ทดสอบ1', 'price' => 250, 'amount' => 2],
['no' => 2, 'item' => 'ทดสอบ2', 'price' => 150, 'amount' => 3],
['no' => 3, 'item' => 'ทดสอบ3', 'price' => 50, 'amount' => 5],
['no' => 4, 'item' => 'ทดสอบ4', 'price' => 20, 'amount' => 8],
['no' => 5, 'item' => 'ทดสอบ5', 'price' => 350, 'amount' => 1],
];
$templateProcessor->cloneRow('item', sizeof($datas));
$i = 1;
foreach ($datas as $item => $val) { //item is key
$templateProcessor->setValue('no#'.$i, $i);
$templateProcessor->setValue('item#'.$i, $val['item']);
$templateProcessor->setValue('amount#'.$i, $val['amount']);
$templateProcessor->setValue('price_sum#'.$i, ($val['price'] > 0 ? number_format($val['price'] * $val['amount'], 2) : ''));
$i++;
}
ดูไฟล์กันแบบเต็มๆ
<?php
/**
* User: kongoon
* Date: 19/7/2560
* Time: 12:53
*/
namespace frontend\modules\supply\controllers;
use common\components\Processor;
use common\models\SupplyDurableItem;
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\TemplateProcessor;
use Yii;
use yii\helpers\Html;
use yii\helpers\Url;
use yii\web\Controller;
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\Settings;
class TestController extends Controller
{
public function actionWord()
{
$data = '';
foreach(SupplyDurableItem::find()->limit(10)->all() as $item){
$data .= $item->detail.' ';
}
Settings::setTempDir(Yii::getAlias('@webroot').'/temp/'); //กำหนด folder temp สำหรับ windows server ที่ permission denied temp (อย่ายลืมสร้างใน project ล่ะ)
//$templateProcessor = new TemplateProcessor(Yii::getAlias('@webroot').'/msword/template_in.docx');//เลือกไฟล์ template ที่เราสร้างไว้
$templateProcessor = new Processor(Yii::getAlias('@webroot').'/msword/template_in.docx');//เลือกไฟล์ template ที่เราสร้างไว้
$templateProcessor->setValue('doc_department', 'สำนักเทคโนโลยีสารสนเทศ');//อัดตัวแปร รายตัว
$templateProcessor->setValue(
[
'doc_no',
'doc_date',
'doc_title',
'doc_to',
'doc_detail1',
'doc_detail2',
'doc_detail3',
'doc_name',
'doc_position'
],
[
'ทน1234/2345',
'18 กรกฏาคม 2560',
'การสร้างระบบออกเอกสารราชการ',
'ผู้อำนวยการสถาบันเทคโนโลยีสารสนเทศแห่งชาติ',
'เนื่องด้วยการพัฒนาระบบ Web-based Application ในปัจจุบันประสบปัญหาในการสร้างเอกสารราชการ กระผมนายมานพ กองอุ่น มีความประสงค์จะพัฒนาระบบการออกเอกสารราชการตามแม่แบบราชการสำหรับใช้งานในระบบ Web-based Application ดังนั้น กระผมจึงพัฒนาตัวอย่างของการออกเอกสารหนังสือราชการ เพื่อเป็นแนวทางให้กับหน่วยงานต่างๆ สามารถนำไปปรับใช้ในระบบ Web-based ของตัวเองได้',
$data,
'จึงเรียนมาเพื่อโปรดทราบ',
'นายมานพ กองอุ่น',
'นักเทคโนโลยีสารสนเทศแห่งประเทศไทย'
]);//อัดตัวแปรแบบชุด
$templateProcessor->setImg('img1', ['src' => Yii::getAlias('@webroot') . '/img/logo.png', 'swh' => 150]);//ที่อยู่รูป frontend/web/img/logo.png, swh ความกว้าง/สูง 150
$templateProcessor->setImg('img2', ['src' => Yii::getAlias('@webroot') . '/images/cell.jpg', 'swh' => 350]);//ที่อยู่รูป frontend/web/images/cell.jpg, swh ความกว้าง/สูง 350
$datas = [
['no' => 1, 'item' => 'ทดสอบ1', 'price' => 250, 'amount' => 2],
['no' => 2, 'item' => 'ทดสอบ2', 'price' => 150, 'amount' => 3],
['no' => 3, 'item' => 'ทดสอบ3', 'price' => 50, 'amount' => 5],
['no' => 4, 'item' => 'ทดสอบ4', 'price' => 20, 'amount' => 8],
['no' => 5, 'item' => 'ทดสอบ5', 'price' => 350, 'amount' => 1],
];
$templateProcessor->cloneRow('item', sizeof($datas));
$i = 1;
foreach ($datas as $item => $val) { //item is key
$templateProcessor->setValue('no#'.$i, $i);
$templateProcessor->setValue('item#'.$i, $val['item']);
$templateProcessor->setValue('amount#'.$i, $val['amount']);
$templateProcessor->setValue('price_sum#'.$i, ($val['price'] > 0 ? number_format($val['price'] * $val['amount'], 2) : ''));
$i++;
}
$templateProcessor->saveAs(Yii::getAlias('@webroot').'/msword/ms_word_result.docx');//สั่งให้บันทึกข้อมูลลงไฟล์ใหม่
/*
//ตัวอย่างการสร้างไฟล์ ms word แบบไม่มี template
$PHPWord = new PHPWord();
$PHPWord->setDefaultFontName('TH Sarabun New');
$PHPWord->setDefaultFontSize(16);
$section = $PHPWord->createSection();
$section->addText('ทดสอบข้อความ');
$section->addTextBreak(2);
$objWriter = IOFactory::createWriter($PHPWord, 'Word2007');
$objWriter->save(Yii::getAlias('@webroot').'/msword/ms_word_test.docx');
$objReader = IOFactory::load(Yii::getAlias('@webroot').'/msword/ms_word_test.docx');
*/
echo '<p>';
echo Html::a('ดาวน์โหลดเอกสาร', Url::to(Yii::getAlias('@web').'/msword/ms_word_result.docx'), ['class' => 'btn btn-info']);//สร้าง link download
echo '</p>';
//ลองให้ google doc viewer แสดงข้อมูลไฟล์ให้เห็นผ่าน iframe (อาจเพี้ยนๆ บ้าง)
echo '<iframe src="http://docs.google.com/viewer?url='.Url::to(Yii::getAlias('@web').'/msword/ms_word_result.docx', true).'&embedded=true" style="position: absolute;width:100%; height: 100%;border: none;"></iframe>';
}
}
เมื่อทดสอบจะได้ไฟล์ลักษณะดังนี้
ความคิดเห็น