สร้างแผนภูมิใน Excel ไฟล์ ด้วย PhpSpreadsheet เบื้องต้น ตอนที่ 9

04 August 2019 By Ninenik Narkdee
jpgraph phpspreadsheet chart แผนภูมิ

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



เนื้อหาในตอนต่อไปนี้ เรามาเพิ่มความสามารถให้กับ PhpSpreadsheet
ให้สามารถทำการสร้างแผนภูมิรูปแบบต่างๆ ประกอบข้อมูลได้  ซึ่งเหมาะสำหรับ
เอกสาร excel ไฟล์ที่ต้องการสรุปข้อมูล พร้อมเปรียบเทียบให้เห็นภาพ
ด้วยการแสดงผลในรูปแบบแผนภูมิข้อมูล
    สำหรับการสร้างแผนภูมิใน PhpSpreadsheet  เราจำเป็นจะต้องติดตั้ง library เพิ่มเติม สำหรับใช้ในการสร้างแผนภูมิ
ในที่นี้คือ JpGraph เป็น PHP library ที่ช่วยให้เราสามารถสร้างแผนภูมิร่วมกับ PhpSpreadsheet ได้ง่ายและสะดวกขึ้น
 

    ติดตั้ง JpGraph

    ให้เราทำการติดตั้ง JpGraph ผ่าน Composer ด้วยคำสั่ง
 
composer require jpgraph/jpgraph
 
    เมื่อทำการติดตั้งเรียบร้อยแล้ว เราจะทำการเรียกใช้งาน โดยกำหนดการตั้งให้ให้ใช้ JpGraph เป็นตัวสร้างแผนภูมิ ด้วย
การเพิ่มการใช้งานดังนี้
// กำหนดการใช้งาน JpGraph สำหรับสร้างแผนภูมิ
use PhpOffice\PhpSpreadsheet\Settings;
Settings::setChartRenderer(\PhpOffice\PhpSpreadsheet\Chart\Renderer\JpGraph::class);
    จะได้ดูรูปแบบการนำไปใช้งาน  ตามลำดับต่อไป
 
 

    ไฟล์เริ่มต้นสร้างแผนภูมิ

    ก่อนที่เราจะไปในขั้นตอนการสร้างแผนภูมิ ก่อนอื่นเราต้องมีข้อมูล หรือชุดข้อมูลที่จะใช้ในการสร้างแผนภูมิก่อน ในที่นี้เราจะจำลอง
เป็นชุดข้อมูล array อย่างง่าย ซึ่งกรณีไปใช้งานจริงๆ เราสามารถประยุกต์ร่วมกับข้อมูลในฐานข้อมูลได้ ตามตัวอย่างบทความ
ที่ผ่านๆ มา
    ในที่นี้เราจะสมมติไฟล์ชื่อ test.php ด้วยรูปแบบโค้ดเบื้องต้น ที่เราคุ้นตากันมาบ้างแล้ว ดังนี้
<?php
// โค้ดไฟล์ dbconnect.php ดูได้ที่ http://niik.in/que_2398_5642
require_once("dbconnect.php");

// include composer autoload
require 'vendor/autoload.php';

// import the PhpSpreadsheet Class
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// Set value binder
//\PhpOffice\PhpSpreadsheet\Cell\Cell::setValueBinder( new \PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder() );
\PhpOffice\PhpSpreadsheet\Cell\Cell::setValueBinder( new \PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder() );

$spreadsheet = new Spreadsheet(); // สร้าง speadsheet object
$sheet = $spreadsheet->getActiveSheet(); // กำหนดการทำงานที่่แผ่นงานปัจจุบัน


// กรณีใช้ข้อมูลจากฐานข้อมูล ในที่นี้เราจะปิดไปก่อน จะใช้เป็นตัวแปร array ด้านล่างแทน
/* $sql = "
SELECT province_id,province_name,province_name_eng FROM tbl_provinces
";
$result = $mysqli->query($sql);
if($result && $result->num_rows>0){  // คิวรี่ข้อมูลสำเร็จหรือไม่ และมีรายการข้อมูลหรือไม่
    $arrayData = $result->fetch_all();
    $totalRow = count($arrayData); // จำนวนแถวข้อมูลทั้งหมด
    $result->free(); // สามารถใช้ $result->close() หรือ $result->free_result() แทนได้
} */

// ชุดตัวแปร array ข้อมูลตัวอย่าง สมมติเป็นจำนวนสินค้าที่ขายได้ในแต่ละปี
// แยกเป็นแต่ละไตรมาส
$arrayData = [
    ['', '2016', '2017','2018'],
    ['Q1', 12, 15, 21],
    ['Q2', 56, 73, 86],
    ['Q3', 52, 61, 69],
    ['Q4', 30, 32, 0],
];

