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

wave
มานพ กองอุ่น 20 ก.ค. 2017 11:30:32 32,876

เอาล่ะครับ หลังจากที่ประสบปัญหากับการใช้งาน 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

เขียนบทเรียนรู้ของคุณ

รายละเอียด
  • ดู 32,876
  • รักเลย 0
  • หมวดหมู่ Yii Framework 2 (Yii2)
  • เขียนเมื่อ
  • แก้ไขเมื่อ
  • Tags phpword yii2 yii framework
ข้อมูลผู้เขียน
มานพ กองอุ่น

มานพ กองอุ่น

เป็นสมาชิกเมื่อ: 18 ธ.ค. 2009

เนื้อหาที่เกี่ยวข้อง