ScopedNamedRange2.php 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. $clients = [
  8. 'Client #1 - Full Hourly Rate' => [
  9. '2020-0-06' => 2.5,
  10. '2020-0-07' => 2.25,
  11. '2020-0-08' => 6.0,
  12. '2020-0-09' => 3.0,
  13. '2020-0-10' => 2.25,
  14. ],
  15. 'Client #2 - Full Hourly Rate' => [
  16. '2020-0-06' => 1.5,
  17. '2020-0-07' => 2.75,
  18. '2020-0-08' => 0.0,
  19. '2020-0-09' => 4.5,
  20. '2020-0-10' => 3.5,
  21. ],
  22. 'Client #3 - Reduced Hourly Rate' => [
  23. '2020-0-06' => 3.5,
  24. '2020-0-07' => 2.5,
  25. '2020-0-08' => 1.5,
  26. '2020-0-09' => 0.0,
  27. '2020-0-10' => 1.25,
  28. ],
  29. ];
  30. foreach ($clients as $clientName => $workHours) {
  31. $worksheet = $spreadsheet->addSheet(new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, $clientName));
  32. // Set up some basic data for a timesheet
  33. $worksheet
  34. ->setCellValue('A1', 'Charge Rate/hour:')
  35. ->setCellValue('B1', '7.50')
  36. ->setCellValue('A3', 'Date')
  37. ->setCellValue('B3', 'Hours')
  38. ->setCellValue('C3', 'Charge');
  39. // Define named ranges
  40. // CHARGE_RATE is an absolute cell reference that always points to cell B1
  41. $spreadsheet->addNamedRange(new NamedRange('CHARGE_RATE', $worksheet, '=$B$1', true));
  42. // 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
  43. $spreadsheet->addNamedRange(new NamedRange('HOURS_PER_DAY', $worksheet, '=$B1', true));
  44. // Populate the Timesheet
  45. $startRow = 4;
  46. $row = $startRow;
  47. foreach ($workHours as $date => $hours) {
  48. $worksheet
  49. ->setCellValue("A{$row}", $date)
  50. ->setCellValue("B{$row}", $hours)
  51. ->setCellValue("C{$row}", '=HOURS_PER_DAY*CHARGE_RATE');
  52. ++$row;
  53. }
  54. $endRow = $row - 1;
  55. // 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
  56. $spreadsheet->addNamedRange(new NamedRange('COLUMN_TOTAL', $worksheet, "=A\${$startRow}:A\${$endRow}", true));
  57. ++$row;
  58. $worksheet
  59. ->setCellValue("B{$row}", '=SUM(COLUMN_TOTAL)')
  60. ->setCellValue("C{$row}", '=SUM(COLUMN_TOTAL)');
  61. }
  62. $spreadsheet->removeSheetByIndex(0);
  63. // Set the reduced charge rate for our special client
  64. $worksheet
  65. ->setCellValue('B1', 4.5);
  66. foreach ($spreadsheet->getAllSheets() as $worksheet) {
  67. $helper->log(sprintf(
  68. 'Worked %.2f hours for "%s" at a rate of %.2f - Charge to the client is %.2f',
  69. $worksheet->getCell("B{$row}")->getCalculatedValue(),
  70. $worksheet->getTitle(),
  71. $worksheet->getCell('B1')->getValue(),
  72. $worksheet->getCell("C{$row}")->getCalculatedValue()
  73. ));
  74. }
  75. $worksheet = $spreadsheet->setActiveSheetIndex(0);
  76. $helper->write($spreadsheet, __FILE__, ['Xlsx']);