// กำหนดค่าให้กับพิกัด Cell ในรูปแบบข้อมูล array
$sheet->fromArray(
    $arrayData,  // ตัวแปร array ข้อมูล
    NULL,        // ค่าข้อมูลที่ตรงตามค่านี้ จะไม่ถูกำหนด
    'A1',         // จุดพิกัดเริ่มต้น ที่ใช้งานข้อมูล เริ่มทึ่มุมบนซ้าย  หากไม่กำหนดจะเป็น "A1" ค่าเริ่มต้น
    true // มีเพิ่มการกำหนดให้มีการเปรียบข้อมูลที่เป็นค่า null ด้วย หรือก็คือ ถ้ามีค่า null ให้นำมาเปรียบเทียบด้วย
);


// ส่วนของการสร้างไฟล์ excel
$writer = new Xlsx($spreadsheet);
$output_file = "hello_world.xlsx"; // กำหนดชื่อไฟล์ excel ที่ต้องการ
$writer->save($output_file); // สร้าง excel

if(file_exists($output_file)){ // ตรวจสอบว่ามีไฟล์ หรือมีการสร้างไฟล์ แล้วหรือไม่
    echo '<a href="'.$output_file.'" target="_blank">Download</a>';
}
    ผลลัพธ์ข้อมูลเบื้องต้นที่ได้
 
 
 

    ชนิดแผนภูมิใน Excel

    การสร้างแผนภูมิใน Excel ด้วย PhpSpreadsheet นั้น ถือว่ารองรับชนิดแผนภูมิหลักๆ ครอบคลุมพอสมควร ซึ่งประกอบไปด้วย
แผนภูมิชนิดต่างๆ ดังนี้
 
  • แผนภูมิแท่ง / 3 มิติ
  • แผนภูมิเส้น / 3 มิติ
  • แผนภูมิพื้นที่ / 3 มิติ
  • แผนภูมิวงกลม / 3 มิติ
  • แผนภูมิโดนัท
  • แผนภูมิ XY (กระจาย)
  • แผนภูมิพื้นผิว / 3 มิติ
  • แผนภูมิเรดาร์
  • แผนภูมิฟอง
  • แผนภูมิหุ้น
  • แผนภูมิคอลัมน์
 
    สามารถเข้าไปดูตัวอย่างหน้าตา แผนภูมิชนิดต่างๆ ใน Excel เพิ่มเติมตามลิ้งค์ด้านล่าง เป็นแนวทาง
    ชนิดแผนภูมิที่พร้อมใช้งานใน Office
    https://support.office.com/th-th/article/ชนิดแผนภูมิที่พร้อมใช้งานใน-office-a6187218-807e-4103-9e0a-27cdb19afb90
 
 

    การสร้างแผนภูมิ

    ต่อไปเราจะมาดูตัวอย่าง การสร้างแผนภูมิจากชุดข้อมูลข้างต้น ในที่นี้เราจะสร้างแผนภูมิเส้น เป็นตัวอย่าง ประกอบการอธิบายการทำงาน
ของส่วนต่างๆ รวมถึงการเรียกใช้งาน JpGraph ที่นำมาสร้างแผนภูมิ จะได้ไฟล์ตัวอย่างเป็นดังนี้
<?php
// โค้ดไฟล์ dbconnect.php ดูได้ที่ http://niik.in/que_2398_5642
require_once("dbconnect.php");

// include composer autoload
require 'vendor/autoload.php';

// import the PhpSpreadsheet Class
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// กำหนดการใช้งาน JpGraph สำหรับสร้างแผนภูมิ
use PhpOffice\PhpSpreadsheet\Settings;
Settings::setChartRenderer(\PhpOffice\PhpSpreadsheet\Chart\Renderer\JpGraph::class);

// เรียกใช้งาน class ที่ใช้ในการสร้างแผนภูมิร่วมกับ JpGraph 
use PhpOffice\PhpSpreadsheet\Chart\Chart;
use PhpOffice\PhpSpreadsheet\Chart\DataSeries;
use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues;
use PhpOffice\PhpSpreadsheet\Chart\Layout;
use PhpOffice\PhpSpreadsheet\Chart\Legend;
use PhpOffice\PhpSpreadsheet\Chart\PlotArea;
use PhpOffice\PhpSpreadsheet\Chart\Title;

// Set value binder
//\PhpOffice\PhpSpreadsheet\Cell\Cell::setValueBinder( new \PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder() );
\PhpOffice\PhpSpreadsheet\Cell\Cell::setValueBinder( new \PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder() );

$spreadsheet = new Spreadsheet(); // สร้าง speadsheet object
$sheet = $spreadsheet->getActiveSheet(); // กำหนดการทำงานที่่แผ่นงานปัจจุบัน


