ต่อจากตอนที่แล้ว เกี่ยวกับการจัดการรูปแบบการแสดงของพิกัด cell
ทบทวนตอนที่แล้วได้ที่บทความ http://niik.in/931
การกำหนด Style ให้กับพิกัด Cell
เราเคยได้จัดรูปแบบหรือ style ให้กับพิกัด cell มาบ้างแล้วในตอนที่ผ่านมา เกี่ยวกับการจัดรูปแบบข้อมูลตัวเลข หรือที่เรียกว่า
numberFormat ทบทวนได้ที่บทความ http://niik.in/930 ในหัวข้อนี้ เราจะมาดูต่อเพิ่มเติม
ในการกำหนดให้กับพิกัด cell เราจะทำการอ้างอิงตำแหน่งที่จะใช้งานด้วยฟังก์ชั่น getStyle() โดยสามารถกำหนดพิกัด เช่น
A1 หรือกำหนดเป็นช่วงของพิกัดไม่ว่าจะเป็นแนวตั้งหรือแนวนอน เช่น A1:C1 หรือ A1:A5 เป็น แนวทางก็จะเป็นดังนี้
1 2 3 | $sheet ->getStyle( 'A1' ) // อ้างอิงพิกัด cell $sheet ->getStyle( 'A1:C1' ) // อ้างอิงพิกัด cell เป็นช่วงในแนวนอน $sheet ->getStyle( 'A1:A5' ) // อ้างอิงพิกัด cell เป็นช่วงในแนวตั้ง |
ต่อไปก็ตามด้วยฟังก์ชั่นเรียกใช้ style ที่เราต้องการใช้งาน ซึ่งประกอบไปด้วย 6 รูปแบบ ดังนี้
- การจัดการเติมสี/เพิ่มสี (fill) ใช้คำสั่ง getFill() หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น fill
- การจัดการตัวอักษร (font) ใช้คำสั่ง getFont() หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น font
- การจัดการเส้นขอบ ใช้คำสั่ง getBorders() หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น borders
- การจัดตำแหน่ง ใช้คำสั่ง getAlignment() หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น alignment
- การจัดการรูปแบบตัวเลข ใช้คำสั่ง getNumberFormat() หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น numberFormat
- การจัดการการป้องกัน cell ใช้คำสั่ง getProtection() หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น protection
เรามาดูตัวอย่างการใช้งานในแต่ละส่วนอย่างง่าย (ไม่รวมส่วนของการจัดการรูปแบบตัวเลข)
การจัดการเติมสี/เพิ่มสี (fill)
หลักๆ ก็จะเป้นการเติมสีพื้นหลัง และรูปแบบของการเติมสี เช่น ไล่เฉด หรือใส่เป็นสีพื้น กรณีใส่เป็นสีพื้นก็จะกำหนดค่าสีแค่ค่าเดียว
แต่ถ้าต้องการไล่เฉดสี ก็อาจจะต้องกำหนดสองสี เพิ่มเข้าไป
1 2 3 4 5 6 | // ใส่สีพื้นหลัง ดูการกำหนด filetype เพิ่มเติมได้ที่ $sheet ->getStyle( 'A1:C1' )->getFill() ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID); $sheet ->getStyle( 'A1:C1' )->getFill() ->getStartColor()->setRGB( 'FFB27D' ); |
หรือ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // ใส่สีพื้นแบบไล่สึ ต้องกำหนดการใช้งานสีสองค่า $sheet ->getStyle( 'A1:C1' )->getFill() ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_GRADIENT_PATH); $sheet ->getStyle( 'A1:C1' )->getFill() ->getStartColor()->setRGB( 'FFB27D' ); $sheet ->getStyle( 'A1:C1' )->getFill() ->getEndColor()->setRGB( 'FFCCA9' ); // ตัวแปรค่าคงที่ของ Fill เพิ่มเติม ที่สามารถใช้งานได้ // FILL_NONE | FILL_SOLID | FILL_GRADIENT_LINEAR // FILL_GRADIENT_PATH | FILL_PATTERN_DARKDOWN // FILL_PATTERN_DARKGRAY | FILL_PATTERN_DARKGRID // FILL_PATTERN_DARKHORIZONTAL | FILL_PATTERN_DARKTRELLIS // FILL_PATTERN_DARKUP | FILL_PATTERN_DARKVERTICAL // FILL_PATTERN_GRAY0625 | FILL_PATTERN_GRAY125 // FILL_PATTERN_LIGHTDOWN | FILL_PATTERN_LIGHTGRAY // FILL_PATTERN_LIGHTGRID | FILL_PATTERN_LIGHTHORIZONTAL // FILL_PATTERN_LIGHTTRELLIS | FILL_PATTERN_LIGHTUP // FILL_PATTERN_LIGHTVERTICAL | FILL_PATTERN_MEDIUMGRAY |
ผลลัพธ์ที่ได้ กรณีไล่เฉดสีสองสี

