Clicky

PHPExcel | suksit dot com

PHPExcel

ช่วงสัปดาห์ที่ผ่านมา มีโจทย์ให้สร้างเว็บเพื่อเก็บข้อมูลรายงานที่ปกติจะอยู่ในรูปแบบไฟล์ Excel ก็โอเค อยากได้ก็จัดให้ วิธีการที่ใช้ก็คือสร้าง textbox เป็นร้อยไปใส่ใน <table> กันดื้อๆ นี่แหละ ซึ่งก็เก็บข้อมูลได้ไม่มีปัญหาอะไร (แต่แอบด่าอยู่ในใจ ทำไมไม่ใช้พวก SharePoint อะไรไปเลยฟระ)

มาเดือดร้อนตอนแสดงผล เนื่องจากต้องสามารถพรินท์ออกมาเป็นรายงานได้ด้วย ซึ่งรายงานแต่ละหน้าก็ดันหน้าตาไม่เหมือนกันอีก คิดไปคิดมาถ้าจะทำเป็น template ก็ต้องทำเกือบๆ 50 ไฟล์ =.=

เลยวกกลับมาหา Excel เพราะแต่ก่อนจำได้ว่าเคยสร้างไฟล์ Excel ด้วย PHP แต่ตอนนั้นเป็นการสร้างไฟล์เปล่าๆ ขึ้นมาใหม่ แล้วใส่ข้อมูลลงไป ส่วนคราวนี้จะต่างไปเล็กน้อย เพราะต้องอ่านไฟล์ template ที่แบ่งหน้าและเซ็ต print area ไว้เรียบร้อยแล้วเข้ามาก่อน จากนั้นก็กรอกข้อมูล แล้วค่อยเซฟเป็นรายงาน

google อยู่ครึ่งวันก็ไม่พบตัวเลือกเจ๋งๆ ซักที เพราะส่วนใหญ่จะเป็นไลบรารี่สำหรับสร้างไฟล์ Excel ขึ้นมาใหม่ ไม่สามารถอ่าน/เขียนไฟล์ที่มีอยู่แล้วได้ จนกระทั่งมาเจอ PHPExcel ก็พบว่า โอ้ววว ตัวนี้แหละ ใช่เลย!

PHPExcel สามารถอ่าน/เขียนไฟล์ Excel ได้ทั้งแบบเก่าคือ Excel5 ของ MS Office 97/XP/2003 และแบบใหม่คือ OpenXML ของ MS Office 2007 โดยมีข้อแม้นิดหน่อยคือ ถ้าจะทำงานกับไฟล์ Excel 2007 ควรใช้ PHP เวอร์ชันตั้งแต่ 5.2.9 ขึ้นไป แต่ถ้าใช้กับ Excel รุ่นต่ำกว่านั้น ก็ใช้ PHP เวอร์ชัน 5.2.x ได้ทั้งหมด รายละเอียดหลักๆ ดูได้ใน Requirements และ FAQ

อย่างไรก็ตาม ตัว Reader/Writer สำหรับ Excel5 จะมีปัญหากับฟอนต์ภาษาไทยเล็กน้อย ในกรณีของผมคือฟอนต์ EucrosiaUPC แต่คิดว่ากับ Angsana หรือ Cordia ก็น่าจะเจอปัญหาเดียวกัน สำหรับวิธีแก้ไขก็ดูจากไฟล์ patch ในลิงก์ครับ

สำหรับวิธีใช้คงไม่ต้องแนะนำ เพราะ Documentation ที่อยู่ในหน้าดาวน์โหลดเขียนไว้อย่างละเอียด มีตัวอย่างเพียบ และการ support จากผู้พัฒนาก็จัดอยู่ในขั้นดีมากสำหรับโปรเจกต์โอเพ่นซอร์สแบบนี้ (เห็นพี่แกเข้ามาตอบเกือบทุกวัน)

7 comments

Trainee.'s picture
Trainee. (visitor) says:

