Tag Archive ซ้าย

Byphunsanit

PHPExcel : กำหนด border

การใช้คำสั่ง border ตีเส้นตารางช่วยในการแบ่งขอบเขตุข้อมูลและช่วยให้อ่านให้ง่ายขึ้น

ตัวอย่าง

<?php

/* http://stackoverflow.com/questions/27764204/how-to-do-the-phpexcel-outside-border */
/* PHPExcel_IOFactory - Reader */
include 'vendor/phpoffice/phpexcel/Classes/PHPExcel.php';

$objPHPExcel = new PHPExcel();

/* Set default style */
$defaultStyle = $objPHPExcel->getDefaultStyle();

$defaultStyle->getFont()
    ->setName('Arial')
    ->setSize(11);

/* Set document properties */
$title = 'Exports_Datas_' . date('Y-m-d_H:i');
$objPHPExcel->getProperties()->setCreator('Pitt Phunsanit')
    ->setCategory('Exports Datas')
    ->setDescription($title)
    ->setKeywords('Exports Datas ' . date('Y-m-d'))
    ->setSubject($title)
    ->setTitle($title);

/* rename sheet */
$objWorkSheet = $objPHPExcel->getActiveSheet();
$objWorkSheet->setTitle('Exports Datas');

/* add background */
$background = [
    'fill' => [
        'color' => [
            'rgb' => 'FF9',
        ],
        'type' => PHPExcel_Style_Fill::FILL_SOLID,
    ],
];

$borders = [
    'allborders' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
        ],
    ],
    'bottom' => [
        'borders' => [
            'bottom' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
        ],
    ],
    'diagonal (both)' => [
        'borders' => [
            'diagonal' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
            'diagonaldirection' => PHPExcel_Style_Borders::DIAGONAL_BOTH,
        ],
    ],
    'diagonal (down)' => [
        'borders' => [
            'diagonal' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
            'diagonaldirection' => PHPExcel_Style_Borders::DIAGONAL_DOWN,
        ],
    ],
    'diagonal (none)' => [
        'borders' => [
            'diagonal' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
            'diagonaldirection' => PHPExcel_Style_Borders::DIAGONAL_NONE,
        ],
    ],
    'diagonal (up)' => [
        'borders' => [
            'diagonal' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
            'diagonaldirection' => PHPExcel_Style_Borders::DIAGONAL_UP,
        ],
    ],
    'horizontal' => [
        'borders' => [
            'horizontal' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
        ],
    ],
    'inside' => [
        'borders' => [
            'inside' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
        ],
    ],
    'left' => [
        'borders' => [
            'left' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
        ],
    ],
    'outline' => [
        'borders' => [
            'outline' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
        ],
    ],
    'right' => [
        'borders' => [
            'right' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
        ],
    ],
    'top' => [
        'borders' => [
            'top' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
        ],
    ],
    'vertical' => [
        'borders' => [
            'vertical' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
        ],
    ],
];

$bordersLine = [
    'BORDER_DASHDOT' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_DASHDOT,
            ],
        ],
    ],
    'BORDER_DASHDOTDOT' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_DASHDOTDOT,
            ],
        ],
    ],
    'BORDER_DASHED' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_DASHED,
            ],
        ],
    ],
    'BORDER_DOTTED' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_DOTTED,
            ],
        ],
    ],
    'BORDER_DOUBLE' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_DOUBLE,
            ],
        ],
    ],
    'BORDER_HAIR' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_HAIR,
            ],
        ],
    ],
    'BORDER_MEDIUM' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_MEDIUM,
            ],
        ],
    ],
    'BORDER_MEDIUMDASHDOT' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT,
            ],
        ],
    ],
    'BORDER_MEDIUMDASHDOTDOT' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT,
            ],
        ],
    ],
    'BORDER_MEDIUMDASHED' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_MEDIUMDASHED,
            ],
        ],
    ],
    'BORDER_NONE' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_NONE,
            ],
        ],
    ],
    'BORDER_SLANTDASHDOT' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_SLANTDASHDOT,
            ],
        ],
    ],
    'BORDER_THICK' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_THICK,
            ],
        ],
    ],
    'BORDER_THIN' => [
        'borders' => [
            'allborders' => [
                'style' => PHPExcel_Style_Border::BORDER_THIN,
            ],
        ],
    ],

];

$objWorkSheet->setCellValue('C1', 'Borders');
$objWorkSheet->getStyle('C1')->getFont()->setBold(true);
$rowNo = -1;
foreach ($borders as $name => $style) {
    $rowNo += 4;

    $objWorkSheet->setCellValue('A' . $rowNo, $name);

    /* merge background */
    $style = array_merge($background, $style);

    $objWorkSheet->getStyle('D' . $rowNo . ':F' . ($rowNo + 2))->applyFromArray($style);

}

$objWorkSheet->getStyle('G3:G53')->applyFromArray($borders['right']);

$objWorkSheet->setCellValue('M1', 'Line');
$objWorkSheet->getStyle('M1')->getFont()->setBold(true);
$rowNo = 1;
foreach ($bordersLine as $name => $style) {
    $rowNo += 2;

    $objWorkSheet->setCellValue('I' . $rowNo, $name);

    /* merge background */
    $style = array_merge($background, $style);

    $objWorkSheet->getStyle('N' . $rowNo)->applyFromArray($style);
}

/* write */
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $title . '.xlsx"');
header('Cache-Control: max-age=0');
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
$objWriter->save('php://output');