จากการทดลองใช้งาน การกำหนดสีพื้นหลังหรือการเติมสี จะมีการจัดการอยู่ได้กันประมาณ 4 คำสั่ง คือ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // กำหนดรูปแบบสีพื้นหลังด้วย ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_GRADIENT_PATH); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น fillType // กำหนดสีที่ 1 ด้วย ->getStartColor()->setRGB( 'FFB27D' ) // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น startColor // กำหนดสีที่ 2 ด้วย (*กรณีใช้สีเดียวให้กำหนดค่าให้เท่ากับ getStartColor()) ->getEndColor()->setRGB( 'FFCCA9' ); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น endColor // ใช้กรณีกำหนดทิศทาง การไล่เฉดสี เป็นองศา ใช้ร่วมกับ FILL_GRADIENT_LINEAR ->setRotation(90) // ไล่เฉดบนลงล่าง // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น rotation |
การจัดการตัวอักษร (font)
เป็นลักษณะของการจัดการข้อความหรือข้อมูลในพิกัด cell เช่น ชื่อ font ที่จะใช้ การกำหนด style อย่างตัวหนา ตัวเอียง ตัวอักษรตัวยก
หรือตัวอักษรตัวห้อย การกำหนดขนาดตัวอักษร การกำหนดสีตัวอักษร การใส่เส้นใต้ การใส่เส้นทับหรือเส้นขีดฆ่า เป็นต้น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | // กำหนด font ที่จะใช้งาน $sheet ->getStyle( 'B2' )->getFont()->setName( 'Arial' ); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น name // กำหนดเป็นตัวหนา $sheet ->getStyle( 'B3' )->getFont()->setBold(true); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น bold // กำหนดเป็นตัวเอียง $sheet ->getStyle( 'B4' )->getFont()->setItalic(true); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น italic // กำหนดให้มีขีดเส้นใต้ $sheet ->getStyle( 'B5' )->getFont()->setUnderline(true); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น underline // กำหนดให้มีเส้นขีดทับหรือขีดฆ่า $sheet ->getStyle( 'B6' )->getFont()->setStrikethrough(true); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น strikethrough // กำหนดสีตัวอักษร $sheet ->getStyle( 'B7' )->getFont()->getColor()->setRGB( 'ED1C24' ); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น color // กำหนดขนาดตัวอักษร $sheet ->getStyle( 'B8' )->getFont()->setSize(12); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น size // กำหนดเป็นตัวอักษรตัวยก $sheet ->getStyle( 'B9' )->getFont()->setSuperscript(true); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น superscript // กำหนดเป็นตัวอักษรตัวห้อย $sheet ->getStyle( 'B10' )->getFont()->setSubscript(true); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น subscript // ตัวแปรค่าคงที่ของ font เพิ่มเติม ที่สามารถใช้งานได้ ในกรณีกำหนด underline เป็นข้อความ // ตัวอย่างเช่น // $sheet->getStyle('B5') // ->getFont()->setUnderline(\PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_SINGLE); // UNDERLINE_NONE | UNDERLINE_DOUBLE // UNDERLINE_DOUBLEACCOUNTING | UNDERLINE_SINGLE // UNDERLINE_SINGLEACCOUNTING |
ผลลัพธ์ข้อมูลที่พิกัด B2:B10

การจัดการเส้นขอบ
สำหรับการกำหนดเส้นขอบของพิกัด cell น้้นสามารถกำหนดรูปแบบได้หลากหลาย ไม่ว่าจะกำหนดแยกแต่ละด้านของขอบ
หรือกำหนดเฉพาะเส้นขอบภายใน การกำหนดเฉพาะเส้นขอบด้านนอกให้กับกลุ่มของพิกัด ceel การกำหนดเส้นขอบในแนวทแยง
การกำหนดส้นขอบเฉพาะในแนวตั้ง หรือเฉพาะในแนวนอน เป็นต้น
ดูตัวอย่างเส้นขอบที่กำหนดในพิกัด cell รูปแบบต่างๆ ด้านล่าง

