ต่อจากตอนที่แล้ว เกี่ยวกับการจัดการรูปแบบการแสดงของพิกัด cell
ทบทวนตอนที่แล้วได้ที่บทความ http://niik.in/931
การกำหนด Style ให้กับพิกัด Cell
เราเคยได้จัดรูปแบบหรือ style ให้กับพิกัด cell มาบ้างแล้วในตอนที่ผ่านมา เกี่ยวกับการจัดรูปแบบข้อมูลตัวเลข หรือที่เรียกว่า
numberFormat ทบทวนได้ที่บทความ http://niik.in/930 ในหัวข้อนี้ เราจะมาดูต่อเพิ่มเติม
ในการกำหนดให้กับพิกัด cell เราจะทำการอ้างอิงตำแหน่งที่จะใช้งานด้วยฟังก์ชั่น getStyle() โดยสามารถกำหนดพิกัด เช่น
A1 หรือกำหนดเป็นช่วงของพิกัดไม่ว่าจะเป็นแนวตั้งหรือแนวนอน เช่น A1:C1 หรือ A1:A5 เป็น แนวทางก็จะเป็นดังนี้
$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)
หลักๆ ก็จะเป้นการเติมสีพื้นหลัง และรูปแบบของการเติมสี เช่น ไล่เฉด หรือใส่เป็นสีพื้น กรณีใส่เป็นสีพื้นก็จะกำหนดค่าสีแค่ค่าเดียว
แต่ถ้าต้องการไล่เฉดสี ก็อาจจะต้องกำหนดสองสี เพิ่มเข้าไป
// ใส่สีพื้นหลัง ดูการกำหนด filetype เพิ่มเติมได้ที่
// https://phpoffice.github.io/PhpSpreadsheet/master/PhpOffice/PhpSpreadsheet/Style/Fill.html
$sheet->getStyle('A1:C1')->getFill()
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID);
$sheet->getStyle('A1:C1')->getFill()
->getStartColor()->setRGB('FFB27D');
หรือ
// ใส่สีพื้นแบบไล่สึ ต้องกำหนดการใช้งานสีสองค่า
$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
// https://phpoffice.github.io/PhpSpreadsheet/master/PhpOffice/PhpSpreadsheet/Style/Fill.html
ผลลัพธ์ที่ได้ กรณีไล่เฉดสีสองสี

จากการทดลองใช้งาน การกำหนดสีพื้นหลังหรือการเติมสี จะมีการจัดการอยู่ได้กันประมาณ 4 คำสั่ง คือ
// กำหนดรูปแบบสีพื้นหลังด้วย
->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 อย่างตัวหนา ตัวเอียง ตัวอักษรตัวยก
หรือตัวอักษรตัวห้อย การกำหนดขนาดตัวอักษร การกำหนดสีตัวอักษร การใส่เส้นใต้ การใส่เส้นทับหรือเส้นขีดฆ่า เป็นต้น
// กำหนด 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
// https://phpoffice.github.io/PhpSpreadsheet/master/PhpOffice/PhpSpreadsheet/Style/Font.html
ผลลัพธ์ข้อมูลที่พิกัด B2:B10

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

การกำหนดเส้นขอบรูปแบบต่างๆ
// กำหนดเส้นขอบด้านซ้าย
$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
// https://phpoffice.github.io/PhpSpreadsheet/master/PhpOffice/PhpSpreadsheet/Style/Borders.html
// ตัวแปรค่าคงที่ของ Borders เส้นทแยง เพิ่มเติม ที่สามารถใช้งานได้
// DIAGONAL_NONE | DIAGONAL_UP
// DIAGONAL_DOWN | DIAGONAL_BOTH
// https://phpoffice.github.io/PhpSpreadsheet/master/PhpOffice/PhpSpreadsheet/Style/Borders.html
ผลลัพธ์ที่ได้

การจัดตำแหน่งข้อมูมลในพิกัด cell
การจัดตำแหน่งข้อมูลเช่น การแสดงข้อมูลชิดซ้าย ตรงกลาง หรือชิดขวาในพิกัด cell กรณีเป็นการแสดงในแนวนอน หรือการแสดง
ข้อมูลชิดขอบบน ตรงกลาง หรือชิดขอบล่าง ในพิกัด cell กรณีเป็นแสดงในแนวตั้ง นอกจากนั้นก็ยังมี การกำหนดการหมุนของข้อความ
หรือข้อมูลในพิกัด cell อย่างเช่น แแสดงในมุม 45 องศาในพิกัด cell และก็มีการกำหนดให้ข้อความตัดคำอัตโนมัติเพื่อให้ข้อความอยู่
ในพื้นที่ตามขนาดความกว้างของ cell โดยจะขึ้นบรรทัดใหม่สำหรับข้อความที่มีช่องว่าง ดูตัวอย่างเพิ่มติมด้านล่าง
// จำลองกำหนดความกว้างของคอลัมน์ 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
// https://phpoffice.github.io/PhpSpreadsheet/master/PhpOffice/PhpSpreadsheet/Style/Alignment.html
ผลลัพธ์ที่ได้

การจัดการการป้องกัน cell
การป้องกันในระดับพิกัด cell จะจัดการในสองเรื่องคือ การล็อคพิกัด cell นั้นๆ ซึ่งค่าเริ่มต้นแล้วพิกัด cell จะถูกกำหนดให้ล็อคไม่ให้แก้ไข
อยู่แล้ว ส่วนอีกค่าคือการซ่อนสูตรที่กำหนดในพิกัด cell นั้นๆ ค่าเริ่มต้นจะไม่ถูกซ่อน อย่างไรก็ตามทั้งสองค่านี้จะไม่มีผลหากเราไม่ได้กำหนด
การป้องกันให้กับ worksheet หรือแผ่นงานนั้นก่อน
ดังนั้น เราสามารถป้องกันพิกัด cell ได้ดังตัวอย่างต่อไปนี้
// กำหนดการป้องกันให้กับแผ่นงานหรือ 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
// https://phpoffice.github.io/PhpSpreadsheet/master/PhpOffice/PhpSpreadsheet/Style/Protection.html
ผลลัพธ์ที่ได้

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