PHPExcel自动调整列宽

Alk*_*ris 92 php size resize 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();
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用.不会更改列大小以适合文本

更新 我正在使用的作家$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

Mar*_*ker 184

如果将列设置为AutoSize,则PHPExcel会尝试根据列的计算值(以及任何公式的结果)计算列宽,以及通过格式掩码(如千位分隔符)添加的任何其他字符.

默认情况下,这是一个estimated宽度:基于使用GD,可以使用更准确的计算方法,GD也可以处理字体样式功能,如粗体和斜体; 但这是一个更大的开销,因此它默认关闭.您可以使用启用更准确的计算

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);
Run Code Online (Sandbox Code Playgroud)

但是,自动调整大小不适用于所有Writer格式...例如CSV.你没有提到你正在使用的作家.

但您还需要确定要设置尺寸的列:

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

$objPHPExcel->getActiveSheet()->getColumnDimension() 期望列ID.

$objPHPExcel->getActiveSheet()->getColumnDimensions()将返回所有已定义列维度记录的数组; 但除非已明确创建列维度记录(可能通过加载模板,或通过手动调用getColumnDimension()),否则它将不存在(节省内存).

  • 此外,如果您不想通过列字母而是通过索引进行迭代,则可以使用静态方法PHPExcel_Cell :: stringFromColumnIndex($ columnIndex)来获取列字母 (2认同)

MrU*_*own 47

如果您需要在多个工作表上执行此操作,并且每个工作表中有多个列,则可以使用以下方法迭代所有工作表:

// 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • This is the better solution, since it doesn't require a special consideration for columns past Z. (5认同)
  • 我可以确认这个答案在 PhpSpreadSheet 中也能完美运行。万分感谢! (3认同)

Tod*_*rov 17

这是一个基于@Mark Ba​​ker帖子的更灵活的变体:

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

希望这可以帮助 ;)

  • 这只会在Z之前有效,因为`range('A','AB')`只会返回一个名为'A'的项目.所以在这种情况下使用`range()`并不是一个好主意! (13认同)
  • 这有效:for($ i ='A'; $ i!= $ phpExcelObject-> getActiveSheet() - > getHighestColumn(); $ i ++){$ worksheet-> getColumnDimension($ i) - > setAutoSize(TRUE); } (6认同)

Nat*_*han 11

for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,但应该是`$i <= $objPHPExcel->getActiveSheet()->getHighestColumn()` 否则最后一列不会调整大小 (3认同)

dmi*_*i3x 9

这是如何使用工作表中的所有列的示例:

$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 );
}
Run Code Online (Sandbox Code Playgroud)

  • 请在答案中添加一些上下文来解释它是如何解决问题的 (2认同)

BAR*_*RNZ 9

不要使用 range() 它不会在列 Z 之外工作。

只需使用:

$sheet = $spreadsheet->getActiveSheet();
foreach ($sheet->getColumnIterator() as $column) {
    $sheet->getColumnDimension($column->getColumnIndex())->setAutoSize(true);
}
Run Code Online (Sandbox Code Playgroud)

在写入数据后执行此操作,以便列迭代器知道要迭代多少列。


Ron*_*nie 6

此代码段将自动调整包含所有工作表中数据的所有列的大小.无需使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

对于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);
}
Run Code Online (Sandbox Code Playgroud)

  • @WesleyAbbenhuis 您的评论仅在不超过 26 列时才有效。例如,当最高列为:“AH”时,范围功能将无法正常工作。 (3认同)