การกำหนดเส้นขอบรูปแบบต่างๆ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | // กำหนดเส้นขอบด้านซ้าย $sheet ->getStyle( 'B2' ) ->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น left // กำหนดเส้นขอบด้านขวา $sheet ->getStyle( 'B3' ) ->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น right // กำหนดเส้นขอบด้านบน $sheet ->getStyle( 'B4' ) ->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น top // กำหนดเส้นขอบด้านล่าง $sheet ->getStyle( 'B5' ) ->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น bottom // กำหนดเส้นขอบแนวตั้งด้านใน สำหรับช่วงของพิกัด ตั้งแต่สองคอลัมน์ขึ้นไป $sheet ->getStyle( 'A7:C7' ) ->getBorders()->getVertical()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น vertical // กำหนดเส้นขอบแนวนอนด้านใน สำหรับช่วงของพิกัด ตั้งแต่สองแถวขึ้นไป $sheet ->getStyle( 'A8:C9' ) ->getBorders()->getHorizontal()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น horizontal // กำหนดเส้นขอบด้านนอก สำหรับช่วงของพิกัด หรือเส้นขอบของพิกัด cell ใดๆ $sheet ->getStyle( 'E2:G3' ) ->getBorders()->getOutline()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น outline // กำหนดเส้นขอบทั้งหมดทุกด้านในพิกัดหรือในช่วงพิกัด cell ที่ต้องการ $sheet ->getStyle( 'E5:G7' ) ->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น allBorders // กำหนดเส้นขอบเฉพาะด้านใน ไม่รวมขอบด้านนอก $sheet ->getStyle( 'E9:G11' ) ->getBorders()->getInside()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น inside // กำหนดเส้นขอบแนวทแยงมุม รูปแบบต่าง $sheet ->getStyle( 'I2:K3' ) ->getBorders()->setDiagonalDirection(\PhpOffice\PhpSpreadsheet\Style\Borders::DIAGONAL_DOWN); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น diagonalDirection $sheet ->getStyle( 'I2:K3' ) ->getBorders()->getDiagonal()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น diagonal $sheet ->getStyle( 'I5:K6' ) ->getBorders()->setDiagonalDirection(\PhpOffice\PhpSpreadsheet\Style\Borders::DIAGONAL_UP); $sheet ->getStyle( 'I5:K6' ) ->getBorders()->getDiagonal()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); $sheet ->getStyle( 'I8:K9' ) ->getBorders()->setDiagonalDirection(\PhpOffice\PhpSpreadsheet\Style\Borders::DIAGONAL_BOTH); $sheet ->getStyle( 'I8:K9' ) ->getBorders()->getDiagonal()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // ตัวแปรค่าคงที่ของ Border เพิ่มเติม ที่สามารถใช้งานได้ // BORDER_NONE | BORDER_DASHDOT | BORDER_DASHDOTDOT | BORDER_DASHED // BORDER_DOTTED | BORDER_DOUBLE | BORDER_HAIR | BORDER_MEDIUM // BORDER_MEDIUMDASHDOT | BORDER_MEDIUMDASHDOTDOT // BORDER_MEDIUMDASHED | BORDER_SLANTDASHDOT // BORDER_THICK | BORDER_THIN // ตัวแปรค่าคงที่ของ Borders เส้นทแยง เพิ่มเติม ที่สามารถใช้งานได้ // DIAGONAL_NONE | DIAGONAL_UP // DIAGONAL_DOWN | DIAGONAL_BOTH |
ผลลัพธ์ที่ได้

