PHPExcel自動サイズ列幅


99

シートの列のサイズを自動調整しようとしています。私はファイルを書き込んでいて、最後にすべての列のサイズを変更しようとしています。

// 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();

上記のコードは機能しません。テキストに合わせて列のサイズを変更しません

UPDATE 私が使用しているライター$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

回答:


193

列がAutoSizeに設定されている場合、PHPExcelは、列の計算値(数式の結果)に基づいて列幅を計算し、1,000区切り記号などのフォーマットマスクによって追加された文字を追加しようとします。

デフォルトでは、これはestimated幅です。GDの使用に基づいて、より正確な計算方法を使用できます。GDは、太字や斜体などのフォントスタイル機能も処理できます。ただし、これははるかに大きなオーバーヘッドであるため、デフォルトではオフになっています。より正確な計算を有効にするには、

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

ただし、自動サイズはすべてのWriter形式に適用されるわけではありません... CSVなど。使用しているライターについては言及しません。

ただし、ディメンションを設定するには列も特定する必要があります。

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

$objPHPExcel->getActiveSheet()->getColumnDimension() 列IDが必要です。

$objPHPExcel->getActiveSheet()->getColumnDimensions()定義されたすべての列次元レコードの配列を返します。ただし、列のディメンションレコードが明示的に作成されていない限り(おそらく、テンプレートを読み込むか、手動でを呼び出すことによってgetColumnDimension())、存在しません(メモリの節約)。


どうもありがとうございます。できます。太字フォントから作成された余分なスペースは計算されませんが、それは予想されます(どこかで読んだことがあります)。回答を更新して、それも含めてください。
Alkis Kalogeris 2013年

1
ボールドやイタリックなどの書体スタイ​​ルでその程度の精度が必要な場合は、PHPExcel_Shared_Font :: AUTOSIZE_METHOD_EXACTを使用する必要がありますが、かなり遅くなります
Mark Ba​​ker

気にしなくても大丈夫です。方法はわかりませんが。Testフォルダーの01simple-download-xls.phpを使用しています。その行はどこに追加しますか?私の完全な初心者のために申し訳ありません。私はそれをいじり始めたばかりです。
Alkis Kalogeris 2013年

2
また、列文字ではなくインデックスで反復したくない場合は、代わりに静的メソッドPHPExcel_Cell :: stringFromColumnIndex($ columnIndex)を使用して列文字を取得できます
MeatPopsicle

@MarkBakerリストで指定された列の幅を設定できるように、単一のステートメントで実行できるメソッドはありますか?現在、$ activeSheetObj-> getColumnDimension( 'G')-> setWidth(35);を使用しています。リストの列はどのような順序でもかまいません。
Rosa Mystica

55

複数のシート、および各シートの複数の列でこれを行う必要がある場合は、すべてのシートを繰り返し処理する方法を次に示します。

// 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);
    }
}

7
それが列過去Z.のための特別な配慮を必要としないので、これは、より良い解決策である
アンソニー・

2
この回答がPhpSpreadSheetでも問題なく機能することを確認できます。トンありがとう!
ヒスバード2018年

22

@Mark Ba​​kerの投稿に基づくより柔軟なバリアントは次のとおりです。

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

お役に立てれば ;)


14
これは、range('A', 'AB')「A」という名前のアイテムを1つだけ返すため、Zまでしか機能しません。したがってrange()、この場合に使用することはお勧めできません。
マイケル

7
これは機能しますが、for($ i = 'A'; $ i!= $ phpExcelObject-> getActiveSheet()-> getHighestColumn(); $ i ++){$ worksheet-> getColumnDimension($ i)-> setAutoSize(TRUE); }
ネイサン

14
for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}

2
良い答えですが、$i <= $objPHPExcel->getActiveSheet()->getHighestColumn()そうでなければ最後の列はサイズ変更されません
Billynoah 2018年

10

これは、ワークシートのすべての列を使用する方法の例です。

$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 );
}

3
それが問題をどのように解決するかを説明するために、回答の前後にいくつかのコンテキストを追加してください
Andrew Stubbs 2014

6

このコードスニペットは、すべてのシートのデータを含むすべての列のサイズを自動調整します。activeSheetのゲッターとセッターを使用する必要はありません。

// 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);
    }
}

6

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);
}

foreach (range('A', $sheet->getHighestDataColumn()) as $column) {$sheet->getColumnDimension($column)->setAutoSize(true);}
ウェズリーアベンフイス

1
@WesleyAbbenhuisコメントは、26列以下の場合にのみ機能します。たとえば、最上位の列が「AH」の場合、範囲関数は正しく機能しません。
Sander Van Keer

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

3

誰かがこれを探していた場合。

以下の解像度PHPSpreadsheetは、新しいバージョンの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);
}

注:または最後の実際の列にgetHighestColumn()置き換えることができgetHighestDataColumn()ます。

これらのメソッドの機能:

getHighestColumn($row = null) -最高のワークシート列を取得します。

getHighestDataColumn($row = null) -データを含む最も高いワークシート列を取得します。

getHighestRow($column = null) -最上位のワークシート行を取得します

getHighestDataRow($column = null) -データを含む最も高いワークシート行を取得します。


2

を使用して反復しようとした場合for ($col = 2; $col <= 'AC'; ++ $col){...}、またはを使用しforeach(range('A','AC') as $col) {...}てAからZまでの列で機能しますが、Zを通過できません(たとえば、「A」から「AC」の間で反復します)。

パス「Z」を反復するには、列を整数に変換し、インクリメントして比較し、再度文字列として取得する必要があります。

$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);
}

これにより、「Z」列を簡単に反復して渡し、すべての列に自動サイズを設定できます。


1

遅くなりますが、どこでも検索した結果、「1つ」のようなソリューションを作成しました。

最後のAPIバージョンには列イテレータがあることはわかっていますが、列オブジェクトを自動調整する方法がわからないため、基本的には、実際に最初に使用された列から実際に最後に使用された列に移動するループを作成しました。

ここに行く:

//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

ディメンションを設定するには、列を識別する必要もあります。

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

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

5
回答を再フォーマットして、これについて考えてください。適切な回答には、OPだけでなく、SOの将来のビジターのために、何が行われたか、なぜそのように行われたのかについての説明が常にあります。
B001ᛦ2016

1

Spreedsheet + PHP 7の場合はPHPExcel_Cell::columnIndexFromString、の代わりに記述する必要があります\PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString。そしてループは間違いであり、そこで<作業してはいけません<=。そうでなければ、彼は列をループに入れすぎます。


1
// Auto-size columns for all worksheets
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
    foreach ($worksheet->getColumnIterator() as $column) {
        $worksheet
            ->getColumnDimension($column->getColumnIndex())
            ->setAutoSize(true);
    } 
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.