สวัสดีค่ะ ตอนนี้กำลังออกรายงานโดยใช้ PHPExcel แต่เจอปัญหาภาษาไทย ตอนทดลองทำกับ window เเต่พอจะใช้งานจริง ซึ่ง Hosting เป็น Linux กลับมีปัญหา ไม่ทราบว่าคุณ Suksit พอจะเเนะนำวิธีแก้ไขได้รึเปล่าคะ

ลองใช้ iconv() เเล้วก็ยังแก้ไม่ได้ ส่วน patch ที่คุณได้เเนะนำไว้ ไม่ทราบว่ามันใช้ยังไงคะ รบกวนคุณ Suksit ตอบด้วยนะคะ

kong's picture
kong says:

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

Index: PHPExcel/Shared/Font.php
===================================================================
--- PHPExcel/Shared/Font.php    (revision 1181)
+++ PHPExcel/Shared/Font.php    (working copy)
@@ -549,6 +549,7 @@
    {
        switch ($name) {
            // Add more cases. Check FONT records in real Excel files.
+           case 'EucrosiaUPC':     return self::CHARSET_ANSI_THAI;
            case 'Wingdings':       return self::CHARSET_SYMBOL;
            case 'Wingdings 2':     return self::CHARSET_SYMBOL;
            case 'Wingdings 3':     return self::CHARSET_SYMBOL;

จะเห็นว่ามันมีรายการฟอนต์อยู่ไม่กี่ตัว ถ้าฟอนต์ที่เราใช้ไม่มีอยู่ในลิสต์นี้ และเป็นภาษาไทย อาจจะทำให้อ่านไม่ออก วิธีการแก้ไขด้วยตนเองคือเปิดไฟล์ PHPExcel/Shared/Font.php แล้วไปที่ประมาณบรรทัดที่ 549 แล้วเพิ่มข้อมูลในส่วน case เข้าไปอีกบรรทัดนึง ให้เป็นชื่อฟอนต์ของเรา เช่น

       switch ($name) {
            // Add more cases. Check FONT records in real Excel files.
            case 'AngsanaUPC':       return self::CHARSET_ANSI_THAI;
            case 'EucrosiaUPC':      return self::CHARSET_ANSI_THAI;
            case 'Wingdings':        return self::CHARSET_SYMBOL;
            case 'Wingdings 2':      return self::CHARSET_SYMBOL;
            case 'Wingdings 3':      return self::CHARSET_SYMBOL;

ประมาณนี้ครับ แต่ถ้าไม่ใช่เคสเดียวกันคงต้องติดต่อสอบถามทางผู้พัฒนาต่อไปครับ

Trainee.'s picture
Trainee. (visitor) says:

ลองทำตามดูแล้ว ก็ยังแก้ไม่ได้ค่ะ แต่ยังไงก็ต้องขอบคุณ คุณ Suksit มากๆนะคะ

คาดว่าปัญหาอยู่ที่การ encoding ซึ่งได้อ่าน Document ของ PHPExcel เค้าบอกว่า เราจำเป็นต้องทำให้มันเป็น utf-8 โดยใช้ iconv() แต่ลองแล้วก็ยังแก้ไม่ได้เลย

Panda's picture
Panda (visitor) says:

ใช้ตัว iconv('TIS-620', 'UTF-8', 'สวัสดี'); แปลงเป็น UTF-8 แล้วอ่านภาษาไทยได้เลยค่ะ ^ ^ ขอบคุณค่า

emozerorise's picture
emozerorise (visitor) says:

ช่วยสอนวิธีการนำ excel เข้า database หน่อยครับ

kong's picture
kong says:

ปกติจะใช้วิธีเซฟเป็น text ไฟล์แบบ Comma-separated value(.csv) ก่อนครับ แล้วค่อยอ่านข้อมูลจากฟิลด์ที่ต้องการ เพื่อ import เข้าฐานข้อมูล

Anonymous's picture
Anonymous (visitor) says:

ทำไม ผม ลอง อัพ ขึ้น โฮส ที่เป็น linux cent os เเล้ว มันไม่ขึ้นอะไร เลยน่ะครับ ตัวอย่าง http://61.90.204.68/v1.7.6/Tests/01simple.php

Post new comment

The content of this field is kept private and will not be shown publicly. If you have a Gravatar account associated with the e-mail address you provide, it will be used to display your avatar.