Пример #1
0
 /**
  * Calculate widths for auto-size columns
  *
  * @param  boolean  $calculateMergeCells  Calculate merge cell width
  * @return Worksheet;
  */
 public function calculateColumnWidths($calculateMergeCells = false)
 {
     // initialize $autoSizes array
     $autoSizes = array();
     foreach ($this->getColumnDimensions() as $colDimension) {
         if ($colDimension->getAutoSize()) {
             $autoSizes[$colDimension->getColumnIndex()] = -1;
         }
     }
     // There is only something to do if there are some auto-size columns
     if (!empty($autoSizes)) {
         // build list of cells references that participate in a merge
         $isMergeCell = array();
         foreach ($this->getMergeCells() as $cells) {
             foreach (Cell::extractAllCellReferencesInRange($cells) as $cellReference) {
                 $isMergeCell[$cellReference] = true;
             }
         }
         // loop through all cells in the worksheet
         foreach ($this->getCellCollection(false) as $cellID) {
             $cell = $this->getCell($cellID, false);
             if ($cell !== null && isset($autoSizes[$this->cellCollection->getCurrentColumn()])) {
                 // Determine width if cell does not participate in a merge
                 if (!isset($isMergeCell[$this->cellCollection->getCurrentAddress()])) {
                     // Calculated value
                     // To formatted string
                     $cellValue = Style\NumberFormat::toFormattedString($cell->getCalculatedValue(), $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode());
                     $autoSizes[$this->cellCollection->getCurrentColumn()] = max((double) $autoSizes[$this->cellCollection->getCurrentColumn()], (double) Shared\Font::calculateColumnWidth($this->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont(), $cellValue, $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getAlignment()->getTextRotation(), $this->getDefaultStyle()->getFont()));
                 }
             }
         }
         // adjust column widths
         foreach ($autoSizes as $columnIndex => $width) {
             if ($width == -1) {
                 $width = $this->getDefaultColumnDimension()->getWidth();
             }
             $this->getColumnDimension($columnIndex)->setWidth($width);
         }
     }
     return $this;
 }