Tag Archive style

Byphunsanit

Jasper: Default Style

การที่ลาก elements ของ JasperReports อย่าง Text Field หรือ Static Text แล้วต้องมากำหนดให้ใช้ fonts เป็น Arial ขนาด 8 ตัวอักษรสีดำ 30 จุด มันถึกและเสียเวลามากเกินไป เลยหาวิธีใหม่ มาเทียบกับตอนที่ทำเว็บดู เราใช้คำสั่ง css โดยกำหนด

<style>
* {
   color:#c00000;
   font: 8px arial;
}
</style>

หรือ

<style>
body {
   color:#c00000;
   font: 8px arial;
}
</style>

เป็น default style แค่นี้ก็เปลี่ยนการแสดงผลได้ทั้งหน้าแล้ว jasper report ก็น่าจะทำได้เช่นกัน

เมื่อเราหากันจนเจอ วิธีก็ไม่ได้ยากเลย

  1. ไปที่ Outline คลิกขวาตรง Styles เลือก Create Style
  2. ไปที่ Properties ตั้งชื่อ style ที่ต้องการ เช่น *
  3. เลือก Font, Font Size และสี forecolor ตามที่ต้องการ
  4. ที่ tab Style ใน Properties จะเห็นว่ามี checkbox ชื่อ Default Style ติ๊กเลยครับ นี่ละที่ชาติต้องการ
  5. ลาก Text Field หรือ Static Text มาเป็นตัวอย่าง แลัว Preview ดู

เท่านี้เราก็สามารถกำหนดให้ jasper report แสดง style ได้เป็นค่าเริ่มต้นโดยที่ไม่ต้องกำหนดทีละตัว ที่ละจุดให้เสียเวลาอีกต่อไปแล้ว สังเกตุใน Source จะมี xml เพิ่มขึ้นมาประมาณ

<style name="*" fontName="Arial" fontSize="8" forecolor="#000000" hTextAlign="Left" isDefault="true" vTextAlign="Top"/>

เราสามารถ copy ไปวางใน report อื่นๆ จะได้ไม่ต้องมาเซ็ตทุกๆ รีพอร์ตเหมือนกัน ส่วนใครสงสัยว่า attribute ไหนคืออะไรอ่านได้จาก Report Styles

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

จัด code php ตาม PHR 2 สำหรับคนไม่ใช้ PHP7

จากที่เคยเขียนเรื่อง จัด code php ตาม PHR 2 และหลังจากใช้ไปก็เจอปัญหาจึงเขียนเรื่อง phpfmt : PHP 70 or newer is required. จนเจอวิธีแก้ปัญหาจริงๆ

สาเหตุของปัญหาคือ phpfmt มันใช้ PHP 7 ในการจัดรูปแบบแต่ว่า project ที่ทำมีความจำเป็นต้องใช้ PHP 5.6 โดยตัว php-fmt ได้เตรียมทางออกไว้ให้แล้วแต่เพราะว่าไม่ได้หารีบเลยแก้แบบด่วนๆไปก่อน

  1. ไปที่ PHP Downloads โหลด php 7 มาติดตั้ง โดยผมเก็บไว้ที่ C:\php7
  2. เปิด sublime ไปที่ Preference > package settings > phpfmt > Settings – Default จะมีไฟล์ถูกเปิดขึ้นมาก แก้ php_bin ตามตัวอย่าง
    {
    	"option": "value",
    	"php_bin":"C:/php7/php.exe",
    	"version": 4
    }
    

    แค่นี้สามารถใช้ phpfmt จัด code ให้ได้โดยที่ไม่ต้องเปลี่ยนไปใช้ พีเอชพี 7 ได้แล้ว อาจจะปรับแต่งการจัด code ได้โดยไปที่ Preference > package settings > phpfmt > Settings – User แก้ไฟล์ตามตัวอย่าง

    {
    	"autocomplete": true,
    	"format_on_save": true,
    	"psr1": true,
    	"psr2": true,
    	"version": 1
    }
    

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');