กำหนด Style ให้กับพิกัด Cell ด้วย PhpSpreadsheet เบื้องต้น ตอนที่ 6

เขียนเมื่อ 5 ปีก่อน โดย Ninenik Narkdee
conditional break row phpspreadsheet

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

ดูแล้ว 9,114 ครั้ง


ต่อจากตอนที่แล้วเกียวกับการจัดรูปแบบการแสดงข้อมูลใน cell ทบทวนตอนที่แล้ว
ได้ที่บทความ  http://niik.in/932
     เราได้รู้จักแนวทางและวิธีการกำหนด style ให้กับพิกัด cell ไปพอสมควรแล้วในตอนที่ผ่านมา
แต่ก็ยังมีรูปแบบ และวิธีการใช้งานเพิ่มเติมที่เราจะพูดต่อดังต่อไปนี้
    

    การกำหนดรูปแบบ style ค่าเริ่มต้นไฟล์ Excel

    เราสามารถกำหนด style ค่าเริ่มต้น ให้กับเอกสารไฟล์ excel ยกตัวอย่างเช่น ขนาดตัวอักษร หรือชื่อฟอนท์ตัวอักษร
ที่ต้องการใช้งานในไฟล์ ecxel นั้นๆ หรือค่าอื่นๆใด ที่เราคิดว่า เป็นค่าเริ่มต้น ที่เราจะใช้งาน ก็สามารถกำหนดในส่วนนี้ได้
โดย ค่าที่กำหนดในส่วนนี้จะมีผลกับทุกพิกัด cell ในแผ่นงานหรือในเอกสารไฟล์ excel   อย่างไรก็ตามค่าเริ่มต้นนี้ เราสามารถ
ปรับค่าแยกเฉพาะพิกัดตามรูปแบบที่ต้องการได้
// การที่ font จะมีผลใน excel ก็ต่อเมื่อเราได้ติดตั้งชื่อ font นั้นๆ ไว้ที่เครื่องแล้วเท่านั้น
$spreadsheet->getDefaultStyle()->getFont()->setName('TH SarabunPSK');
$spreadsheet->getDefaultStyle()->getFont()->setSize(16);
    ยกตัวอย่างเอกสารราชการใช้ตัวอักษร TH SarabunPSK ขนาดเริ่มต้นที่ 16
 
   

 

 
 

    การกำหนด style ในรูปแบบ Array

    วิธีการกำหนด style ในกรณีมีข้อมูลจำนวนมากๆ วิธีที่ดีที่สุดและรวดเร็วคือการกำหนดช่วงของพิกัด cell ที่ต้องการจัดรูปแบบ 
แทนการกำหนดแต่ละพิกัดผ่านการทำงานโดยวนลูป กล่าวคือ เราควรใช้รูปแบบ
// จัดข้อมูลในชิดขวา
$sheet->getStyle('A1:A500')
->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT);
แทนรูปแบบ
// วนลูปจัดรูปแบบเป็นรายการๆ ไป
for($i=1; $i<=500; $i++){
    $sheet->getStyle('A'.$i)
    ->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT);
}
    วิธีแรกเป็นวิธีที่ทำงานเร็วและมีประสิทธิภาพมากกว่า วิธ๊ที่สอง การกำหนดเฉพาะรายการ จะใช้ในกรณีพิเศษ หรือกรณีข้อมูลไม่
มากเกินไป หรือกรณีที่เราต้องการจัดการเพิ่มเติม
 
     กลับมาที่ห้วข้อ เราจะจัดการ style ในรูปแบบ array แทนการกำหนดแต่ละค่า หรือก็คือเราจะกำหนดรูปแบบ style ต่างๆ ไว้ใน array และ
เรียกใช้งานครั้งเดียว วิธีนี้ทำให้การจัดรูปแบบทำได้ง่ายและสะดวกกว่าวิธีที่ผ่านๆ มา   เราจะประยุกต์กับชุดข้อมูลจังหวัด โดยจะจัดรูปแบบ
ข้อความ การจัดตำแหน่ง และการกำหนดเส้นขอบ ดังนี้
// กำหนดค่าเริ่มต้น รูปแบบ
$spreadsheet->getDefaultStyle()->getFont()->setName('TH SarabunPSK');
$spreadsheet->getDefaultStyle()->getFont()->setSize(16);