Byphunsanit

จัด PHPExcel สวยๆ

การจัดแต่งเล็กน้อย จะทำให้รายงานออกมาดูน่าสนใจ จะยกตัวอย่างการใช้ style, การ merge cells, pinned (freeze) cell ไว้ไม่ให้ขยับ เช่น fixed หัวตารางไว้ให้อยู่กับที่ และการ flip กลับตัวอักษร

<?php

/* PHPExcel_IOFactory - Reader */
include 'PHPOffice/PHPExcel/Classes/PHPExcel.php';

$objPHPExcel = new PHPExcel();

/* Set default style */
$defaultStyle = $objPHPExcel->getDefaultStyle();

$defaultStyle->getFont()
    ->setName('Arial')
    ->setSize(11);

/* Set document properties */
$title = 'Exports_Datas_' . date('Y-m-d_H:i');
$objPHPExcel->getProperties()->setCreator('Pitt Phunsanit')
    ->setCategory('Exports Datas')
    ->setDescription($title)
    ->setKeywords('Exports Datas ' . date('Y-m-d'))
    ->setSubject($title)
    ->setTitle($title);

/* rename sheet */
$objWorkSheet = $objPHPExcel->getActiveSheet();
$objWorkSheet->setTitle('Exports Datas');

$styles = [

    'tableHeader1' => [
        'alignment' => [
            'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
        ],
        'fill' => [
            'color' => [
                'rgb' => 'C00000'
            ],
            'type' => PHPExcel_Style_Fill::FILL_SOLID,
        ],
        'font' => [
            'color' => [
                'rgb' => 'ffffff'
            ],
            'name' => 'Arial',
        ],
        'name' => 'Arial',
    ],

    'tableHeader2' => [
        'alignment' => [
            'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
        ],
        'fill' => [
            'color' => [
                'rgb' => '00c000'
            ],
            'type' => PHPExcel_Style_Fill::FILL_SOLID,
        ],
        'font' => [
            'color' => [
                'rgb' => 'ffffff'
            ],
            'name' => 'Arial',
        ],
        'name' => 'Arial',
    ],

    'tableRow' => [
        'alignment' => [
            'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_LEFT,
        ],
        'bold' => true,
        'fill' => [
            'color' => [
                'rgb' => '0000c0'
            ],
            'type' => PHPExcel_Style_Fill::FILL_SOLID,
        ],
        'font' => [
            'color' => [
                'rgb' => 'ffffff'
            ],
            'name' => 'Arial',
        ],
        'name' => 'Arial',
    ],

];

/* raw datas */
$headers1 = ['2557', '2558', '2559'];
$headers2 = ['Shop A', 'Shop B'];
$headersRows = ['มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'];

/* make table */
$header1ColNo = 1;
$header2ColNo = 1;
$header2PerHeaders1 = count($headers2);
foreach($headers1 as $header1)
{
    $header1CoordinateStart = PHPExcel_Cell::stringFromColumnIndex($header1ColNo) . '1';
    $header1CoordinateEnd = PHPExcel_Cell::stringFromColumnIndex($header1ColNo + $header2PerHeaders1 - 1) . '1';

    $objWorkSheet->getStyle($header1CoordinateStart)->applyFromArray($styles['tableHeader1']);
    $objWorkSheet->mergeCells($header1CoordinateStart . ':' . $header1CoordinateEnd);
    $objWorkSheet->setCellValue($header1CoordinateStart, $header1);

    /* set column */
    $header1ColNo += $header2PerHeaders1;

    foreach($headers2 as $header2)
    {
        $coordinate = PHPExcel_Cell::stringFromColumnIndex($header2ColNo) . '2';

        $objWorkSheet->getStyle($coordinate)->applyFromArray($styles['tableHeader2']);
        $objWorkSheet->setCellValue($coordinate, $header2);

        $header2ColNo++;
    }
}

$rowNo = 3;
foreach($headersRows as $header)
{
    $coordinate = 'A' . $rowNo;

    $objWorkSheet->getStyle($coordinate)->applyFromArray($styles['tableRow']);
    $objWorkSheet->setCellValue($coordinate, $header);

    $rowNo++;
}

/* random add datas */
$highestColumn = 1 + (count($headers1) * count($headers2));
$highestRow = 2 + count($headersRows);
for ($rowNo = 3; $rowNo <= $highestRow; $rowNo++) {
    for ($colNo = 1; $colNo < $highestColumn; $colNo++) {

        $colString = PHPExcel_Cell::stringFromColumnIndex($colNo);

        $coordinate = $colString . $rowNo;

        $objWorkSheet->setCellValue($coordinate, rand(0 , 100));
    }
}

/* right label */
$colString = PHPExcel_Cell::stringFromColumnIndex($colNo);
$rowNo--;

$objWorkSheet->getStyle($colString . '3')->getAlignment()
    ->setTextRotation(-90)
    ->setVERTICAL(PHPExcel_Style_Alignment::VERTICAL_TOP);

$objWorkSheet->mergeCells($colString . '3:' . $colString . $rowNo);
$objWorkSheet->setCellValue($colString . '3', 'Gross Income Per Month');

/* freeze pinned head column */
$objPHPExcel->getActiveSheet()->freezePane($colString.'3');

$objWriter =PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $title . '.xlsx"');
header('Cache-Control: max-age=0');
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
$objWriter->save('php://output');