แทรกตารางในเอกสาร MS Word จาก MS Word Template

แทรกตารางในเอกสาร MS Word จาก MS Word Template

มานพ กองอุ่น phpword yii2 advanced yii framework2 361

หลังจากที่เรียนรู้การแทรกรูปภาพแล้วในบทเรียนรู้นี้มาแทรกตารางเข้าไปในเอกสาร 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>';
    }

}

เมื่อทดสอบจะได้ไฟล์ลักษณะดังนี้


หากบทเรียนรู้มีความผิดพลาดประการใด หรือมีข้อเสนอแนะกรุณาแจ้ง contact@programmerthailand.com
มานพ กองอุ่น

มานพ กองอุ่น
admin

  • 2 เพื่อน
  • 16 ผู้ติดตาม
  • 773 โพสต์