// กำหนดความกว้างของคอลัมน์
foreach(range('A','C') as $column) {
    if($column=='A'){
        $sheet->getColumnDimension($column)->setWidth(14.2822265625); // ประมาณ 100 px
    }else{
        $sheet->getColumnDimension($column)->setAutoSize(true);
    }
}

////////////////  ส่วนของการกำหนด style แบบ array
// หาแถวข้อมูลสุดท้าย ไม่รวมแถวหัวข้อ
$lastRow = $totalRow + 1;
$styleArray_header = [
    'font' => [ // จัดตัวอักษร
        'bold' => true, // กำหนดเป็นตัวหนา
    ],
    'alignment' => [  // จัดตำแหน่ง
        'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
    ],
    'borders' => [ // กำหนดเส้นขอบ
        'allBorders' => [ // กำหนดเส้นขอบทั้งหม
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
        ],
    ],
    'fill' => [ // กำหนดสีพื้นหลัง
        'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_GRADIENT_LINEAR, // รูปแบบพื้นหลัง
        'rotation' => 90, // กำหนดองศาทิศทางการไล่เฉด
        'startColor' => [ // สีที่ 1
            'argb' => 'FFA0A0A0',  // argb คือ Alpha rgb มี 8 ตัว หรือใช้เป็น rgb มี 6 ตัว 
        ],
        'endColor' => [ // สีที่ 2
            'argb' => 'FFFFFFFF',  // argb คือ Alpha rgb มี 8 ตัว หรือใช้เป็น rgb มี 6 ตัว FFFFFF
        ],
    ],
];
// จัดรูปแบบข้อมูลคัลมน์ ID
$styleArrayCol_A = [
    'alignment' => [ // จัดตำแหน่ง ข้อความแสดงตรงกลางในแนวนอน
        'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
    ],
];
// จัดรูปแบบข้อมูลชื่อจังหวัดไทย อังกฤษ
$styleArrayCol_BC = [
    'alignment' => [ // จัดตำแหน่ง
        'indent' => 2 // ให้ข้อความเยื้อง 2 char units
    ],   
];
// จัดรูปแบบส่วนของข้อมูล
$styleArray_Data = [
    'borders' => [ // กำหนดเส้นขอบ
        'vertical' => [ // เส้นขอบแนวตั้งด้านใน
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
        ],
        'outline' => [ // เส้นขอบด้านนอก
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
        ],
    ],
];
// นำ style ในรูปแบบ array  มาใช้งานในช่วงพิกัด cell ที่ต้องการ
$sheet->getStyle('A1:C1')->applyFromArray($styleArray_header);
$sheet->getStyle('A2:A'.$lastRow)->applyFromArray($styleArrayCol_A);
$sheet->getStyle('B2:C'.$lastRow)->applyFromArray($styleArrayCol_BC);
$sheet->getStyle('A2:C'.$lastRow)->applyFromArray($styleArray_Data);
    ผลลัพธ์ที่ได้
 

 
 
 
 
    การจัดการ style ในรูปแบบ array ทำให้เราสามารถจัดการได้ง่ายและสะดวกกว่ากรณีกำหนดค่าโดยตรงไปยังพิกัด cell ซึ่่งหากเรา
วางแผนรูปแบบการใช้งาน และจัดกลุ่มพิกัด ที่ต้องการได้อย่างเหมาะสม ก็ทำให้การนำไปใช้งานทำได้ง่ายขึ้น
    ค่า key ต่างๆ ที่กำหนดไปใน styleArray คือค่าที่ระบุไว้ในตัวอย่างบทความตอนที่ผ่านมา http://niik.in/932
    ผลลัพธ์ข้างต้น ตัดเฉพาะส่วนต้นของรายการ และส่วนท้ายของรายการ เพื่อให้เห็นผลลัพธ์ของการกำหนเส้นขอบ
 
 

    การกำหนด style จากเงื่อนไขที่ต้องการ

    เราสามารถจัดรูปแบบ style ตามเงื่อนไขของข้อมูลได้ โดยใช้งาน Conditional class   ยกตัวอย่างเช่น ให้แสดงข้อความหรือข้อมูล
