สร้างไฟล์ MS Word จาก Word Template สำหรับงานเอกสารราชการ

คู่มือการเรียนรู้ Yii Framework 2 (Yii2)

บทเรียนดีๆ สำหรับผู้ที่ต้องการแบ่งปัน บทเรียนของคุณอาจมีค่าสำหรับอีกหลายๆ คน

beta version

สร้างไฟล์ MS Word จาก Word Template สำหรับงานเอกสารราชการ

มานพ กองอุ่น phpword yii2 yii framework 4,155

เอาล่ะครับ หลังจากที่ประสบปัญหากับการใช้งาน HTML to PDF ด้วย mPDF เนื่องจากไฟล์ PDF ไม่สามารถจัดรูปแบบได้อย่างคล่องตัวมากนัก เช่นคำตก จัดรูปแบบต่างๆ เล็กๆ น้อยๆ ทำให้ไม่สะดวกแก่ผู้ใช้งาน และการจัด HTML ไปเป็น PDF ในรูปแบบเอกสารราชการนี่ปวดหัวจริงๆ 

ในบทความนี้เราจะมาเขียนโปรแกรมเพื่อให้สร้างไฟล์ MS Word กัน โดยเราจะมีเอกสารต้นฉบับ (แน่นอนว่าการตั้งค่าต่างๆ ได้ถูกกำหนดตามรูปแบบเอกสารราชการแล้ว) เช่นขนาดข้อความ ตราครุฑ เยื้องหน้า เยื้องหลัง การเว้นบรรทัด บลาๆๆ ให้เป็นรูปแบบที่ต้องการไว้เลย แล้วเอา PHP อัดข้อความลงตามตำแหน่งที่ต้องการ

โดยเราจะใช้ Package ที่มีชื่อว่า PHPWord สามารถดูรายละเอียดได้ที่ 

https://github.com/PHPOffice/PHPWord

การติดตั้ง Package

เราสามารถติดตั้ง Package ผ่าน Composer โดยพิมพ์คำสั่ง

composer require phpoffice/phpword

รอสักพัก

สร้าง Word Template 

เราจะใช้ไฟล์ MS Word ที่มีการจัดรูปแบบเรียบร้อยแล้วเป็นตัวแม่แบบ (ไม่ใช่ไฟล์แม่แบบ .dot ของ MS Word นะ) เป็นแม่แบบที่เราสร้างขึ้นสำหรับใช้ในงานนี้ ก็นามสกุล .docx ธรรมดานี่ล่ะ ตัวอย่างเช่น ไฟล์ template_in.docx 

กำหนดตัวแปรต่างๆ ที่จะรับข้อมูลมาแสดงผลดังตัวอย่างต่อไปนี้ เอกสารหนังสือบันทึกข้อความ ให้ระบุตัวแปร ${variable_name}

พอได้แม่แบบเสร็จละ เราจะเอาไปเก็บไว้ที่ frontend/web/msword/template_in.docx จำ path ไว้นะ

เขียนโปรแกรมสำหรับสร้างเอกสาร MS Word

ขั้นตอนนี้หลังจากติดตั้ง Package เรียบร้อย Yii จะ autoload แล้วสามารถเรียกใช้งานได้เลย ไปดูตัวอย่าง

<?php
/**
 * User: kongoon
 * Date: 19/7/2560
 * Time: 12:53
 */

namespace frontend\modules\supply\controllers;


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()
    {
        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->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 ของตัวเองได้',
                'จึงเรียนมาเพื่อโปรดทราบ',
                'นายมานพ กองอุ่น',
                'นักเทคโนโลยีสารสนเทศแห่งประเทศไทย'
            ]);//อัดตัวแปรแบบชุด
        $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>';
    }

}

 

ทดสอบการแสดงผล

ลองเปิด URL ในการแสดงผล จะได้ดังนี้

ลองดาวน์โหลดมาเปิดดู จะได้เอกสารตรงเปะตามรูปแบบพร้อมข้อความจากการเขียนโปรแกรม แจ่มแฮะ

ท้ายนี้ถ้าบทเรียนรู้เป็นประโยชน์ก็แชร์ๆ กันไปนะครับ การจัดเอกสารใน Web-based Application จาก HTML นี่เป็นปัญหาระดับชาติเลยก็ว่าได้ การแก้ปัญหาด้วยวิธีนี้ก็เป็นแนวทางหนึ่งที่จะให้ผู้ใช้งานสะดวกมากยิ่งขึ้น 

อ้าว ไป ลุยๆ กัน


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

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

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