Ширина столбца ширины 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');
Ответы
Ответ 1
Если столбец установлен в 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()
ожидает идентификатор столбца.
$objPHPExcel->getActiveSheet()->getColumnDimensions()
будет возвращать массив всех определенных записей измерения столбцов; но если запись размера столбца не была явно создана (возможно, путем загрузки шаблона или путем ручного вызова getColumnDimension()
), то она не будет существовать (сохранение памяти).
Ответ 2
Если вам нужно сделать это на нескольких листах и несколько столбцов на каждом листе, вот как вы можете выполнить итерацию через все из них:
// 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);
}
}
Ответ 3
Здесь более гибкий вариант, основанный на сообщении @Mark Baker:
foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
$phpExcelObject->getActiveSheet()
->getColumnDimension($col)
->setAutoSize(true);
}
Надеюсь, что это поможет;)
Ответ 4
Это пример использования всех столбцов на листе:
$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 );
}
Ответ 5
for ($i = 'A'; $i != $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
$objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}
Ответ 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);
}
}
Ответ 7
foreach(range('B','G') as $columnID)
{
$objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}
Ответ 8
Если вы попытаетесь выполнить итерацию с помощью for ($col = 2; $col <= 'AC'; ++ $col){...}
или с помощью foreach(range('A','AC') as $col) {...}
, она будет работать для столбцов от A до Z, но с ошибкой пройдет Z (пример итерации между "A" и "AC" ).
Чтобы выполнить итерацию pass '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" и установите autoisize для каждого столбца.
Ответ 9
В случае, если кто-то искал это.
В приведенной ниже резолюции также работает над PHPSpreadsheet
, их новая версия PHPExcel.
// 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)
- Получить высочайшую строку листа, содержащую данные.
Ответ 10
Приходите поздно, но после поиска повсюду я создал решение, которое кажется "одним".
Известно, что в последних версиях 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');
Ответ 11
вам также необходимо определить столбцы для установки размеров:
foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
$phpExcelObject
->getActiveSheet()
->getColumnDimension($col)
->setAutoSize(true);
}
Ответ 12
$col = 'A';
while(true){
$tempCol = $col++;
$objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
break;
}
}
Ответ 13
Для Spreedsheet + PHP 7 вы должны написать вместо PHPExcel_Cell::columnIndexFromString
, \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString
. И в цикле ошибка, вы должны <
не работать с <=
. В противном случае он занимает слишком много столбца в цикле.
Ответ 14
для phpspreadsheet:
$sheet = $this->spreadsheet->getActiveSheet();
foreach (range('A', $sheet->getHighestColumn()) as $column) {
$sheet->getColumnDimension($column)->setAutoSize(true);
}