[php] 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();

위의 코드는 작동하지 않습니다. 텍스트에 맞게 열 크기를 변경하지 않습니다.

업데이트
내가 사용하는 작가$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');



답변

열이 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()) 존재하지 않습니다 (메모리 저장).


답변

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

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


답변

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

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

도움이 되었기를 바랍니다 😉


답변

for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->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 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);
    }
}


답변

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