การจัดตำแหน่งข้อมูมลในพิกัด cell
การจัดตำแหน่งข้อมูลเช่น การแสดงข้อมูลชิดซ้าย ตรงกลาง หรือชิดขวาในพิกัด cell กรณีเป็นการแสดงในแนวนอน หรือการแสดง
ข้อมูลชิดขอบบน ตรงกลาง หรือชิดขอบล่าง ในพิกัด cell กรณีเป็นแสดงในแนวตั้ง นอกจากนั้นก็ยังมี การกำหนดการหมุนของข้อความ
หรือข้อมูลในพิกัด cell อย่างเช่น แแสดงในมุม 45 องศาในพิกัด cell และก็มีการกำหนดให้ข้อความตัดคำอัตโนมัติเพื่อให้ข้อความอยู่
ในพื้นที่ตามขนาดความกว้างของ cell โดยจะขึ้นบรรทัดใหม่สำหรับข้อความที่มีช่องว่าง ดูตัวอย่างเพิ่มติมด้านล่าง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | // จำลองกำหนดความกว้างของคอลัมน์ C $sheet ->getColumnDimension( 'C' )->setWidth(11.42578125); // ประมาณ 80 px // การจัดข้อความชิดขวาในแนวนอน $sheet ->getStyle( 'C2' ) ->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น horizontal // จำลองเพิ่มความสูงของแถว เพือให้เห็นผลลัพธ์การจัดเรียงในแนวตั้ง $sheet ->getRowDimension( '3' )->setRowHeight(37.50000937500234); // ประมาณ 50 px // การจัดข้อความให้ชิดขอบด้านบนในแนวตั้ง $sheet ->getStyle( 'C3' ) ->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น vertical // การหมุนข้อความ $sheet ->getStyle( 'C4' )->getAlignment()->setTextRotation(45); // แสดงข้อความหมุนไปที่ 45 องศา // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น textRotation // การตัดคำที่มีช่องว่าง โดยขึ้นบรรทัดใหม่ $sheet ->getStyle( 'C5' )->getAlignment()->setWrapText(true); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น wrapText // บีบขนาดข้อความให้แสดงทั้งหมดให้อยู่ในเฉพาะความกว้างของพิกัด cell นั้น $sheet ->getStyle( 'C6' )->getAlignment()->setShrinkToFit(true); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น shrinkToFit // การกำหนดการเยื้องจากด้านหน้าของข้อความใน cell $sheet ->getStyle( 'C7' )->getAlignment()->setIndent(3); // หน่วย char unit // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น indent // ตัวแปรค่าคงที่ของ Alignment เพิ่มเติม ที่สามารถใช้งานได้ // HORIZONTAL_GENERAL | HORIZONTAL_LEFT | HORIZONTAL_RIGHT | HORIZONTAL_CENTER // HORIZONTAL_CENTER_CONTINUOUS | HORIZONTAL_JUSTIFY | HORIZONTAL_FILL // HORIZONTAL_DISTRIBUTED // VERTICAL_BOTTOM | VERTICAL_TOP | VERTICAL_CENTER | VERTICAL_JUSTIFY // VERTICAL_DISTRIBUTED | READORDER_CONTEXT | READORDER_LTR | READORDER_RTL |
ผลลัพธ์ที่ได้

การจัดการการป้องกัน cell
การป้องกันในระดับพิกัด cell จะจัดการในสองเรื่องคือ การล็อคพิกัด cell นั้นๆ ซึ่งค่าเริ่มต้นแล้วพิกัด cell จะถูกกำหนดให้ล็อคไม่ให้แก้ไข
อยู่แล้ว ส่วนอีกค่าคือการซ่อนสูตรที่กำหนดในพิกัด cell นั้นๆ ค่าเริ่มต้นจะไม่ถูกซ่อน อย่างไรก็ตามทั้งสองค่านี้จะไม่มีผลหากเราไม่ได้กำหนด
การป้องกันให้กับ worksheet หรือแผ่นงานนั้นก่อน
ดังนั้น เราสามารถป้องกันพิกัด cell ได้ดังตัวอย่างต่อไปนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // กำหนดการป้องกันให้กับแผ่นงานหรือ worksheet $sheet ->getProtection()->setPassword( '111111' ); $sheet ->getProtection()->setSheet(true); $sheet ->getProtection()->setSort(true); $sheet ->getProtection()->setInsertRows(true); $sheet ->getProtection()->setFormatCells(true); // จำลองการใช้สูตรสำหรับพิกัด D2 $sheet ->getCell( 'D2' )->setValue( '=C2' ); // กำหนดการป้องกันการเปลี่ยนข้อมูลในพิกัด cell ปกติค่าเริ่มต้นจะเป็นล็อคอยู่แล้ว ไม่กำหนดก็ได้ $sheet ->getStyle( 'D2' ) ->getProtection()->setLocked(\PhpOffice\PhpSpreadsheet\Style\Protection::PROTECTION_PROTECTED); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น locked // กำหนดการป้องกันการซ่อนหรือไม่แสดงสูตรที่ใช้งาน $sheet ->getStyle( 'D2' ) ->getProtection()->setHidden(\PhpOffice\PhpSpreadsheet\Style\Protection::PROTECTION_PROTECTED); // หรือหากกำหนดเป็น array ก็ให้ใช้ key เป็น hidden // ตัวแปรค่าคงที่ของ protection ที่สามารถใช้งานได้ // PROTECTION_INHERIT | PROTECTION_PROTECTED | PROTECTION_UNPROTECTED |
ผลลัพธ์ที่ได้

จะเห็นว่า เมื่อเราพยายามจะแก้ไข ข้อมูล ก็จะขึ้นแจ้งเตือน เนื่องจากว่าพิกัด cell ถูกป้องกันไว้แล้ว และถ้าเรากดไปพิกัด D2 ก็จะไม่แสดง
สูตรที่ถูกใช้งานอยู่ เราสามารถแก้ไขข้อมูลได้ เมื่อทำการ unprotect sheet โดยใส่รหัสผ่านตามที่กำหนดให้ถูกต้อง จึงจะสามารถแก้ไขข้อมูลได้
เนือหาเกี่ยวกับการจัดรูปแบบการแสดงข้อมูลยังมีเพิ่มเติม รอติดตามในตอนหน้า