การแทรกรูปใน Excel ไฟล์ ด้วย PhpSpreadsheet เบื้องต้น ตอนที่ 8

เขียนเมื่อ 5 ปีก่อน โดย Ninenik Narkdee
phpspreadsheet แทรกรูปใน excel

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ phpspreadsheet แทรกรูปใน excel

ดูแล้ว 5,598 ครั้ง


เนื้อหาตอนต่อไปนี้ เรามาดูเกี่ยวกับการแทรกรูปภาพ
ในไฟล์ Excel ตัวอย่างการใช้งาน ก็เช่น เราต้องการแทรกรูปภาพ
ประกอบไปในข้อมูล หรือการแทรกรูปตราประทับ อย่าง สำเนาถูกต้อง
จ่ายแล้ว หรือ ต้นฉบับ ลงไปในเอกสารใบกำกับภาษี เหล่านี้เป็นต้น
 

    การแทรกรูปใน Excel

    รูปภาพหนึ่งๆ ที่ใช้ร่วมกับ excel จะมองเป็นเหมือน object แยกที่เราจะทำการเพิ่มเข้าไปในแผ่นงานหรือ worksheet ดังนั้น
เราจำเป็นต้องทำการสร้าง object ขึ้นมาด้วยคำสั่ง \PhpOffice\PhpSpreadsheet\Worksheet\Drawing ให้กับทุกๆ รูปที่จะใช้งาน
เสมอ จากนั้นเราก็กำหนดรูปแบบของรูปต่างๆ เช่น ความกว้าง ความสูง และลักษณะอื่นๆ ของรูปให้เรียบร้อย เสร็จแล้วจึงนำไปใช้
งานในแผ่นงาน
    เราจะทดสอบเพิ่มรูป สองรูปเข้าไปในแผ่นงาน รูปแรกเป็นรูปคำว่า "ต้นฉบับ" พื้นหลังสีขาว และรูปที่สองเป็นรูปคำว่าง "สำเนาถูกต้อง" 
พื้นหลังโปร่งใส   โดยรูปทั้งสองอยู่ในโฟลเดอร์ images มีขนาดเริ่มต้นเท่ากันที่ 245x90 px 
// กำหนดรูปแบบรูปแรก
$drawingPic1 = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawingPic1->setName('Original');
//$drawingPic1->setDescription('Original');
$drawingPic1->setPath('./images/original.png');
$drawingPic1->setHeight(90); // หน่วย px

// แทรกรูปที่แรก เข้าไปในแผ่นงาน
$drawingPic1->setWorksheet($sheet);

// กำหนดรูปแบบรูปที่สอง
$drawingPic2 = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawingPic2->setName('Copy');
//$drawingPic2->setDescription('Copy');
$drawingPic2->setPath('./images/copy_transparency.png');
$drawingPic2->setHeight(90); // หน่วย px

// แทรกรูปที่สอง เข้าไปในแผ่นงาน
$drawingPic2->setWorksheet($sheet);
    ผลลัพธ์ที่ได้
 

 
 
    จะเห็นโค้ดข้างต้น เราแค่ต้องการทดสอบเพิ่มรูปเข้าไปในแผ่นงาน ซึ่งตำแหน่งเริ่มต้นของรูปที่ถูกแทรกเข้าไปในแผ่นงานคือ
มุมบนซ้าย   และเนื่องจากรูปทั้งสองรูปแรกเป็นรูปที่มีพื้นหลังสีขาว รูปที่สองเป็นรูปพื้นหลังโปร่งใส จึงทำให้เห็นรูปทั้งสองซ้อนทับกัน
    ขนาดของรูปจะปรับตามสัดส่วนจากขนาดเดิม เช่น เรากำหนดความสูงด้วย setHeight() ในหน่วย px ความกว้างก็จะปรับไปตามสัดส่วน
เดิม แต่ในข้างต้นเรากำหนดความสูงเท่ากับความสูงรูปต้นฉบับ จึงไม่มีผลใดๆ เราสามารถจัดการกับรูปภาพด้วยคำส่ังต่างๆ ได้เช่น
กำหนดการหมุน กำหนดการใส่เงา การใช้เฉพาะบางส่วนของรูป รวมถึงการระบุพิกัดเริ่มต้นที่จะนำรูปไปแสดง สามารถดูคำสั่งเพิ่มเติม
    เราลองปรับโค้ดจากด้านบน ให้ทั้งสองรูปแสดงที่ตำแหน่งเริ่มต้นไม่ใช่มุมบนซ้ายของแผ่นงาน รวมถึงลองกำหนดให้หมุนรูปเล็กน้อย