// กรณีใช้ข้อมูลจากฐานข้อมูล ในที่นี้เราจะปิดไปก่อน จะใช้เป็นตัวแปร array ด้านล่างแทน
/* $sql = "
SELECT province_id,province_name,province_name_eng FROM tbl_provinces
";
$result = $mysqli->query($sql);
if($result && $result->num_rows>0){  // คิวรี่ข้อมูลสำเร็จหรือไม่ และมีรายการข้อมูลหรือไม่
    $arrayData = $result->fetch_all();
    $totalRow = count($arrayData); // จำนวนแถวข้อมูลทั้งหมด
    $result->free(); // สามารถใช้ $result->close() หรือ $result->free_result() แทนได้
} */

// ชุดตัวแปร array ข้อมูลตัวอย่าง สมมติเป็นจำนวนสินค้าที่ขายได้ในแต่ละปี
// แยกเป็นแต่ละไตรมาส
$arrayData = [
    ['', '2016', '2017','2018'],
    ['Q1', 12, 15, 21],
    ['Q2', 56, 73, 86],
    ['Q3', 52, 61, 69],
    ['Q4', 30, 32, 0],
];

// กำหนดค่าให้กับพิกัด Cell ในรูปแบบข้อมูล array
$sheet->fromArray(
    $arrayData,  // ตัวแปร array ข้อมูล
    NULL,        // ค่าข้อมูลที่ตรงตามค่านี้ จะไม่ถูกำหนด
    'A1',         // จุดพิกัดเริ่มต้น ที่ใช้งานข้อมูล เริ่มทึ่มุมบนซ้าย  หากไม่กำหนดจะเป็น "A1" ค่าเริ่มต้น
    true // มีเพิ่มการกำหนดให้มีการเปรียบข้อมูลที่เป็นค่า null ด้วย หรือก็คือ ถ้ามีค่า null ให้นำมาเปรียบเทียบด้วย
);


// กำหนด ชื่อกำกับ ของแต่ละชุดข้อมูล ที่จะสร้างแผนภูมิ ซึ่งประกอบด้วยค่าต่างๆ ดังนี้
//     ชนิดข้อมูล DATASERIES_TYPE_STRING | DATASERIES_TYPE_NUMBER
//     พิกัด cell อ้างอิงข้อมูล
//     การจัดรูปแบบข้อมูล
//     จำนวนจุดในชุดข้อมูล ในที่นี้คือ 1 คือ ปีนั้นๆ
//     ค่าข้อมูล ในที่นี้ไม่มีการกำหนด เป็น array ค่าว่างเป็นค่าเริ่มต้น
//     ข้อมูล marker ในที่นี้ไม่มีการกำหนด ใช้ค่าเริ่มต้นเป็น null
$dataSeriesLabels = [
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1', null, 1), // 2016
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$C$1', null, 1), // 2017
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$D$1', null, 1), // 2018
];
// กำหนด ข้อความสำหรับแกน x ในที่นี้จะใช้ ข้อมูลที่เป็นการระบุ ไตรมาส จาก Q1 - Q4
//     ชนิดข้อมูล DATASERIES_TYPE_STRING | DATASERIES_TYPE_NUMBER
//     พิกัด cell อ้างอิงข้อมูล
//     การจัดรูปแบบข้อมูล
//     จำนวนจุดในชุดข้อมูล ในที่นี้คือ 1 คือ ปีนั้นๆ
//     ค่าข้อมูล ในที่นี้ไม่มีการกำหนด เป็น array ค่าว่างเป็นค่าเริ่มต้น
//     ข้อมูล marker ในที่นี้ไม่มีการกำหนด ใช้ค่าเริ่มต้นเป็น null
$xAxisTickValues = [
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$A$2:$A$5', null, 4), // Q1 to Q4
];
// กำหนด ค่าของแต่ละชุดข้อมูล ที่จะสร้างแผนภูมิ ซึ่งประกอบด้วยค่าต่างๆ ในที่นี้คือชุดข้อมูลของแต่ละปี
//     ชนิดข้อมูล DATASERIES_TYPE_STRING | DATASERIES_TYPE_NUMBER
//     พิกัด cell อ้างอิงข้อมูล
//     การจัดรูปแบบข้อมูล
//     จำนวนจุดในชุดข้อมูล ในที่นี้คือ 1 คือ ปีนั้นๆ
//     ค่าข้อมูล ในที่นี้ไม่มีการกำหนด เป็น array ค่าว่างเป็นค่าเริ่มต้น
//     ข้อมูล marker ในที่นี้ไม่มีการกำหนด ใช้ค่าเริ่มต้นเป็น null
$dataSeriesValues = [
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$B$5', null, 4),
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$C$2:$C$5', null, 4),
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$D$2:$D$5', null, 4),
];
// ปรับแต่งเพิ่มเติม กำหนดขนาดเส้นของ ข้อมูลปีสุดท้าย ปี 2018
// $dataSeriesValues[2]->setLineWidth(60000);