เป็นตัวเลขสีแดง ถ้าข้อมูลมีค่าน้อยกว่าหรือเท่ากับ 0 และให้ข้อความเป็นสีเขียว ถ้าข้อมูลมากกว่า 0   หรืออีกตัวอย่างเช่น ถ้าเป็นแถว
เลขคู่ให้พื้นหลังสีเทาและถ้าเป็นเลขคี่ให้แสดงพื้นหลังปกติ เป็นต้น
    ในการกำหนดเงื่อนไข จะประกอบด้วย การกำหนด Condition Type และ/หรือ Operator Type  ค่าคงที่ของทั้ง 2 ประกอบด้วย
///////////////// Condition Type ตัวกำหนดเงื่อนไข

CONDITION_NONE	
// ไม่ใช้เงื่อนไขใดๆ
CONDITION_CELLIS
// ใช้เงื่อนไขพิจารณาค่าจาก cell ข้อมูล ใช้งานร่วมกับ OperatorType บางตัว เช่น มากกว่า น้อยกว่า น้อยกว่าหรือเท่ากับ เป็นต้น
CONDITION_CONTAINSTEXT
// ใช้เงื่อนไขพิจารณาจากข้อความใน cell  ใช้งานร่วมกับ OperatorType บางตัว เช่น ขึ้นต้นด้วย ลงท้ายด้วย เป็นต้น
CONDITION_EXPRESSION	
// ใช้เงื่อนไขจากการกำหนดสูตร หรือสมการ
CONDITION_CONTAINSBLANKS
// ใช้เงื่อนไขจาก cell ที่ไม่มีข้อมูลใดๆ หรือ cell ว่างเปล่า


///////////////// Operator Type ตัวดำเนินการ

OPERATOR_NONE	
// ไม่ใช้ตัวดำเนินการ
OPERATOR_BEGINSWITH	
// ขึ้นต้นด้วย
OPERATOR_ENDSWITH	
// ลงท้ายด้วย
OPERATOR_EQUAL	
// มีค่าเท่ากับ ( = )
OPERATOR_GREATERTHAN	
// มีค่ามากกว่า ( > )
OPERATOR_GREATERTHANOREQUAL	
// มีค่ามากกว่าหรือเท่ากับ ( >= )
OPERATOR_LESSTHAN	
// มีค่าน้อยกว่า ( < )
OPERATOR_LESSTHANOREQUAL	
// มีค่าน้อยกว่าหรือเท่ากับ ( <= )
OPERATOR_NOTEQUAL	
// มีค่าไม่เท่ากับ ( <> )
OPERATOR_CONTAINSTEXT	
// มีข้อความตามที่กำหนด
OPERATOR_NOTCONTAINS	
// ไม่มีข้อความตามที่กำหนด
OPERATOR_BETWEEN
// มีค่ามากกว่าหรือเท่ากับ x แต่น้อยกว่าหรือเท่ากับ y 
    ตัวอย่างการกำหนดเงื่อนไขรูปแบบต่างๆ 
    การเลือกเฉพาะแถวรายการเลขคู่
$conditional1 = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional1->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_EXPRESSION);
$conditional1->addCondition('MOD(ROW(),2)'); // ใช้สูตร
    การเลือก cell ที่มีข้อความเท่ากับ "ตรัง" 
$conditional2 = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional2->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_CELLIS);
$conditional2->setOperatorType(\PhpOffice\PhpSpreadsheet\Style\Conditional::OPERATOR_EQUAL);
$conditional2->addCondition('"ตรัง"');  // กรณีนี้ จะไม่ใช้เป็น 'ตรัง' แต่จะเพิ่ม '"ตรัง"' เพื่อให้เป็นการเทียบข้อความ
   การเลือก cell โดยเปรียบเทียบจากสองค่า ข้อมูล ด้วย BETWEEN
$conditional3->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_CELLIS);
$conditional3->setOperatorType(\PhpOffice\PhpSpreadsheet\Style\Conditional::OPERATOR_BETWEEN);
$conditional3->addCondition('10');
$conditional3->addCondition('20');
    การเลือก cell ที่ข้อความลงท้ายด้วย "บุรี"
    เท่าที่ทดสอบ การจัดการเกี่ยวกับข้อความ ถ้าเป็นภาษาอังกฤษ จะสามารถใช้รูปแบบด้านล่างได้ ทุก opterator type ไม่ว่าจะเป็น
