mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-08-27 18:48:36 +00:00
29c0162e2a
* Let Phpstan Run on Samples Phpstan currently analyzes all source and test members. We already run phpcs and php-cs-fixer on samples as well. I would expect that samples are often used as templates for code in userland; it behooves us to be at least as careful with those members as for the others which are already being analyzed. Aside from 1300+ messages `Variable $helper might not be defined.`, which will be suppressed in phpstan.neon.dist, there are really only a few changes needed for sample members, so that part of the code base was already in good shape, and is now even better. No annotations were needed. * Scrutinizer 2 out of 3 1 false positive, now suppressed; fix other 2. * Remove Dead Code * Very Minor Changes * Add infra
79 lines
2.7 KiB
PHP
79 lines
2.7 KiB
PHP
<?php
|
|
|
|
use PhpOffice\PhpSpreadsheet\NamedRange;
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
|
|
require_once __DIR__ . '/../Header.php';
|
|
|
|
$spreadsheet = new Spreadsheet();
|
|
$worksheet = $spreadsheet->setActiveSheetIndex(0);
|
|
$worksheet->setTitle('Base Data');
|
|
|
|
// Set up some basic data for a timesheet
|
|
$worksheet
|
|
->setCellValue('A1', 'Charge Rate/hour:')
|
|
->setCellValue('B1', '7.50');
|
|
|
|
// Define a global named range on the first worksheet for our Charge Rate
|
|
// CHARGE_RATE is an absolute cell reference that always points to cell B1
|
|
// Because it is defined globally, it will still be usable from any worksheet in the spreadsheet
|
|
$spreadsheet->addNamedRange(new NamedRange('CHARGE_RATE', $worksheet, '=$B$1'));
|
|
|
|
// Create a second worksheet as our client timesheet
|
|
$worksheet = $spreadsheet->addSheet(new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, 'Client Timesheet'));
|
|
|
|
// Define named ranges
|
|
// HOURS_PER_DAY is a relative cell reference that always points to column B, but to a cell in the row where it is used
|
|
$spreadsheet->addNamedRange(new NamedRange('HOURS_PER_DAY', $worksheet, '=$B1'));
|
|
|
|
// Set up some basic data for a timesheet
|
|
$worksheet
|
|
->setCellValue('A1', 'Date')
|
|
->setCellValue('B1', 'Hours')
|
|
->setCellValue('C1', 'Charge');
|
|
|
|
$workHours = [
|
|
'2020-0-06' => 7.5,
|
|
'2020-0-07' => 7.25,
|
|
'2020-0-08' => 6.5,
|
|
'2020-0-09' => 7.0,
|
|
'2020-0-10' => 5.5,
|
|
];
|
|
|
|
// Populate the Timesheet
|
|
$startRow = 2;
|
|
$row = $startRow;
|
|
foreach ($workHours as $date => $hours) {
|
|
$worksheet
|
|
->setCellValue("A{$row}", $date)
|
|
->setCellValue("B{$row}", $hours)
|
|
->setCellValue("C{$row}", '=HOURS_PER_DAY*CHARGE_RATE');
|
|
++$row;
|
|
}
|
|
$endRow = $row - 1;
|
|
|
|
// COLUMN_TOTAL is another relative cell reference that always points to the same range of rows but to cell in the column where it is used
|
|
$spreadsheet->addNamedRange(new NamedRange('COLUMN_DATA_VALUES', $worksheet, "=A\${$startRow}:A\${$endRow}"));
|
|
|
|
++$row;
|
|
$worksheet
|
|
->setCellValue("B{$row}", '=SUM(COLUMN_DATA_VALUES)')
|
|
->setCellValue("C{$row}", '=SUM(COLUMN_DATA_VALUES)');
|
|
|
|
$range = $spreadsheet->getNamedRange('CHARGE_RATE');
|
|
if ($range === null || $range->getWorksheet() === null) {
|
|
throw new Exception('expected named range not found');
|
|
}
|
|
$chargeRateCellValue = $spreadsheet
|
|
->getSheetByNameOrThrow($range->getWorksheet()->getTitle())
|
|
->getCell($range->getCellsInRange()[0])->getValue();
|
|
|
|
$helper->log(sprintf(
|
|
'Worked %.2f hours at a rate of %s - Charge to the client is %.2f',
|
|
$worksheet->getCell("B{$row}")->getCalculatedValue(),
|
|
$chargeRateCellValue,
|
|
$worksheet->getCell("C{$row}")->getCalculatedValue()
|
|
));
|
|
|
|
$helper->write($spreadsheet, __FILE__, ['Xlsx']);
|