จะได้เป็นดังนี้
// กำหนดรูปแบบรูปแรก
$drawingPic1 = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawingPic1->setName('Original');
//$drawingPic1->setDescription('Original');
$drawingPic1->setPath('./images/original.png');
// $drawingPic1->setHeight(90);
$drawingPic1->setCoordinates('A25');
// $drawingPic1->setRotation(15);

// แทรกรูปที่แรก เข้าไปในแผ่นงาน
$drawingPic1->setWorksheet($sheet);

// กำหนดรูปแบบรูปที่สอง
$drawingPic2 = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawingPic2->setName('Copy');
//$drawingPic2->setDescription('Copy');
$drawingPic2->setPath('./images/copy_transparency.png');
// $drawingPic2->setHeight(90);
$drawingPic2->setCoordinates('C26');
$drawingPic2->setRotation(-15); // เครื่องหมาย - นำหน้าคือหมุุนทวนเข็มนาฬิกา 15 องศา
// $drawingPic2->getShadow()->setVisible(true); // กรณีต้องการแสดงเงา
// $drawingPic2->getShadow()->setDirection(45); // กรณีกำหนดทิศทางขางเงา องศา

// แทรกรูปที่สอง เข้าไปในแผ่นงาน
$drawingPic2->setWorksheet($sheet);
    จะได้ผลลัพธ์ดังนี้
 
 
 
    กรณีเราต้องการแสดงรูปใดๆ ซ้ำในทุกๆ หน้า ยกตัวอย่างเช่น ต้องการแสดงรูปตราประทับคำว่า "สำเนาถูกต้อง" ในทุกๆ หน้าตำแหน่ง
เดียวกันในทุกๆ หน้า สามารถปรับได้ดังนี้
$rowPerPage = 28; // จำนวนแถวที่จะแสดงในแต่ละหน้า
$totalFullRow = ceil($totalRow/$rowPerPage)*$rowPerPage; // หาแถวสุดท้ายแบบเต็มพื้นที่
$startRow = 26; // จำนวนแถวของหัวเรื่อง
// วนลูปเพิ่มรูปตราประทับ
for($StampRow=$startRow; $StampRow<=$totalFullRow; $StampRow+=$rowPerPage){
    // กำหนดรูปแบบรูปที่สอง
    $drawingStamp = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
    $drawingStamp->setPath('./images/copy_transparency.png');
    $drawingStamp->setCoordinates('C'.$StampRow); // ตำแหน่งรูปแต่ละหน้า
    $drawingStamp->setRotation(-15); // เครื่องหมาย - นำหน้าคือหมุุนทวนเข็มนาฬิกา 15 องศา
    
    // แทรกรูปที่สอง เข้าไปในแผ่นงาน
    $drawingStamp->setWorksheet($sheet); 
}
    ผลลัพธ์หน้าตัวอย่างก่อนพิมพ์
 
 
 

    การแทรกรูปใน Excel โดยใช้ MemoryDrawing

    นอกจากเราจะสามารถแทรกรูปจากไฟล์รูปภาพที่ต้องการแล้ว เรายังสามารถที่ทำการสร้างรูปภาพโดยใช้ GD ฟังก์ชั่นใน PHP  ซึ่งเป็น
ลักษณะของการบันทึกรูปไว้ใน memory ชั่วคราว แล้วนำมาใช้งาน โดยไม่ต้องบันทึกเป็นไฟล์รูปภาพเก็บไว้
    ในที่นี้เราจะจำลองการสร้างข้อความรูปคำว่า "สำเนาถูกต้อง" และใช้ fonts พิเศษ THSarabun.ttf ที่เราเก็บไว้ในโฟลเดอร์ fonts
