web-dev-qa-db-ja.com

PHPExcel自動サイズ列幅

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

// 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');を使用しているライター

88
alkis

列がAutoSizeに設定されている場合、PHPExcelは列の計算値に基づいて列の幅を計算しようとします(したがって、式の結果に基づいて)。

デフォルトでは、これは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()を呼び出すなど)、存在しません(メモリの節約)。

178
Mark Baker

複数のシート、および各シートの複数の列でそれを行う必要がある場合、すべてのシートを反復処理する方法は次のとおりです。

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

@Mark Ba​​kerの投稿に基づく、より柔軟なバリアント:

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

お役に立てれば ;)

15
Todor Todorov

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

$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
for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}
9
Nathan

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

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

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

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

以下の解決策は、PHPExcelの新しいバージョンであるPHPSpreadsheetでも機能します。

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

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」列を簡単に繰り返し渡し、すべての列に自動サイズを設定します。

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

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

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

遅くなりますが、どこでも検索した後、「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
Lightworker

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

1
GSI One