ขึ้นต้นด้วย | ลงท้ายด้วย | มีข้อความที่กำหนด อย่างตัวอย่างต่อไปนี้ จะไม่สามารถใช้งานได้
$conditional2 = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional2->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_CONTAINSTEXT);
$conditional2->setOperatorType(\PhpOffice\PhpSpreadsheet\Style\Conditional::OPERATOR_ENDSWITH); 
$conditional2->setText('บุรี');
    แต่ถ้าเราเปลี่ยนเป็นข้อความภาษาอังกฤษ 
$conditional2->setText('buri');
    ก็จะสามารถใช้งานได้ปกติ 
    ในกรณีถ้าเป็น OPERATOR_CONTAINSTEXT ตรวจสอบว่ามีข้อความหรือไม่ 
$conditional2 = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional2->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_CONTAINSTEXT);
$conditional2->setOperatorType(\PhpOffice\PhpSpreadsheet\Style\Conditional::OPERATOR_CONTAINSTEXT); 
$conditional2->setText('บุรี'); // เงื่อนไขนี้ใช้ภาษาไทยได้
    จะสามารถใช้งานภาษาไทยได้ปกติ   แตถ้าตรวจสอบคำขึ้นต้นด้วย หรือลงท้ายด้วย จะไม่สามารถใช้งานภาษาไทยในการตรวจสอบได้ 
อย่างไรก็ตามเราสามารถใช้รูปแบบ EXPRESSION แทนได้
$conditional2 = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional2->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_EXPRESSION);
$conditional2->addCondition('RIGHT(A2,4)="บุรี"'); // ตัดสี่คำด้านขวา ลงท้ายด้วย "บุรี"
//$conditional2->addCondition('LEFT(A2,1)="อ"'); // หรือกรณีขึ้นต้นด้วย ก็เป็น ขึ้นต้นด้วย "อ"
    สังเกตการกำหนดค่าเงื่อนไขในตัวอย่าง ถ้าเป็นข้อความจะใช้คำสั่ง setText() แทน addCondition() แต่ก็ขึ้นกับการใช้งาน อย่างในกรณี
ใช้ใน EXPRESSION ก็สามารถใช้จัดการข้อความด้วย addCondition() ได้
 
    มาดูตัวอย่างการใช้งานแบบเต็ม
// เงื่อนไขที่ 1 ใส่สีพื้นหลังให้แถวที่เป็นเลขคู่
$conditional1 = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional1->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_EXPRESSION);
$conditional1->addCondition('MOD(ROW(),2)');
$conditional1->getStyle()->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID);
$conditional1->getStyle()->getFill()->getStartColor()->setRGB('D9D9D9');
$conditional1->getStyle()->getFill()->getEndColor()->setRGB('D9D9D9');

// เงื่อนไขที่ 2 เปลี่ยนข้อความเป็นตัวหนา สีน้ำเงิน ถ้าลงท้ายด้วยคำว่า "บุรี"
$conditional2 = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional2->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_EXPRESSION);
$conditional2->addCondition('RIGHT(A2,4)="บุรี"');
$conditional2->getStyle()->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_BLUE);
$conditional2->getStyle()->getFont()->setBold(true);

// เงื่อนไขที่ 3 ให้ cell ที่มีค่ามากกว่าหรือเท่ากับ 0 เป็นตัวหนา สีเขียว แต่ในที่นี้ เราจะไม่นำไปใช้งาน
$conditional3 = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional3->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_CELLIS);
$conditional3->setOperatorType(\PhpOffice\PhpSpreadsheet\Style\Conditional::OPERATOR_GREATERTHANOREQUAL);
$conditional3->addCondition('0');
$conditional3->getStyle()->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_GREEN);
$conditional3->getStyle()->getFont()->setBold(true);

// จากนั้นเรียกใช้เงื่อนไข style ในพิกัดใดๆ ก็ได้พิกัดหนึ่ง จะคืนค่า $conditionalStyles เป็น array
$conditionalStyles = $sheet->getStyle('A2')->getConditionalStyles();
$conditionalStyles[] = $conditional1; // เพื่มเงื่อนไขเข้าไปใน array ของ เงื่อนไข style
$conditionalStyles[] = $conditional2; // ในที่นี้เราเพิ่มแค่ เงื่อนไขที่ 1 และ 2
//$conditionalStyles[] = $conditional3;

