ScopedNamedRange.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. use PhpOffice\PhpSpreadsheet\NamedRange;
  3. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  4. require_once __DIR__ . '/../Header.php';
  5. $spreadsheet = new Spreadsheet();
  6. $worksheet = $spreadsheet->setActiveSheetIndex(0);
  7. $worksheet->setTitle('Base Data');
  8. // Set up some basic data for a timesheet
  9. $worksheet
  10. ->setCellValue('A1', 'Charge Rate/hour:')
  11. ->setCellValue('B1', '7.50');
  12. // Define a global named range on the first worksheet for our Charge Rate
  13. // CHARGE_RATE is an absolute cell reference that always points to cell B1
  14. // Because it is defined globally, it will still be usable from any worksheet in the spreadsheet
  15. $spreadsheet->addNamedRange(new NamedRange('CHARGE_RATE', $worksheet, '=$B$1'));
  16. // Create a second worksheet as our client timesheet
  17. $worksheet = $spreadsheet->addSheet(new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, 'Client Timesheet'));
  18. // Define named ranges
  19. // 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
  20. $spreadsheet->addNamedRange(new NamedRange('HOURS_PER_DAY', $worksheet, '=$B1'));
  21. // Set up some basic data for a timesheet
  22. $worksheet
  23. ->setCellValue('A1', 'Date')
  24. ->setCellValue('B1', 'Hours')
  25. ->setCellValue('C1', 'Charge');
  26. $workHours = [
  27. '2020-0-06' => 7.5,
  28. '2020-0-07' => 7.25,
  29. '2020-0-08' => 6.5,
  30. '2020-0-09' => 7.0,
  31. '2020-0-10' => 5.5,
  32. ];
  33. // Populate the Timesheet
  34. $startRow = 2;
  35. $row = $startRow;
  36. foreach ($workHours as $date => $hours) {
  37. $worksheet
  38. ->setCellValue("A{$row}", $date)
  39. ->setCellValue("B{$row}", $hours)
  40. ->setCellValue("C{$row}", '=HOURS_PER_DAY*CHARGE_RATE');
  41. ++$row;
  42. }
  43. $endRow = $row - 1;
  44. // 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
  45. $spreadsheet->addNamedRange(new NamedRange('COLUMN_DATA_VALUES', $worksheet, "=A\${$startRow}:A\${$endRow}"));
  46. ++$row;
  47. $worksheet
  48. ->setCellValue("B{$row}", '=SUM(COLUMN_DATA_VALUES)')
  49. ->setCellValue("C{$row}", '=SUM(COLUMN_DATA_VALUES)');
  50. $helper->log(sprintf(
  51. 'Worked %.2f hours at a rate of %s - Charge to the client is %.2f',
  52. $worksheet->getCell("B{$row}")->getCalculatedValue(),
  53. $chargeRateCellValue = $spreadsheet
  54. ->getSheetByName($spreadsheet->getNamedRange('CHARGE_RATE')->getWorksheet()->getTitle())
  55. ->getCell($spreadsheet->getNamedRange('CHARGE_RATE')->getCellsInRange()[0])->getValue(),
  56. $worksheet->getCell("C{$row}")->getCalculatedValue()
  57. ));
  58. $helper->write($spreadsheet, __FILE__, ['Xlsx']);