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 The writer I'm using $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

78

13 адказы

Калі слупок усталяваны ў AutoSize, PHPExcel спрабуе вылічыць шырыню слупка ў адпаведнасці з вылічаным значэннем слупка (так у выніку якімі-небудзь формул), а таксама любыя дадатковыя сімвалы дададзеныя маскамі фармату, такімі як падзельнікі тысяч.

Па змаўчанні, гэта ацэньваецца шырыня: больш дакладны метад разліку даступны, заснаваны на выкарыстанні 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() expects a column ID.

$objPHPExcel->getActiveSheet()->getColumnDimensions() will return an array of all the defined column dimension records; but unless a column dimension record has been explicitly created (perhaps by loading a template, or by manually calling getColumnDimension()) then it won't exist (memory saving).

164
дададзена
Вялікае вам дзякуй. Гэта працуе. Ён не разлічвае дадатковы прамежку, створаны з тлустае шрыфта, хоць гэта чакаецца (я чытаў дзесьці). Не маглі б вы абнавіць свой адказ, каб уключыць гэта таксама?
дададзена аўтар alkis, крыніца
Гэта нармальна, я не клапачуся. Хоць я не ведаю, як гэта зрабіць. Я выкарыстоўваю 01simple-спампаваць-xls.php з папкі Test. Дзе я магу дадаць гэтую радок? Выбачайце за мой поўны noobness. Я толькі пачаў гуляць з ім.
дададзена аўтар alkis, крыніца
Калі вам патрэбна гэтая ступень дакладнасці з гарнітуры шрыфта стылю, такія як паўтлустым шрыфтам або курсівам, то вам трэба выкарыстоўваць PHPExcel_Shared_Font :: AUTOSIZE_METHOD_EXACT, але гэта нашмат павольней
дададзена аўтар Mark Baker, крыніца
Адзіны варыянт, каб даць спіс, каб перабраць масіў імёнаў слупкоў як паказана в @ TodStoychev адказваюць, ітэрацыя гэтага масіва
дададзена аўтар Mark Baker, крыніца
Акрамя таго, калі вы не хочаце, каб перабіраць з дапамогай літар слупкоў, але індэксы замест гэтага вы можаце выкарыстоўваць статычны метад PHPExcel_Cell :: stringFromColumnIndex ($ ColumnIndex), каб атрымаць ліст калонкі
дададзена аўтар MeatPopsicle, крыніца
@MarkBaker Ці ёсць даступны метад зрабіць з дапамогай аднаго аператара, так што мы можам усталяваць шырыню слупкоў, указаных у спісе. У цяперашні час я выкарыстоўваю $ activeSheetObj-> getColumnDimension ( 'G') -> setWidth (35); слупкі ў спісе могуць быць любога парадку.
дададзена аўтар Rosa Mystica, крыніца

Калі вам трэба зрабіць гэта на некалькіх лістах, а таксама некалькі слупкоў у кожным лісце, вось як вы можаце перабраць усе з іх:

// 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);
    }
}
35
дададзена
Nice рашэнне, дзякуй!
дададзена аўтар tonix, крыніца
Гэта лепшае рашэнне, бо ён не патрабуе спецыяльнага разгляду для калон апошніх Z.
дададзена аўтар Anthony, крыніца

Тут больш гнуткі варыянт заснаваны на @Mark Бэйкер пост:

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

Спадзяюся, што гэта дапамагае;)

13
дададзена
Гэта працуе, хоць: для (! $ I = 'A'; $ я = $ phpExcelObject-> getActiveSheet() -> getHighestColumn (); $ я ++) {$ worksheet-> getColumnDimension ($ я) -> setAutoSize (TRUE); }
дададзена аўтар Nathan, крыніца
Гэта працуе толькі да Z, так як Дыяпазон ( «A», «AB») проста вяртае адзін элемент з імем «A». Такім чынам, выкарыстоўваючы дыяпазон() у дадзеным выпадку гэта не вельмі добрая ідэя!
дададзена аўтар Michael, крыніца
Я згодны з @Michael
дададзена аўтар Gabriel, крыніца

Гэта прыклад таго, як выкарыстоўваць усе слупкі ліста:

$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 );
}
7
дададзена
Калі ласка, дадайце некаторы кантэкст вакол вашага адказу, каб растлумачыць, як яна вырашае гэтую праблему
дададзена аўтар Andrew Stubbs, крыніца
for ($i = 'A'; $i !=  $objPHPExcel->getActiveSheet()->getHighestColumn(); $i++) {
    $objPHPExcel->getActiveSheet()->getColumnDimension($i)->setAutoSize(TRUE);
}
6
дададзена
добры адказ, але павінен быць $ я <= $ objPHPExcel-> getActiveSheet() -> getHighestColumn() у адваротным выпадку апошні слупок не атрымліваюць памеру
дададзена аўтар billynoah, крыніца

Гэты фрагмент кода будзе аўтаматычна памер усіх слупкоў, якія ўтрымліваюць дадзеныя ва ўсіх лістах. Там няма неабходнасці выкарыстоўваць паглынальнік 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);
    }
}
5
дададзена
foreach(range('B','G') as $columnID)
{
    $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
}
3
дададзена

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').

Для таго, каб ітэрацыя праходу «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» і ўсталяваць AutoSize да кожнага калонку.

2
дададзена

У выпадку, калі хтосьці шукае гэта.

Дазвол ніжэй, таксама працуе на 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) - 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.

2
дададзена

Прыходзьце позна, але пасля пошуку ўсюды, я стварыў рашэнне, якое, здаецца, каб быць "адзін".

Будучы вядома, што ёсць слупок итератор на апошнія версіі 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;
    }
}
1
дададзена
Калі ласка, перафарматаваць свой адказ і думаць пра гэта: A добры адказ заўсёды будзе мець тлумачэнне таго, што было зроблена і чаму гэта было зроблена такім чынам, не толькі ОП, але і для будучых наведвальнікаў SO.
дададзена аўтар B001ᛦ, крыніца

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.

1
дададзена