Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 401 and 402] [Versions 401 and 403]

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