// สร้างชุดข้อมูล ที่จะใช้สร้างแผนภูมิ
$series = new DataSeries(
    DataSeries::TYPE_LINECHART, // ประเภทของแผนภูมิ
    DataSeries::GROUPING_STANDARD, // การจัดกลุ่มข้อมูล 
    range(0, count($dataSeriesValues) - 1), // ลำดับข้อมูล เรียงจาก array 0 - 2
    $dataSeriesLabels, // ชื่อกำกับชุดข้อมูล 
    $xAxisTickValues, // ข้อความสำหรับแกน x
    $dataSeriesValues        // ค่าข้อมูล
);
// นำชุดข้อมูลไปกำหนดใช้งานในพื้นที่พิกัดของชุดช้อมูล สำหรับสร้างแผนภูมิ 
$plotArea = new PlotArea(null, [$series]);

// กำหนดคำอธิบายของแผนภูมิ และการจัดตำแหน่งคำอธิบาย
$legend = new Legend(Legend::POSITION_TOP, null, false); // กำหนดตำแหน่งของคำอธิบายชุดข้อมูล
// ตำแหน่งต่างๆ เพิ่มเติม 
// https://phpoffice.github.io/PhpSpreadsheet/master/PhpOffice/PhpSpreadsheet/Chart/Legend.html
// POSITION_RIGHT | POSITION_LEFT | POSITION_BOTTOM | POSITION_TOP | POSITION_TOPRIGHT
$title = new Title('ยอดขายสินค้ารายไตรมาส ปี 2016 - 2018'); // หัวข้อแผนภูมิ
// $xAxisLabel = new Title('xxxxx'); // ข้อความอธิบายกำกับแกน X // (ถ้ามี)
$yAxisLabel = new Title('จำนวน (หน่วย:ล้าน)'); // ข้อความอธิบายกำกับแกน Y

// สร้างแผนภูมิ โดยใช้ค่าต่างๆ จากตัวแปรที่กำหนด 
$chart = new Chart(
    'chart1', // กำหนดชื่อ
    $title, // กำหนดชื่อเรื่องหรือหัวข้อกำกับ
    $legend, // ตำแหน่งคำอธิบายของชุดข้อมูล 
    $plotArea, // พิกัดพื้นที่ชุดข้อมูล
    true, // กำหนดให้แสดงแผนภูมิ
    0, // กำหนดหากเป็นค่าว่าง ให้ใช้ค่านี้แทน ในที่นี้คือ 0
    null,  // ข้อความอธิบายกำกับแกน X ในที่นี้ไม่มีกำหนด
    $yAxisLabel  // ข้อความอธิบายกำกับแกน Y
);

// กำหนดพิกัดมุมบนซ้าย และมุมล่างขวา เป็นพื้นที่สำหรับแสดงแผนภูมิ
$chart->setTopLeftPosition('A7');
$chart->setBottomRightPosition('H20');

// เพิ่มแผนภูมิ ไปในแผ่นงาน
$sheet->addChart($chart);



// ส่วนของการสร้างไฟล์ excel
$writer = new Xlsx($spreadsheet);
$output_file = "hello_world.xlsx"; // กำหนดชื่อไฟล์ excel ที่ต้องการ
$writer->setIncludeCharts(true); // กำหนดให้มี แผนภูมิในไฟล์ที่สร้าง
$writer->save($output_file); // สร้าง excel

if(file_exists($output_file)){ // ตรวจสอบว่ามีไฟล์ หรือมีการสร้างไฟล์ แล้วหรือไม่
    echo '<a href="'.$output_file.'" target="_blank">Download</a>';
}
    บรรทัดที่ highlight คือส่วนที่เราเพิ่มเข้ามา แต่ก่อนจะไปที่การแยกอธิบายเพิ่มเติม เรามาดูผลลัพธ์ที่ได้ 
    ผลลัพธ์จะได้เป็น
 
 
 
    ส่วนแรกที่เราเพิ่มเข้ามาคือ ส่วนของการตั้งค่าการใช้งาน JpGraph Library สำหรับสร้างแผนภูมิ รวมถึง class ต่างๆ ที่ใช้งาน
ร่วมกับ JpGraph ในการสร้างและปรับแต่งแผนภูมิ
// กำหนดการใช้งาน JpGraph สำหรับสร้างแผนภูมิ
use PhpOffice\PhpSpreadsheet\Settings;
Settings::setChartRenderer(\PhpOffice\PhpSpreadsheet\Chart\Renderer\JpGraph::class);

// เรียกใช้งาน class ที่ใช้ในการสร้างแผนภูมิร่วมกับ JpGraph
use PhpOffice\PhpSpreadsheet\Chart\Chart;
use PhpOffice\PhpSpreadsheet\Chart\DataSeries;
use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues;
use PhpOffice\PhpSpreadsheet\Chart\Layout;
use PhpOffice\PhpSpreadsheet\Chart\Legend;
use PhpOffice\PhpSpreadsheet\Chart\PlotArea;
use PhpOffice\PhpSpreadsheet\Chart\Title;
    ต่อมาเป็นส่วนของการกำหนดส่วนของพิกัด cell ที่จะใช้เป็นชื่ออธิบายชุดข้อมูล ในที่นี้ คือข้อมูลของปี 2016 - 2018
