PHPExcelを使用して、ダウンロード用にデータをエクスポートしています。ダウンロードしたファイルを開いて、セルに大きな番号がある場合、値番号の代わりに「#######」が表示されます。すべての列に対してsetAutoSize()
を試してから$sheet->calculateColumnWidths()
を呼び出しましたが、それでも変わりません。 calculateColumnWidths() at at 、@ Mark Bakerは「calculateColumnWidths()はおそらく5%だけ値を増やして、列全体が収まるようにします」と言います。セル内の数値の長さが5%を超える場合、doenが問題を解決したようです
[〜#〜] update [〜#〜]これは、列のサイズを自動調整する私の機能です。
function autoFitColumnWidthToContent($sheet, $fromCol, $toCol) {
if (empty($toCol) ) {//not defined the last column, set it the max one
$toCol = $sheet->getColumnDimension($sheet->getHighestColumn())->getColumnIndex();
}
for($i = $fromCol; $i <= $toCol; $i++) {
$sheet->getColumnDimension($i)->setAutoSize(true);
}
$sheet->calculateColumnWidths();
}
最初の潜在的な問題は、列文字を使用していることです。 PHPのインクリメンター操作は列文字で動作します。したがって、$ iが「A」の場合、$ i ++は「B」を返し、$ iが「Z」の場合、$ i ++は「AA」を返します。しかし、比較として<=を使用することはできません。「AA」は単純な比較として実行されると<=「Z」です。
の代わりに
for($i = $fromCol; $i <= $toCol; $i++) {
使用する
$toCol++;
for($i = $fromCol; $i !== $toCol; $i++) {
$ sheet-> calculateColumnWidths()を呼び出した後に5%のマージンを追加するには、次のようにします。
for($i = $fromCol; $i !== $toCol; $i++) {
$calculatedWidth = $sheet->getColumnDimension($i)->getWidth();
$sheet->getColumnDimension($i)->setWidth((int) $calculatedWidth * 1.05);
}
提案はどれもうまくいきませんでしたので、手動計算を行い(かなり簡単で高速)(サンプルコードが続きます)、完全に動作します(フォント/スタイルはデフォルトですが、他のフォントやスタイルに合わせて調整するのは簡単です)
foreach((array)$data as $sheet_data)
{
$maxwidth = array( );
$objPHPExcel->setActiveSheetIndex( $i++ );
$sheet = $objPHPExcel->getActiveSheet( );
if ( !empty($sheet_data['title']) )
$sheet->setTitle($sheet_data['title']);
if ( !empty($sheet_data['rows']) )
{
foreach((array)$sheet_data['rows'] as $row=>$cols)
{
foreach((array)$cols as $col=>$val)
{
$p = strpos($col,':');
if ( false !== $p )
{
// range
$range = $col; $xy = substr( $col, 0, $p );
$col = substr($xy,0,-1);
// estimate maximum column width by number of characters
$w = mb_strlen( $val );
if ( !isset($maxwidth[$col]) ) $maxwidth[$col] = $w;
elseif ( $w > $maxwidth[$col] ) $maxwidth[$col] = $w;
$sheet->mergeCells( $range );
$sheet->setCellValue( $xy, $val );
$sheet->getStyle( $range )
->getAlignment( )
->setHorizontal( PHPExcel_Style_Alignment::HORIZONTAL_CENTER )
->setVertical( PHPExcel_Style_Alignment::VERTICAL_CENTER )
;
}
else
{
$xy = $col.$row;
// estimate maximum column width by number of characters
$w = mb_strlen( $val );
if ( !isset($maxwidth[$col]) ) $maxwidth[$col] = $w;
elseif ( $w > $maxwidth[$col] ) $maxwidth[$col] = $w;
$sheet->setCellValue( $xy, $val );
$sheet->getStyle( $xy )
->getAlignment( )
->setHorizontal( PHPExcel_Style_Alignment::HORIZONTAL_CENTER )
->setVertical( PHPExcel_Style_Alignment::VERTICAL_CENTER )
;
}
}
}
}
// autosize columns based on calculation + some padding
foreach($maxwidth as $col=>$width)
{
$sheet->getColumnDimension( $col )->setAutoSize( false );
$sheet->getColumnDimension( $col )->setWidth( (int)($width * 1.2) ); // add padding as well
}
}