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);
}
}
for 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('B','G') as $columnID)
{
$objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}
If you try to iterate with for ($col = 2; $col <= 'AC'; ++ $col){...}
, or with foreach(range('A','AC') as $col) {...}
it will work for columns from A to Z, but it fails pass the Z (Ex. iterate between 'A' to 'AC').
In order to iterate pass 'Z', you need to convert the column to integer, increment, compare, and get it as string again:
$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);
}
With this, you easy iterate pass the 'Z' column and set autosize to every column.
In case somebody was looking for this.
The resolution below also works on PHPSpreadsheet
, their new version of 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);
}
Note:
getHighestColumn()
can be replaced withgetHighestDataColumn()
or the last actual column.
What these methods do:
getHighestColumn($row = null)
- Get highest worksheet column.
getHighestDataColumn($row = null)
- Get highest worksheet column that contains data.
getHighestRow($column = null)
- Get highest worksheet row
getHighestDataRow($column = null)
- Get highest worksheet row that contains data.
Come late, but after searching everywhere, I've created a solution that seems to be "the one".
Being known that there is a column iterator on last API versions, but not knowing how to atuoadjust the column object it self, basically I've created a loop to go from real first used column to real last used one.
Here it goes:
//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');
you also need to identify the columns to set dimensions:
foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
$phpExcelObject
->getActiveSheet()
->getColumnDimension($col)
->setAutoSize(true);
}
$col = 'A';
while(true){
$tempCol = $col++;
$objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
break;
}
}
For Spreedsheet + PHP 7, you must write instead of PHPExcel_Cell::columnIndexFromString
, \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString
. And at the loop is a mistake, there you must <
not work with <=
. Otherwise, he takes a column too much into the loop.
참고URL : https://stackoverflow.com/questions/16761897/phpexcel-auto-size-column-width
'code' 카테고리의 다른 글
Spark로 CSV 파일로드 (0) | 2020.08.31 |
---|---|
루비 : 음수를 양수로 바꾸시겠습니까? (0) | 2020.08.31 |
외부 어셈블리에서 내부 클래스에 액세스하려면 어떻게해야합니까? (0) | 2020.08.31 |
사용자 정의 대화 상자 애니메이션 (0) | 2020.08.31 |
커밋 메시지에 Git의 브랜치 이름을 추가하는 방법은 무엇입니까? (0) | 2020.08.31 |