// กำหนด ชื่อกำกับ ของแต่ละชุดข้อมูล ที่จะสร้างแผนภูมิ ซึ่งประกอบด้วยค่าต่างๆ ดังนี้
//     ชนิดข้อมูล DATASERIES_TYPE_STRING | DATASERIES_TYPE_NUMBER
//     พิกัด cell อ้างอิงข้อมูล
//     การจัดรูปแบบข้อมูล
//     จำนวนจุดในชุดข้อมูล ในที่นี้คือ 1 คือ ปีนั้นๆ
//     ค่าข้อมูล ในที่นี้ไม่มีการกำหนด เป็น array ค่าว่างเป็นค่าเริ่มต้น
//     ข้อมูล marker ในที่นี้ไม่มีการกำหนด ใช้ค่าเริ่มต้นเป็น null
$dataSeriesLabels = [
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1', null, 1), // 2016
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$C$1', null, 1), // 2017
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$D$1', null, 1), // 2018
];
    ต่อด้วยส่วนกำหนดข้อความกำกับในแนวแกน x ลักษณะการกำหนดพิกัด cell จะใช้รูปแบบ 'Worksheet!$A$2:$A$5'
โดยมีชื่อแผ่นงาน 'Worksheet' ถ้าเป็นชื่ออื่่น การเรียกใช้ต้องเปลี่ยนไปตามชื่อแผ่นงานนั้นๆ ตามด้วยเครื่องหมาย ! และต่อด้วย
พิกัด cell แต่ในที่นี้จะเป็นการกำหนด โดยตรึงค่าตามพิกัดนั้นๆ กล่าวคือต้องเป็นค่าของพิกัด ไม่เปลี่ยนแปลง โดยใช้ $ ตรึง
คอลัมน์และ แถวข้อมูล เช่น จาก B1 ก็เป็น $B$1 ดังนั้น การเพิ่มแถวหรือคอลัมน์ ที่ทำให้ข้อมูลเปลี่ยนตำแหน่งจะมีผลต่อการ
สร้างแผนภูมิ
// กำหนด ข้อความสำหรับแกน x ในที่นี้จะใช้ ข้อมูลที่เป็นการระบุ ไตรมาส จาก Q1 - Q4
//     ชนิดข้อมูล DATASERIES_TYPE_STRING | DATASERIES_TYPE_NUMBER
//     พิกัด cell อ้างอิงข้อมูล
//     การจัดรูปแบบข้อมูล
//     จำนวนจุดในชุดข้อมูล ในที่นี้คือ 1 คือ ปีนั้นๆ
//     ค่าข้อมูล ในที่นี้ไม่มีการกำหนด เป็น array ค่าว่างเป็นค่าเริ่มต้น
//     ข้อมูล marker ในที่นี้ไม่มีการกำหนด ใช้ค่าเริ่มต้นเป็น null
$xAxisTickValues = [
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$A$2:$A$5', null, 4), // Q1 to Q4
];
     ต่อด้วยพิกัดของชุดข้อมูล หรือก็คือค่าของข้อมูลที่เราจะนำมาใช้ในการสร้างแผนภูมิ  โดยการกำหนดค่าของชุดข้อมูล ต้อมีจำนวน
สัมพันธ์กับชื่อข้อมูลด้วย  เช่น ช่วงข้อมูลของพิกัด B2-B5 จะเป็นชุดข้อมูลแต่ละไตรมาส ของปี  2016 เป็นต้น
// กำหนด ค่าของแต่ละชุดข้อมูล ที่จะสร้างแผนภูมิ ซึ่งประกอบด้วยค่าต่างๆ ในที่นี้คือชุดข้อมูลของแต่ละปี
//     ชนิดข้อมูล DATASERIES_TYPE_STRING | DATASERIES_TYPE_NUMBER
//     พิกัด cell อ้างอิงข้อมูล
//     การจัดรูปแบบข้อมูล
//     จำนวนจุดในชุดข้อมูล ในที่นี้คือ 1 คือ ปีนั้นๆ
//     ค่าข้อมูล ในที่นี้ไม่มีการกำหนด เป็น array ค่าว่างเป็นค่าเริ่มต้น
//     ข้อมูล marker ในที่นี้ไม่มีการกำหนด ใช้ค่าเริ่มต้นเป็น null
$dataSeriesValues = [
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$B$5', null, 4),
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$C$2:$C$5', null, 4),
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$D$2:$D$5', null, 4),
];
    ในการกำหนดค่า DataSeriesValues ในตัวอย่าง ของทั้งสามค่าข้างต้น เราจะใช้ parameter แค่ 4 ค่าเท่านั้น
