it-swarm.com.de

PHPExcel Auto Size Spaltenbreite

Ich versuche, die Spalten meines Arbeitsblatts automatisch in der Größe anzupassen. Ich schreibe die Datei und versuche am Ende, die Größe aller meiner Spalten zu ändern.

// Add some data
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('B1', 'test1111111111111111111111')
            ->setCellValue('C1', 'test1111111111111')
            ->setCellValue('D1', 'test1111111')
            ->setCellValue('E1', 'test11111')
            ->setCellValue('F1', 'test1')
            ->setCellValue('G1', 'test1');

foreach($objPHPExcel->getActiveSheet()->getColumnDimension() as $col) {
    $col->setAutoSize(true);
}
$objPHPExcel->getActiveSheet()->calculateColumnWidths();

Der obige Code funktioniert nicht. Ändert die Spaltengröße nicht so, dass sie zum Text passt

UPDATE Der Autor, den ich verwende $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

92
alkis

Wenn eine Spalte auf AutoSize gesetzt ist, versucht PHPExcel, die Spaltenbreite basierend auf dem berechneten Wert der Spalte (also auf dem Ergebnis von Formeln) und allen zusätzlichen Zeichen zu berechnen, die durch Formatmasken wie Tausendertrennzeichen hinzugefügt wurden.

Standardmäßig ist dies eine estimated Breite: Es ist eine genauere Berechnungsmethode verfügbar, die auf der Verwendung von Gd basiert und auch Schriftstilfunktionen wie Fett und Kursiv verarbeitet. Dies ist jedoch ein viel größerer Overhead, so dass es standardmäßig deaktiviert ist. Sie können die genauere Berechnung mit aktivieren

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

Die automatische Größe gilt jedoch nicht für alle Writer-Formate, z. B. CSV. Sie erwähnen nicht, welchen Schriftsteller Sie verwenden.

Sie müssen jedoch auch die Spalten identifizieren, um die Dimensionen festzulegen:

foreach(range('B','G') as $columnID) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)
        ->setAutoSize(true);
}

$objPHPExcel->getActiveSheet()->getColumnDimension() erwartet eine Spalten-ID.

$objPHPExcel->getActiveSheet()->getColumnDimensions() gibt ein Array aller definierten Spaltendimensionsdatensätze zurück. Aber wenn ein Spaltendimensionsdatensatz nicht explizit erstellt wurde (z. B. durch Laden einer Vorlage oder durch manuellen Aufruf von getColumnDimension()), ist er nicht vorhanden (Speichersparen).

181
Mark Baker

Wenn Sie dies für mehrere Blätter und mehrere Spalten in jedem Blatt tun müssen, können Sie die folgenden Schritte ausführen:

// Auto size columns for each worksheet
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {

    $objPHPExcel->setActiveSheetIndex($objPHPExcel->getIndex($worksheet));

    $sheet = $objPHPExcel->getActiveSheet();
    $cellIterator = $sheet->getRowIterator()->current()->getCellIterator();
    $cellIterator->setIterateOnlyExistingCells(true);
    /** @var PHPExcel_Cell $cell */
    foreach ($cellIterator as $cell) {
        $sheet->getColumnDimension($cell->getColumn())->setAutoSize(true);
    }
}
46
MrUpsidown

Hier eine flexiblere Variante basierend auf @Mark Baker Post:

foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
        $phpExcelObject->getActiveSheet()
                ->getColumnDimension($col)
                ->setAutoSize(true);
    } 

Hoffe das hilft ;)

16
Todor Todorov
for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}
10
Nathan

Dies ist ein Beispiel für die Verwendung aller Spalten aus dem Arbeitsblatt:

$sheet = $PHPExcel->getActiveSheet();
$cellIterator = $sheet->getRowIterator()->current()->getCellIterator();
$cellIterator->setIterateOnlyExistingCells( true );
/** @var PHPExcel_Cell $cell */
foreach( $cellIterator as $cell ) {
        $sheet->getColumnDimension( $cell->getColumn() )->setAutoSize( true );
}
9
dmi3x

Mit diesem Code-Snippet werden alle Spalten, die Daten in allen Arbeitsblättern enthalten, automatisch in der Größe angepasst. ActiveSheet Getter und Setter müssen nicht verwendet werden.

// In my case this line didn't make much of a difference
PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);
// Iterating all the sheets
/** @var PHPExcel_Worksheet $sheet */
foreach ($objPHPExcel->getAllSheets() as $sheet) {
    // Iterating through all the columns
    // The after Z column problem is solved by using numeric columns; thanks to the columnIndexFromString method
    for ($col = 0; $col <= PHPExcel_Cell::columnIndexFromString($sheet->getHighestDataColumn()); $col++) {
        $sheet->getColumnDimensionByColumn($col)->setAutoSize(true);
    }
}
5
Ronnie

