AutoFit.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheet\Worksheet;
  3. use PhpOffice\PhpSpreadsheet\Cell\CellAddress;
  4. use PhpOffice\PhpSpreadsheet\Cell\CellRange;
  5. use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
  6. class AutoFit
  7. {
  8. protected Worksheet $worksheet;
  9. public function __construct(Worksheet $worksheet)
  10. {
  11. $this->worksheet = $worksheet;
  12. }
  13. public function getAutoFilterIndentRanges(): array
  14. {
  15. $autoFilterIndentRanges = [];
  16. $autoFilterIndentRanges[] = $this->getAutoFilterIndentRange($this->worksheet->getAutoFilter());
  17. foreach ($this->worksheet->getTableCollection() as $table) {
  18. /** @var Table $table */
  19. if ($table->getShowHeaderRow() === true && $table->getAllowFilter() === true) {
  20. $autoFilter = $table->getAutoFilter();
  21. if ($autoFilter !== null) {
  22. $autoFilterIndentRanges[] = $this->getAutoFilterIndentRange($autoFilter);
  23. }
  24. }
  25. }
  26. return array_filter($autoFilterIndentRanges);
  27. }
  28. private function getAutoFilterIndentRange(AutoFilter $autoFilter): ?string
  29. {
  30. $autoFilterRange = $autoFilter->getRange();
  31. $autoFilterIndentRange = null;
  32. if (!empty($autoFilterRange)) {
  33. $autoFilterRangeBoundaries = Coordinate::rangeBoundaries($autoFilterRange);
  34. $autoFilterIndentRange = (string) new CellRange(
  35. CellAddress::fromColumnAndRow($autoFilterRangeBoundaries[0][0], $autoFilterRangeBoundaries[0][1]),
  36. CellAddress::fromColumnAndRow($autoFilterRangeBoundaries[1][0], $autoFilterRangeBoundaries[0][1])
  37. );
  38. }
  39. return $autoFilterIndentRange;
  40. }
  41. }