เราสามารถระบุ ชุดข้อมูลที่ต้องการปรับแต่งเพิ่มเติมได้ โดยชุดข้อมูลจะอยู่ในรูปแบบ array   อย่างชุดขอมูลของปี 2018 ก็สามารถ
อ้างอิงได้ที่ array ตัวที่ 3 หรือ array ที่มี key เท่ากับ 2  ยกตัวอย่างเราต้องการกำหนดความหน้าของเส้น ก็จะใช้เป็น
// ปรับแต่งเพิ่มเติม กำหนดขนาดเส้นของ ข้อมูลปีสุดท้าย ปี 2018
$dataSeriesValues[2]->setLineWidth(60000);
    ต่อไปเป็นการสร้างชุดข้อมูล หรือ DataSeries Object ในที่นี้จะมีการกำหนดชนิดของแผนภูมิ   โดยสำหรับการกำหนดชนิดของแผนภูมินั้น
เราต้องเลือกให้สัมพันธ์กับรูปแบบของข้อมูลด้วย ในตัวอย่างนี้เราชุดข้อมูลเราเหมาะสำหรับสร้างเป็นแผนภูมิเส้น เพื่อเปรียบเทียบค่าของ
แต่ละปี สามารถใช้ค่าตัวแปรคงที่ สำหรับระบุชนิดของแผนภูมิที่ต้องการเพิ่มเติมได้ที่ ลิ้งค์ด้านล่าง
https://phpoffice.github.io/PhpSpreadsheet/master/PhpOffice/PhpSpreadsheet/Chart/DataSeries.html
 
    เช่นกันกับการกำหนดกลุ่มการจัดข้อมูล ก็สามารถปรับแต่งค่าได้ แต่โดยทั่วไปแล้วจะใช้ค่า เริ่มต้น คือ GROUPING_STANDARD
ยังมีค่าจากตัวแปรคงที่เพิ่มเติมที่เราสามารถกำหนดได้ ได้แก่
    GROUPING_STANDARD กำหนดให้ข้อมูลสัมพันธ์กับค่าข้อมูลในแนวแกน Y 
    GROUPING_STACKED กำหนดให้ค่าข้อมูลในแนวแกน Y เป็นค่าที่บวกเพิ่มจากค่าของชุดข้อมูลก่อนหน้า เพื่อให้เห็นความแตกต่าง
ของสองรูปแบบชัดเจนขึ้น ดูจากแผนภูมิเปรียบเทียบ ดังนี้
 
 
   
 
 
    สังเกตว่าค่าแบบ STACKED หรือการนับเพิ่มจากค่าเดิม จะเป็นค่าที่อยู่สูงกว่าค่าเดิม เพื่อให้เห็นมุมมองการเปรียบเทียบทิศทางแยกกัน
ชัดเจน เช่น ค่า Q1 ปี 2016 เท่ากับ 12 ปี 2017 เท่ากับ 15 ถ้าแบบ STANDARD ค่าจะตรงกับค่าในแกน Y และถ้าเป็นแบบ STACKED 
ค่าของปี 2017 จะตรงค่าในแนวแกน Y ที่ค่า 12+15 หรือก็คือที่ตำแหน่งค่า 27 ในแนวแกน Y นั่นเอง คือเป็นค่าที่บวกเพิ่มจากค่าของ
ชุดข้อมูลก่อนหน้า
    นอกจากนั้นยังมี GROUPING_CLUSTERED และ GROUPING_PERCENT_STACKED ซึ่งสามารถลองปรับและทำความเข้าใจ
หรือรูปแบบผลลัพธ์เพิ่มเติมได้ และบางค่า ก็ไม่สามารถจะกำหนดได้กับชนิดแผนภูมิ หรืออย่างเช่น ในแผนภูมิวงกลม ก็จะไม่มีการกำหนด
ในส่วนของการจัดกลุ่ม ก็จะใช้ค่าเป้น null แทน ดังนั้นให้เลือกใช้งานให้ถูกต้อง ตามควาามเหมาะสม
// สร้างชุดข้อมูล ที่จะใช้สร้างแผนภูมิ
$series = new DataSeries(
    DataSeries::TYPE_LINECHART, // ประเภทของแผนภูมิ
    DataSeries::GROUPING_STANDARD, // การจัดกลุ่มข้อมูล
    range(0, count($dataSeriesValues) - 1), // ลำดับข้อมูล เรียงจาก array 0 - 2
    $dataSeriesLabels, // ชื่อกำกับชุดข้อมูล
    $xAxisTickValues, // ข้อความสำหรับแกน x
    $dataSeriesValues        // ค่าข้อมูล
    );
// นำชุดข้อมูลไปกำหนดใช้งานในพื้นที่พิกัดของชุดช้อมูล สำหรับสร้างแผนภูมิ
$plotArea = new PlotArea(null, [$series]);
    ต่อจากการกำหนดชุดข้อมูล ก็มาส่วนของการกำหนดข้อความประกอบในส่วนต่างๆ รวมถึงการจัดตำแหน่งข้อความนั้นๆ