// เรียกใช้งานเงื่อนไขการกำหนด style ในช่วงพิกัดที่ต้องการ
$sheet->getStyle('A2:C'.$lastRow)->setConditionalStyles($conditionalStyles);
    ผลลัพธ์ที่ได้
 

 
 
 
 

    การจำกัดแถวรายการพิมพ์ต่อหน้า

    หลังจากเรากำหนดรูปแบบ ใส่เส้นขอบ ต่างๆ ใกล้เคียงกับข้อมูลที่จะใช้งานจริงแล้ว พอเราลองทดสอบดูตัวอย่างก่อนพิมพ์ จะพบว่า
รายการข้อมูล มีการแสดงต่อเนื่อง เต็มพื้นที่แนวตั้งของแต่ละหน้า โดยข้อมูลเรียงต่อเนื่องยาวติดๆ กัน เนื่องจากข้อมูลทดสอบ
เราเป็นจังหวัดในประเทศไทย มีทั้งหมด 77 รายการ ข้อมูลจะถูกแบ่งออกเป็น 3 หน้า เรามาดูรูปผลลัพธ์ บางหน้าของตัวอย่างการพิมพ์
 
หน้าแรกด้านบน

 
 
หน้าแรกด้านล่าง
      
 
 
หน้าที่สองด้านบน
  
 
 
 
    รูปแบบการกำหนดเส้นขอบที่เน้นแสดงข้อมูลแบ่งเป็นคอลัมน์ พอตัดขึ้นบรรทัดใหม่ จะเห็นว่าขอบด้านล่างของหน้า ยกเว้นหน้า
สุดท้าย เส้นขอบหายไป อีกทั้งในหน้าที่ 2 หัวข้อรายการก็ไม่แสดง เราจะมาแก้ปํญหาต่างๆ เหล่านี้กัน
    เพื่อให้เอกสารของเราแสดงข้อมูลเป็นสัดส่วนที่แน่นอน เราสามารถกำหนดจำนวนแถวของข้อมูลที่ต้องการให้แสดงในแต่ละหน้า
โดยการกำหนดจุดที่จะทำการ ตัดให้ขึ้นหน้าใหม่ BREAK_ROW อย่างในไฟล์ของเรา จะเห็นหน้าแรกจบที่รายการที่  29 แต่ก็จบแบบ
ชิดขอบด้านล่างเลย นั่นก็หมายความว่า ในหน้าหนึ่งๆ จะแสดงจำนวนแถวสูงสุดไม่เกิน 29 แถวข้อมูล เราก็เลือกจำนวนแถวข้อมูล
ตามความเหมาะสม ในที่นี้เราจะกำหนดไปที่ หน้าละ 28 แถว เราจะได้พิกัดที่จะตัดขึ้นหน้าใหม่ของหน้าแรกเป็น A28 แต่ด้วยว่า
มีแถวของหัวข้อด้วย 1 แถว ดึงนั้นในหน้าแรกเราจะตัดขึ้นหน้าใหม่ที่ A29 สามารถกำหนดได้ดังนี้
$sheet->setBreak('A29', \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::BREAK_ROW);
    กรณีที่เป็นเอกสารแนวนอน และต้องการตัดแบ่งหน้าใหม่ด้วยคอลัมน์ ก็จะกำหนดในลักษณะคล้ายกัน ดังนี้
// ต้ดขึ้นหน้าใหม่ของเอกสารในแนวนอน ที่คอลัมน์ D
$sheet->setBreak('D10', \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::BREAK_COLUMN);
    เรากลับมาที่ข้อมูลตัวอย่างเราต่อ ข้อมูลตัวอย่างของเราจะตัดจากแถวข้อมูลที่พิกัดของหน้าแรกเป็น A29 เพื่อที่จะแสดงแหน้าละ 28 รายการ
โดยรวมแถวของหัวข้อแล้ว
    แน่นอนว่า เราต้องกำหนดในทุกๆ หน้า ยิ่งข้อมูลมีมากเท่าไหร่ จำนวนที่ต้องกำหนดก็จะมากขึ้น อย่างกรณีนี้ มี 3 หน้า เราจะกำหนด