เราจะไม่ระบุพิกัดของรูปที่ได้ โดยจะแสดงที่ตำแหน่ง A1 เพื่อให้เห็นผลลัพธ์เท่านั้น สามารถนำไปปรับใช้เพิ่มเติมได้
// ฟังก์ชั่นตรวจสอบ server ว่าเป้น Windeows หรือไม่ ถ้าเป็น ให้ใช้ backslash แทน
function platformSlashes($path) {
    if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
        $path = str_replace('/', '\\', $path);
    }
    return $path;
}
// กำหนดไฟล์ fonts ที่จะใช้งาน ในที่นี้ใช้ไฟล์ THSarabun.trf ในโฟลเดอร์ fonts
$fontPath = platformSlashes(realpath('.'));
$font = $fontPath.'/fonts/THSarabun.ttf';

// กำหนดข้อความที่จะสร้าง
$string = 'สำเนาถูกต้อง';
$font_size = 37.5; // ขนาดตัวอักษรในหน่วย point
$padding = 20; // กำหนด padding หน่วย pixels

// หาพิกัดตำแหน่งแต่ละมุมของข้อความในกรณีเป็นสร้างเป็นรูป คล้ายหาพื้นที่จริงของข้อความ
$type_space = imagettfbbox($font_size, 0, $font, $string);

// นำพิกัดมาคำนวณหาความกว้าง และความูงของข้อความที่จะสร้าง โดยเพิ่ม padding เข้าไปด้วย
$image_width = abs($type_space[4] - $type_space[0]) + ($padding*2);
$image_height = abs($type_space[5] - $type_space[1]) + ($padding*2);

//  สร้างรูปโดยใช้ GD ฟังก์ชั่น เก็บไว้ในหน่วนความจำ ใช้ควมกว้าง ความสูงจากที่คำนวณได้มาใช้งาน
$gdImage = @imagecreatetruecolor($image_width, $image_height) or die('Cannot Initialize new GD image stream');

// กรณีเราต้องการกำหนดให้พื้นหลังโปร่งใส
imagealphablending($gdImage , false);
imagesavealpha($gdImage , true);

// กำหนดค่าความโปร่งใส 127 คือโปร่งใส 100% กำหนดสีข้อความ กำหนดสีพื้นหลัง กรณีไม่ได้เป็นโปร่งใส
// รูปแบบค่าสีที่กำหนด จะเป็น RGB แต่ละค่าจะมีตั้งแต่ 0 - 255 
$transparent = imagecolorallocatealpha($gdImage , 255, 255, 255, 127);
$text_color = imagecolorallocate($gdImage, 255, 0, 0);
$bg_color = imagecolorallocate($gdImage, 255, 255, 255);

// เติมสีพื้นหลังเข้าไปในรูปที่เราสร้าง ในที่นี้เราใช้พื้นหลังโปร่งใส
imagefill($gdImage, 0, 0, $transparent);

// คำนวณตำแหน่งเพื่อที่จะจัดให้ข้อความอยู่ตรงกลางทั้งแนวตั้งและแนวนอน 
$x = $padding; // พิกัดเริ่มต้นในแนวนอน ให้เท่ากับ padding
$y = $image_height - ($padding*2); // พิกัดเริ่มต้นในแนวตั้ง

// ใส่ข้อความลงในรูป
imagettftext($gdImage, $font_size, 0, $x, $y, $text_color, $font, $string);


// กำหนดรูปแบบรูปที่ได้จาก memory สำหรับใช้งานในแผ่นงาน
$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing();
// $drawing->setName('In-Memory image 1');
// $drawing->setDescription('In-Memory image 1');
// $drawing->setHeight(36);
$drawing->setCoordinates('A1');
$drawing->setImageResource($gdImage); // ใช้รูปที่สร้างด้วย GD ฟังก์ชั่น
$drawing->setRenderingFunction(
    \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::RENDERING_PNG
);
$drawing->setMimeType(
    \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_PNG
);

// แทรกรูปไปในแผ่นงาน
$drawing->setWorksheet($sheet);

// สำหรับ MimeType และ Rendering สามารถใช้ค่าคงที่เหล่านี้ได้ตามต้องการ
// PROPERTY_TYPE_BOOLEAN
// PROPERTY_TYPE_INTEGER
// PROPERTY_TYPE_FLOAT
// PROPERTY_TYPE_DATE
// PROPERTY_TYPE_STRING
// PROPERTY_TYPE_UNKNOWN
    ผลลัพธ์ที่ได้
 

 
 
    หวังว่าจะเป็นแนวทางในการนำไปประยุกต์ใช้งานเพิ่มเติมต่อไป  เนื้อหาตอนหน้าจะเป็นอะไร รอติดตาม


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









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









URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