für phpspreadsheet:

$sheet = $spreadsheet->getActiveSheet(); // $spreadsheet is instance of PhpOffice\PhpSpreadsheet\Spreadsheet

foreach (
    range(
         1, 
         Coordinate::columnIndexFromString($sheet->getHighestColumn(1))
    ) as $column
) {
    $sheet
          ->getColumnDimension(Coordinate::stringFromColumnIndex($column))
          ->setAutoSize(true);
}
5
beck kuo
foreach(range('B','G') as $columnID)
{
    $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}
3
Sadikhasan

Für den Fall, dass jemand danach sucht.

Die folgende Auflösung funktioniert auch für PHPSpreadsheet, die neue Version von PHPExcel.

// assuming $spreadsheet is instance of PhpOffice\PhpSpreadsheet\Spreadsheet
// assuming $worksheet = $spreadsheet->getActiveSheet();
foreach(range('A',$worksheet->getHighestColumn()) as $column) {
    $spreadsheet->getColumnDimension($column)->setAutoSize(true);
}

Hinweis: getHighestColumn() kann durch getHighestDataColumn() oder die letzte tatsächliche Spalte ersetzt werden.

Was diese Methoden bewirken:

getHighestColumn($row = null) - Ermittelt die höchste Arbeitsblattspalte.

getHighestDataColumn($row = null) - Ermittelt die höchste Arbeitsblattspalte, die Daten enthält.

getHighestRow($column = null) - Ermittelt die höchste Arbeitsblattzeile

getHighestDataRow($column = null) - Ermittelt die höchste Arbeitsblattzeile, die Daten enthält.

2
Gabi Dj

Wenn Sie versuchen, mit for ($col = 2; $col <= 'AC'; ++ $col){...} oder mit foreach(range('A','AC') as $col) {...} zu iterieren, funktioniert dies für Spalten von A bis Z, aber die Übergabe von Z schlägt fehl (z. B. zwischen 'A' und 'AC' iterieren) ').

Um die Übergabe von 'Z' zu wiederholen, müssen Sie die Spalte in eine Ganzzahl konvertieren, inkrementieren, vergleichen und erneut als Zeichenfolge abrufen:

$MAX_COL = $sheet->getHighestDataColumn();
$MAX_COL_INDEX = PHPExcel_Cell::columnIndexFromString($MAX_COL);
    for($index=0 ; $index <= $MAX_COL_INDEX ; $index++){
    $col = PHPExcel_Cell::stringFromColumnIndex($index);

    // do something, like set the column width...
    $sheet->getColumnDimension($col)->setAutoSize(TRUE);
}

Mit dieser Funktion können Sie die 'Z'-Spalte einfach durchlaufen und die automatische Größe für jede Spalte festlegen.

2
Alejandro Silva
$col = 'A';
while(true){
    $tempCol = $col++;
    $objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
    if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
        break;
    }
}
1

sie müssen auch die Spalten identifizieren, um die Dimensionen festzulegen:

foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
$phpExcelObject
        ->getActiveSheet()
        ->getColumnDimension($col)
        ->setAutoSize(true);
}
1
Bhavik Hirani

Komm zu spät, aber nachdem ich überall gesucht habe, habe ich eine Lösung geschaffen, die "die eine" zu sein scheint.

Da ich weiß, dass es in den letzten API-Versionen einen Spalteniterator gibt, aber nicht weiß, wie man das Spaltenobjekt selbst anpasst, habe ich eine Schleife erstellt, um von der ersten Spalte zur letzten Spalte zu wechseln.

Hier kommt's:

//Just before saving de Excel document, you do this:

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

//We get the util used space on worksheet. Change getActiveSheet to setActiveSheetIndex(0) to choose the sheet you want to autosize. Iterate thorugh'em if needed.
//We remove all digits from this string, which cames in a form of "A1:G24".
//Exploding via ":" to get a 2 position array being 0 fisrt used column and 1, the last used column.
$cols = explode(":", trim(preg_replace('/\d+/u', '', $objPHPExcel->getActiveSheet()->calculateWorksheetDimension())));

$col = $cols[0]; //first util column with data
$end = ++$cols[1]; //last util column with data +1, to use it inside the WHILE loop. Else, is not going to use last util range column.
while($col != $end){
    $objPHPExcel->getActiveSheet()->getColumnDimension($col)->setAutoSize(true);

    $col++;
}

//Saving.
$objWriter->save('php://output');
1
Lightworker

Für Spreedsheet + PHP 7, müssen Sie anstelle von PHPExcel_Cell::columnIndexFromString, \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString Schreiben. Und in der Schleife ist ein Fehler, dort müssen Sie < nicht mit <= arbeiten, sonst zieht er eine Spalte zu weit in die Schleife.

1
GSI One