ในหน้าที่ 2 เพิ่มมาอีก 28 แถว
$sheet->setBreak('A29', \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::BREAK_ROW);
$sheet->setBreak('A57', \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::BREAK_ROW);
    และเนื่องจากหน้าสุดท้ายจำนวนข้อมูลไม่เกิน 28 รายการ เราก็ไม่ต้องกำหนด
    ถึงแม้ว่า การกำหนดค่าแบบข้างตัน จะสามารถทำได้ แต่ก็เหมาะแค่จำนวนรายการที่มีจำนวนหน้าไม่มากนัก  ดังนั้นหากมีข้อมูลจำนวนมาก
เราจำเป็นต้องกำหนดโดยคำสั่งเพิ่มเติม ดังนี้
$rowPerPage = 28; // จำนวนแถวที่จะแสดงในแต่ละหน้า
$startRow = 1; // จำนวนแถวของหัวเรื่อง
// วนลูปตัดบรรทัดใหม่ทุกหน้า 
for($breakRow=$startRow; $breakRow<=$totalRow; $breakRow+=$rowPerPage){
    if($breakRow==$startRow) continue; // ไม่ตัดหน้าใหม่ กรณีหัวข้อ
    $sheet->setBreak('A'.$breakRow, \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::BREAK_ROW);
}
    ผลลัพธ์ที่ได้หน้า 1 และหน้า 2 ข้อมูลด้านล่าง
 
 
 

 
 
    ตอนนี้เราได้จำนวนรายการในแต่ละหน้า ตามที่ระบุหรือตามที่ต้องการแล้ว แต่เราจะเห็นว่า หน้าที่ 2 และหน้าที่ 3 จะไม่มีหัว
ข้อหรือแถวของหัวเรื่อง เราจะแก้ปัญหาต่อ
 

 

    การแสดงแถวหัวเรื่องซ้ำ

    ในกรณีที่เราต้องการให้ข้อมูลแต่ละหน้า มีแถวของหัวเรื่องซ้ำในตอนพิมพ์ สามารถกำหนดได้ดังนี้
$sheet->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 1);
    ลักษณะการกำหนดคือ เป็นการกำหนดแถวข้อมูลหัวเรื่องที่อยู่ในหน้าแรก ให้วนไปแสดงด้านบนของทุกๆ หน้า โดย 1 ตัวแรก
คือแถวเริ่มต้น และเนื่องจาก เรามีแถวเดียว เราก็กำหนด 1 ในค่าที่สองด้วย    สมมติว่าส่วนของหัวเรื่องเรามีหลายแถว เช่น 3 แถวแรก
ค่าก็จะเปลี่ยนเป็น แถวที่ 1 ถึงแถวที่ 3 ก็จะใช้เป็น
$sheet->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 3); // ตัวอย่าง 3 แถวแรกเป็นหัวเรื่องที่เราจะวนแสดงทุกหน้า
    สิ่งเพิ่มเติมที่เราต้องปรับคือ แถวข้อมูลสุดท้ายของแต่ละหน้า หรือก็คือตำแหน่ง BREAK_ROW นั้น ตำกำหนด style เดิมไม่ครอบคลุม
จึงทำให้ไม่มีเส้นขอบ ดังนั้น กรณีนี้เราก็จะใส่เส้นขอบด้านล่างให้กับแถวสุดท้ายของแต่ละหน้า ก็จะได้เป็นดังนี้
// แสดงแถวหัวเรื่องแถวแรกในทุกๆ หน้า
$sheet->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 1);
$rowPerPage = 28; // จำนวนแถวที่จะแสดงในแต่ละหน้า
$startRow = 1; // จำนวนแถวของหัวเรื่อง
// วนลูปตัดบรรทัดใหม่ทุกหน้า 
for($breakRow=$startRow; $breakRow<=$totalRow; $breakRow+=$rowPerPage){
    if($breakRow==$startRow) continue; // ไม่ตัดหน้าใหม่ กรณีหัวข้อ
    $sheet->setBreak('A'.$breakRow, \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::BREAK_ROW);
    // ใส่เส้นขอบล่างให้กับแถวสุดท้ายของแต่ละหน้า
    $sheet->getStyle('A'.$breakRow.':C'.$breakRow)
    ->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
}
    ผลลัพธ์ที่ได้
 
 

 
 
    ในตอนหน้า เราจะมาดูเกี่ยวกับการตั้งค่าหน้ากระดาษ การพิมพ์ และส่วนอื่นๆ เพิ่มเติม


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



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









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









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





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

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


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


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







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