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');
열이 자동 사이즈로 설정되어 있는 경우, PHPExcel은 열의 계산된 값(수식의 결과)과 1000개의 구분 기호 등의 형식 마스크에 의해 추가된 추가 문자를 기반으로 열 너비를 계산하려고 합니다.
디폴트로는 이거는estimatedwidth: GD를 사용하여 보다 정확한 계산 방법을 사용할 수 있습니다. GD는 굵은 글씨나 기울임꼴 등의 글꼴 스타일 기능을 처리할 수 있지만, 이는 오버헤드가 훨씬 크기 때문에 기본적으로는 꺼집니다.다음을 사용하여 보다 정확한 계산을 수행할 수 있습니다.
PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);
그러나 자동 크기가 모든 Writer 형식에 적용되는 것은 아닙니다.예를 들어 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);
}
range()는 사용하지 마십시오. Z 열을 초과하면 작동하지 않습니다.
사용방법:
$sheet = $spreadsheet->getActiveSheet();
foreach ($sheet->getColumnIterator() as $column) {
$sheet->getColumnDimension($column->getColumnIndex())->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 );
}
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);
}
이 코드 조각은 모든 시트의 데이터를 포함하는 모든 열의 크기를 자동으로 조정합니다.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새로운 버전의 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)의 가장 높은 .- 데데 、 데 - 、 - - 、 - - - - 。
// Auto-size columns for all worksheets
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
foreach ($worksheet->getColumnIterator() as $column) {
$worksheet
->getColumnDimension($column->getColumnIndex())
->setAutoSize(true);
}
}
foreach(range('B','G') as $columnID)
{
$objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}
늦게 오지만, 모든 곳을 찾아본 결과, "하나뿐인" 것처럼 보이는 해결책을 만들어 냈습니다.
마지막 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');
를 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' 열을 반복 통과하고 모든 열에 자동 크기를 설정할 수 있습니다.
또한 크기를 설정할 열을 식별해야 합니다.
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;
}
}
+ 7의 경우 Spreedsheet + PHP 7이 .PHPExcel_Cell::columnIndexFromString,\PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString 있는 루프를 사용해야 합니다< 않다<=그렇지 않으면 그는 너무 많은 컬럼을 루프에 끌어들인다.
이거 해봐, 난 이렇게 풀었어.
$Sheet = $excel->getActiveSheet();
$lABC1 = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
$lABC2 = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
for($I = 0; $I < count($lABC1); $I++):
$Sheet->getColumnDimension($lABC1[$I])->setAutoSize(true);
for($J = 0; $J < 6; $J++){
$Sheet->getColumnDimension($lABC2[$J].$lABC1[$I])->setAutoSize(true);
}
endfor;
언급URL : https://stackoverflow.com/questions/16761897/phpexcel-auto-size-column-width
'source' 카테고리의 다른 글
| 시간 부분을 사용하지 않고 두 날짜를 비교하려면 어떻게 해야 합니까? (0) | 2022.11.12 |
|---|---|
| 랜덤 컬러 발생기 (0) | 2022.11.12 |
| 목록을 튜플 목록으로 병합하려면 어떻게 해야 합니까? (0) | 2022.11.12 |
| 팬더에서 끈에 목록 중 하나가 포함되어 있는지 어떻게 테스트합니까? (0) | 2022.11.12 |
| MySQL을 outfile로 내보내기 : CSV 이스케이프 문자 (0) | 2022.11.12 |