シートの列のサイズを自動調整しようとしています。 ファイルを書いていて、最後にすべての列のサイズを変更しようとしています。
// 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');
.
列のサイズが AutoSize に設定されている場合、PHPExcel は列の計算値 (計算式の結果) と、千区切りなどのフォーマットマスクによって追加された文字に基づいて列幅を計算しようと試みます。
デフォルトでは、この幅は estimated
です。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() `を呼んで)明確に作成されていなければ、それは存在しないだろう(メモリ節約)。
複数のシート、および各シートの複数の列でそれを行う必要がある場合は、それらすべてを反復する方法を次に示します。
// 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);
}
}
これは、ワークシートのすべての列を使用する方法についての例です:
$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 );
}
このコードスニペットは、すべてのシートにデータを含むすべての列を自動サイズ設定します。 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);
}
}
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);
}
誰かがこれを探していた場合。
以下の解像度は、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)
-データを含む最高のワークシート行を取得します。
for($ col = 2; $ col< = 'AC'; ++ $ col){で反復しようとすると。..}
、または foreach(range( 'A'、 'AC')を$ colとして){。..}
AからZまでの列で機能しますが、Zを通過できません(Ex。 「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」列を通過し、すべての列に自動設定を設定できます。
また、ディメンションを設定するための列を特定する必要があります。
foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
$phpExcelObject
->getActiveSheet()
->getColumnDimension($col)
->setAutoSize(true);
}
遅くなりますが、どこでも検索した後、「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');
$col = 'A';
while(true){
$tempCol = $col++;
$objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
break;
}
}