// กำหนดคำอธิบายของแผนภูมิ และการจัดตำแหน่งคำอธิบาย
$legend = new Legend(Legend::POSITION_TOP, null, false); // กำหนดตำแหน่งของคำอธิบายชุดข้อมูล
// ตำแหน่งต่างๆ เพิ่มเติม
// https://phpoffice.github.io/PhpSpreadsheet/master/PhpOffice/PhpSpreadsheet/Chart/Legend.html
// POSITION_RIGHT | POSITION_LEFT | POSITION_BOTTOM | POSITION_TOP | POSITION_TOPRIGHT
$title = new Title('ยอดขายสินค้ารายไตรมาส ปี 2016 - 2018'); // หัวข้อแผนภูมิ
// $xAxisLabel = new Title('xxxxx'); // ข้อความอธิบายกำกับแกน X // (ถ้ามี)
$yAxisLabel = new Title('จำนวน (หน่วย:ล้าน)'); // ข้อความอธิบายกำกับแกน Y
    เมื่อกำหนดองค์ประกอบต่างๆ เรียบร้อยแล้ว ก็มาถึงส่วนนำค่าต่างๆ ข้างต้นมาสร้างเป็นแผนภูมิ 
// สร้างแผนภูมิ โดยใช้ค่าต่างๆ จากตัวแปรที่กำหนด
$chart = new Chart(
    'chart1', // กำหนดชื่อ
    $title, // กำหนดชื่อเรื่องหรือหัวข้อกำกับ
    $legend, // ตำแหน่งคำอธิบายของชุดข้อมูล
    $plotArea, // พิกัดพื้นที่ชุดข้อมูล
    true, // กำหนดให้แสดงแผนภูมิ
    0, // กำหนดหากเป็นค่าว่าง ให้ใช้ค่านี้แทน ในที่นี้คือ 0
    null,  // ข้อความอธิบายกำกับแกน X ในที่นี้ไม่มีกำหนด
    $yAxisLabel  // ข้อความอธิบายกำกับแกน Y
    );
    ในขั้นตอนการใช้คำสั่งสร้างแผนภูมินั้น ในบางแผนภูมิ เราอาจจะไม่จำเป็นต้องกำหนดค่าบางค่า เช่น แผนภูมิวงกลม
ที่ไม่มีแกน Y ค่าข้อความกำกับ เราก็จะใช้เป็น null แทน 
    จากนั้นจบด้วย การกำหนดพิกัด cell ที่จะทำการวาดแผนภูมิ รวมถึงการเพิ่ม แผนภูมิเข้าไปในแผ่นงาน
// กำหนดพิกัดมุมบนซ้าย และมุมล่างขวา เป็นพื้นที่สำหรับแสดงแผนภูมิ
$chart->setTopLeftPosition('A7');
$chart->setBottomRightPosition('H20');

// เพิ่มแผนภูมิ ไปในแผ่นงาน
$sheet->addChart($chart);
    และสุดท้าย ก่อนที่จะทำการสร้างไฟล์ Excel เราต้องระบุให้ทำการรวมรูปแผนภูมิเข้าไปในไฟล์ Excel ด้วยคำสั่ง
 
$writer->setIncludeCharts(true); // กำหนดให้มี แผนภูมิในไฟล์ที่สร้าง
    รูปแบบการกำหนด และแนวทางการสร้างแผนภูมิของแต่ละชนิด ก็จะมีการกำหนดค่าแตกต่างกันไปบ้าง สามารถดูตัวอย่างการ
กำหนดเพิ่มเติมได้ที่ ลิ้งค์ด้านล่าง
    https://github.com/PHPOffice/PhpSpreadsheet/tree/master/samples/Chart
 
    เราลองเปลี่ยนชนิดของแผนภูมิ และการจัดกลุมข้อมูล จากโค้ดเดิม ดังนี้
// เปลี่ยนเป็นแผนภูมิแท่ง และแบบ 3 มิติ จ้ดกลุ่มปกติ และจัดกลุ่มแบบต่อกัน
$series = new DataSeries(
    DataSeries::TYPE_BARCHART, // TYPE_BARCHART และ TYPE_BARCHART_3D
    DataSeries::GROUPING_STANDARD, // GROUPING_STANDARD และ GROUPING_STACKED
    range(0, count($dataSeriesValues) - 1), // ลำดับข้อมูล เรียงจาก array 0 - 2
    $dataSeriesLabels, // ชื่อกำกับชุดข้อมูล
    $xAxisTickValues, // ข้อความสำหรับแกน x
    $dataSeriesValues        // ค่าข้อมูล
    );
    ผลลัพธ์ที่ได้ ทั้ง 4 รูปแบบ จะได้เป็นดังนี้
 
 
   
 
 
   
 
 
 
 
    ตัวอย่างชุดข้อมูลและการแสดงแผนภูมิวงกลม
