PHPExcel 자동 크기 열 너비


100

시트의 열 크기를 자동으로 조정하려고합니다. 파일을 작성 중이며 결국 모든 열의 크기를 조정하려고합니다.

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

답변:


195

열이 AutoSize로 설정된 경우 PHPExcel은 계산 된 열 값 (즉, 수식의 결과에 따라) 및 천 단위 구분 기호와 같은 형식 마스크에 의해 추가 된 추가 문자를 기반으로 열 너비를 계산하려고합니다.

기본적으로 이것은 estimated너비입니다. GD 사용을 기반으로보다 정확한 계산 방법을 사용할 수 있으며 굵게 및 기울임 꼴과 같은 글꼴 스타일 기능도 처리 할 수 ​​있습니다. 그러나 이것은 훨씬 더 큰 오버 헤드이므로 기본적으로 꺼져 있습니다. 다음을 사용하여보다 정확한 계산을 활성화 할 수 있습니다.

PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

그러나 자동 크기 조정은 모든 작성기 형식에 적용되지는 않습니다. 예를 들어 CSV. 어떤 작가를 사용하고 있는지 언급하지 않습니다.

그러나 차원을 설정하려면 열을 식별해야합니다.

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

$objPHPExcel->getActiveSheet()->getColumnDimension() 열 ID가 필요합니다.

$objPHPExcel->getActiveSheet()->getColumnDimensions()정의 된 모든 열 차원 레코드의 배열을 반환합니다. 그러나 열 차원 레코드가 명시 적으로 생성되지 않은 경우 (아마도 템플릿을로드하거나 수동으로 호출하여 getColumnDimension()) 존재하지 않습니다 (메모리 저장).


정말 고맙습니다. 효과가있다. 굵은 글꼴에서 생성 된 추가 간격은 예상되지만 계산하지 않습니다 (어딘가에서 읽었습니다). 그것도 포함하도록 답변을 업데이트 할 수 있습니까?
Alkis Kalogeris

1
굵은 체 또는 기울임 꼴과 같은 서체 스타일의 정밀도가 필요한 경우 PHPExcel_Shared_Font :: AUTOSIZE_METHOD_EXACT를 사용해야하지만 훨씬 느립니다
Mark Baker

괜찮아 상관 없어. 어떻게하는지 모르겠지만. Test 폴더에서 01simple-download-xls.php를 사용하고 있습니다. 그 줄을 어디에 추가합니까? 완전 멍청해서 미안 해요. 나는 그것을 가지고 놀기 시작했다.
Alkis Kalogeris

2
또한 열 문자가 아닌 인덱스를 통해 반복하고 싶지 않은 경우 정적 메서드 PHPExcel_Cell :: stringFromColumnIndex ($ columnIndex)를 사용하여 열 문자를 얻을 수 있습니다
MeatPopsicle 2014 년

@MarkBaker 목록에 주어진 열의 너비를 설정할 수 있도록 단일 문으로 수행 할 수있는 방법이 있습니까? 현재 $ activeSheetObj-> getColumnDimension ( 'G')-> setWidth (35); 목록의 열은 임의의 순서 일 수 있습니다.
Rosa Mystica

55

여러 시트와 각 시트의 여러 열에서이를 수행해야하는 경우 다음과 같이 모든 시트를 반복 할 수 있습니다.

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

7
Z 이후의 열에 대해 특별히 고려할 필요가 없기 때문에 더 나은 솔루션입니다.
Anthony

2
이 답변이 PhpSpreadSheet에서도 완벽하게 작동하는지 확인할 수 있습니다. 정말 감사합니다!
Hissvard

23

@Mark Baker 게시물을 기반으로 한 더 유연한 변형은 다음과 같습니다.

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

도움이 되었기를 바랍니다 ;)


14
이것은 range('A', 'AB')'A'라는 하나의 항목 만 반환 하기 때문에 Z까지만 작동 합니다. 따라서이 range()경우 사용 하는 것은 좋은 생각이 아닙니다!
Michael

7
그래도 작동합니다 : for ($ i = 'A'; $ i! = $ phpExcelObject-> getActiveSheet ()-> getHighestColumn (); $ i ++) {$ worksheet-> getColumnDimension ($ i)-> setAutoSize (TRUE); }
Nathan

14
for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}

2
좋은 답변이되어야하지만 $i <= $objPHPExcel->getActiveSheet()->getHighestColumn()그렇지 않으면 마지막 열은 크기되지 않습니다
billynoah

10

다음은 워크 시트의 모든 열을 사용하는 방법의 예입니다.

$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 );
}

3
이 문제를 해결하는 방법을 설명하는 답변 주위에 약간의 문맥을 추가하세요
앤드류 스텁 스

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);
    }
}

6

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);
}

foreach (range('A', $sheet->getHighestDataColumn()) as $column) {$sheet->getColumnDimension($column)->setAutoSize(true);}
웨슬리 Abbenhuis

1
@WesleyAbbenhuis 귀하의 의견은 26 개 이상의 열이 없을 때만 작동합니다. 예를 들어 가장 높은 열이 'AH'인 경우 범위 기능이 제대로 작동하지 않습니다.
Sander Van Keer

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

3

누군가가 이것을 찾고 있었다면.

아래 해결 방법 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) -데이터가 포함 된 가장 높은 워크 시트 행을 가져옵니다.


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'열을 쉽게 반복하고 모든 열에 자동 크기를 설정합니다.


1

늦게 오십시오. 그러나 모든 곳을 검색 한 후에 "하나"인 것처럼 보이는 솔루션을 만들었습니다.

마지막 API 버전에 열 반복기가 있다는 것을 알고 있지만 자체 열 개체를 atuoadjust하는 방법을 모르기 때문에 기본적으로 실제 처음 사용 된 열에서 실제 마지막 사용 된 열로 이동하는 루프를 만들었습니다.

여기 간다:

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

1

또한 차원을 설정하려면 열을 식별해야합니다.

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

1
$col = 'A';
while(true){
    $tempCol = $col++;
    $objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
    if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
        break;
    }
}

5
답변의 형식을 변경하고 이것에 대해 생각하십시오. 좋은 답변 은 항상 OP뿐만 아니라 향후 SO에 대한 방문자를 위해 수행 된 작업과 이러한 방식으로 수행 된 이유에 대한 설명을 포함합니다.
B001 ᛦ

1

Spreedsheet + PHP 7의 경우 대신 작성해야합니다 PHPExcel_Cell::columnIndexFromString, \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString. 그리고 루프에서 실수가 당신이해야입니다 <작동하지 <=. 그렇지 않으면 그는 루프에 너무 많은 열을 사용합니다.


1
// Auto-size columns for all worksheets
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
    foreach ($worksheet->getColumnIterator() as $column) {
        $worksheet
            ->getColumnDimension($column->getColumnIndex())
            ->setAutoSize(true);
    } 
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.