120

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

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

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

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

4

17 に答える 17

223

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

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

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

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

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

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

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

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

于 2013-05-26T17:46:38.067 に答える
29

@Mark Ba​​ker の投稿に基づく、より柔軟なバリアントを次に示します。

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

お役に立てれば ;)

于 2014-07-07T12:19:51.020 に答える
19
for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}
于 2016-04-28T19:46:50.023 に答える
11

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

$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 );
}
于 2014-08-04T11:00:49.243 に答える
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);
    }
}
于 2016-09-20T11:58:38.357 に答える
2
foreach(range('B','G') as $columnID)
{
    $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}
于 2015-01-12T10:52:43.773 に答える
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」列を簡単に繰り返し渡し、すべての列にオートサイズを設定できます。

于 2016-10-04T22:42:31.143 に答える
0

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

于 2016-10-19T10:37:47.560 に答える
0
$col = 'A';
while(true){
    $tempCol = $col++;
    $objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
    if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
        break;
    }
}
于 2016-08-31T10:51:27.030 に答える
0

これを試してください、私はこのように解決しました。

$Sheet = $excel->getActiveSheet();
$lABC1 = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
$lABC2 = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');

for($I = 0; $I < count($lABC1); $I++):
  $Sheet->getColumnDimension($lABC1[$I])->setAutoSize(true);
  for($J = 0; $J < 6; $J++){
    $Sheet->getColumnDimension($lABC2[$J].$lABC1[$I])->setAutoSize(true);
  }
endfor;
于 2022-01-05T15:55:02.940 に答える