// ชุดตัวแปร array ข้อมูลตัวอย่าง 
$arrayData = [
    ['กิจกรรม', 'ชั่วโมงต่อวัน'],
    ['ทำงาน',     11],
    ['กินอาหาร',      2],
    ['พูดคุยแลกเปลี่ยน',  2],
    ['ดู TV', 2],
    ['นอน',    7]
];

// กำหนดค่าให้กับพิกัด Cell ในรูปแบบข้อมูล array
$sheet->fromArray(
    $arrayData,  // ตัวแปร array ข้อมูล
    NULL,        // ค่าข้อมูลที่ตรงตามค่านี้ จะไม่ถูกำหนด
    'A1',         // จุดพิกัดเริ่มต้น ที่ใช้งานข้อมูล เริ่มทึ่มุมบนซ้าย  หากไม่กำหนดจะเป็น "A1" ค่าเริ่มต้น
    true // มีเพิ่มการกำหนดให้มีการเปรียบข้อมูลที่เป็นค่า null ด้วย หรือก็คือ ถ้ามีค่า null ให้นำมาเปรียบเทียบด้วย
    );

$dataSeriesLabels = []; // เป็นชุดข้อมูลมิติเดียว ค่านี้เป็น array ค่าว่าง
$xAxisTickValues = [  // ส่วนกำหนดพิกัดข้อมูลสำหรับคำอธิบาย
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$A$2:$A$6')
];
$dataSeriesValues = [ // ส่วนของข้อมูลสำหรับสร้างแผนภูมิ
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$B$6')
];

// สร้างชุดข้อมูล ที่จะใช้สร้างแผนภูมิ
$series = new DataSeries(
    DataSeries::TYPE_PIECHART, // ประเภทของแผนภูมิ
    null, // การจัดกลุ่มข้อมูล (แผนภูมิวงกลมไม่มีการจัดกลุ่ม)
    range(0, count($dataSeriesValues) - 1), // ลำดับข้อมูล เรียงจาก array 0 - 2
    $dataSeriesLabels, // ชื่อกำกับชุดข้อมูล
    $xAxisTickValues, // ข้อความสำหรับแกน x
    $dataSeriesValues        // ค่าข้อมูล
    );

// กำหนดกรใช้งาน เลเอาท์ 
$layout = new Layout();
$layout->setShowVal(true); // แสดงค่าข้อมูล
$layout->setShowCatName(true); //  แสดงชื่อกำกับ
$layout->setShowPercent(true);// แสดงค่าเปอร์เซ็นต์

// นำชุดข้อมูลไปกำหนดใช้งานในพื้นที่พิกัดของชุดช้อมูล สำหรับสร้างแผนภูมิ
$plotArea = new PlotArea($layout, [$series]);

// กำหนดคำอธิบายของแผนภูมิ และการจัดตำแหน่งคำอธิบาย
$legend = new Legend(Legend::POSITION_RIGHT, null, false); // กำหนดตำแหน่งของคำอธิบายชุดข้อมูล
$title = new Title('กิจกรรมในแต่ละวันของฉัน'); // หัวข้อแผนภูมิ


// สร้างแผนภูมิ โดยใช้ค่าต่างๆ จากตัวแปรที่กำหนด
$chart = new Chart(
    'chart1', // กำหนดชื่อ
    $title, // กำหนดชื่อเรื่องหรือหัวข้อกำกับ
    $legend, // ตำแหน่งคำอธิบายของชุดข้อมูล
    $plotArea, // พิกัดพื้นที่ชุดข้อมูล
    true, // กำหนดให้แสดงแผนภูมิ
    0, // กำหนดหากเป็นค่าว่าง ให้ใช้ค่านี้แทน ในที่นี้คือ 0
    null,  // ข้อความอธิบายกำกับแกน X ในที่นี้ไม่มีกำหนด
    null  // ข้อความอธิบายกำกับแกน Y ในที่นี้ไม่มีกำหนด
    );

// กำหนดพิกัดมุมบนซ้าย และมุมล่างขวา เป็นพื้นที่สำหรับแสดงแผนภูมิ
$chart->setTopLeftPosition('A8');
$chart->setBottomRightPosition('G22');

// เพิ่มแผนภูมิ ไปในแผ่นงาน
$sheet->addChart($chart);
 
    ผลลัพธ์แผนภูมิวงกลม 
    แบบปกติ และแบบ 3 มิติ โดยเปลี่ยนค่า TYPE_PIECHART เป็น TYPE_PIECHART_3D
 
 
   
 
 
    เนื้อหาเกี่ยวกับการสร้างแผนภูมิใน Excel ไฟล์นี้ เป็นแนวทางเบื้องต้น สามารถนำไปทดสอบและปรับประยุกต์ใช้เพิ่มเติม
ได้ตามต้องการ เนื้อหาตอนหน้าจะเป็นอะไรรอติดตาม


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







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



Tags:: chart phpspreadsheet แผนภูมิ jpgraph







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











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