Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.

Differences Between: [Versions 401 and 402]

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
   4  
   5  use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
   6  use PhpOffice\PhpSpreadsheet\Reader\Xlsx\Namespaces;
   7  use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
   8  use PhpOffice\PhpSpreadsheet\Worksheet\Table as WorksheetTable;
   9  
  10  class Table extends WriterPart
  11  {
  12      /**
  13       * Write Table to XML format.
  14       *
  15       * @param int $tableRef Table ID
  16       *
  17       * @return string XML Output
  18       */
  19      public function writeTable(WorksheetTable $table, $tableRef): string
  20      {
  21          // Create XML writer
  22          $objWriter = null;
  23          if ($this->getParentWriter()->getUseDiskCaching()) {
  24              $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
  25          } else {
  26              $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
  27          }
  28  
  29          // XML header
  30          $objWriter->startDocument('1.0', 'UTF-8', 'yes');
  31  
  32          // Table
  33          $name = 'Table' . $tableRef;
  34          $range = $table->getRange();
  35  
  36          $objWriter->startElement('table');
  37          $objWriter->writeAttribute('xml:space', 'preserve');
  38          $objWriter->writeAttribute('xmlns', Namespaces::MAIN);
  39          $objWriter->writeAttribute('id', (string) $tableRef);
  40          $objWriter->writeAttribute('name', $name);
  41          $objWriter->writeAttribute('displayName', $table->getName() ?: $name);
  42          $objWriter->writeAttribute('ref', $range);
  43          $objWriter->writeAttribute('headerRowCount', $table->getShowHeaderRow() ? '1' : '0');
  44          $objWriter->writeAttribute('totalsRowCount', $table->getShowTotalsRow() ? '1' : '0');
  45  
  46          // Table Boundaries
  47          [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($table->getRange());
  48  
  49          // Table Auto Filter
  50          if ($table->getShowHeaderRow() && $table->getAllowFilter() === true) {
  51              $objWriter->startElement('autoFilter');
  52              $objWriter->writeAttribute('ref', $range);
  53              $objWriter->endElement();
  54              foreach (range($rangeStart[0], $rangeEnd[0]) as $offset => $columnIndex) {
  55                  $column = $table->getColumnByOffset($offset);
  56  
  57                  if (!$column->getShowFilterButton()) {
  58                      $objWriter->startElement('filterColumn');
  59                      $objWriter->writeAttribute('colId', (string) $offset);
  60                      $objWriter->writeAttribute('hiddenButton', '1');
  61                      $objWriter->endElement();
  62                  } else {
  63                      $column = $table->getAutoFilter()->getColumnByOffset($offset);
  64                      AutoFilter::writeAutoFilterColumn($objWriter, $column, $offset);
  65                  }
  66              }
  67          }
  68  
  69          // Table Columns
  70          $objWriter->startElement('tableColumns');
  71          $objWriter->writeAttribute('count', (string) ($rangeEnd[0] - $rangeStart[0] + 1));
  72          foreach (range($rangeStart[0], $rangeEnd[0]) as $offset => $columnIndex) {
  73              $worksheet = $table->getWorksheet();
  74              if (!$worksheet) {
  75                  continue;
  76              }
  77  
  78              $column = $table->getColumnByOffset($offset);
  79              $cell = $worksheet->getCell([$columnIndex, $rangeStart[1]]);
  80  
  81              $objWriter->startElement('tableColumn');
  82              $objWriter->writeAttribute('id', (string) ($offset + 1));
  83              $objWriter->writeAttribute('name', $table->getShowHeaderRow() ? $cell->getValue() : 'Column' . ($offset + 1));
  84  
  85              if ($table->getShowTotalsRow()) {
  86                  if ($column->getTotalsRowLabel()) {
  87                      $objWriter->writeAttribute('totalsRowLabel', $column->getTotalsRowLabel());
  88                  }
  89                  if ($column->getTotalsRowFunction()) {
  90                      $objWriter->writeAttribute('totalsRowFunction', $column->getTotalsRowFunction());
  91                  }
  92              }
  93              if ($column->getColumnFormula()) {
  94                  $objWriter->writeElement('calculatedColumnFormula', $column->getColumnFormula());
  95              }
  96  
  97              $objWriter->endElement();
  98          }
  99          $objWriter->endElement();
 100  
 101          // Table Styles
 102          $objWriter->startElement('tableStyleInfo');
 103          $objWriter->writeAttribute('name', $table->getStyle()->getTheme());
 104          $objWriter->writeAttribute('showFirstColumn', $table->getStyle()->getShowFirstColumn() ? '1' : '0');
 105          $objWriter->writeAttribute('showLastColumn', $table->getStyle()->getShowLastColumn() ? '1' : '0');
 106          $objWriter->writeAttribute('showRowStripes', $table->getStyle()->getShowRowStripes() ? '1' : '0');
 107          $objWriter->writeAttribute('showColumnStripes', $table->getStyle()->getShowColumnStripes() ? '1' : '0');
 108          $objWriter->endElement();
 109  
 110          $objWriter->endElement();
 111  
 112          // Return
 113          return $objWriter->getData();
 114      }
 115  }