ต่อจากตอนที่แล้ว เกี่ยวกับการจัดการรูปแบบการแสดงของพิกัด 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 โดยใส่รหัสผ่านตามที่กำหนดให้ถูกต้อง จึงจะสามารถแก้ไขข้อมูลได้
เนือหาเกี่ยวกับการจัดรูปแบบการแสดงข้อมูลยังมีเพิ่มเติม รอติดตามในตอนหน้า