I'm mencoba untuk ukuran otomatis kolom-kolom lembar saya. I'm menulis file dan pada akhirnya saya mencoba untuk mengubah ukuran semua kolom saya.
// 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();
Kode di atas doesn't bekerja. Doesn't mengubah ukuran kolom untuk menyesuaikan teks
UPDATE
Penulis I'm menggunakan $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
Jika kolom diatur untuk AutoSize, PHPExcel upaya untuk menghitung lebar kolom berdasarkan nilai yang dihitung dari kolom (jadi pada hasil dari setiap formula), dan setiap karakter tambahan yang ditambahkan oleh format masker seperti pemisah ribu.
Secara default, ini adalah sebuah diperkirakan
lebar: perhitungan yang lebih akurat adalah metode yang tersedia, berdasarkan menggunakan GD, yang juga dapat menangani gaya font fitur-fitur seperti bold dan italic; tetapi ini adalah yang jauh lebih besar di atas kepala, sehingga hal ini dimatikan secara default. Anda dapat mengaktifkan perhitungan yang lebih akurat menggunakan
PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);
Namun, autosize doesn't berlaku untuk semua Penulis format... misalnya CSV. Anda don't menyebutkan apa yang penulis anda're menggunakan.
Tapi anda juga perlu untuk mengidentifikasi kolom untuk mengatur dimensi:
foreach(range('B','G') as $columnID) {
$objPHPExcel->getActiveSheet()->getColumnDimension($columnID)
->setAutoSize(true);
}
$objPHPExcel->getActiveSheet()->getColumnDimension()
mengharapkan kolom ID.
$objPHPExcel->getActiveSheet()->getColumnDimensions()
akan mengembalikan sebuah array dari semua didefinisikan dimensi kolom catatan, tetapi kecuali dimensi kolom catatan telah secara eksplisit dibuat (mungkin dengan memuat template, atau secara manual dengan memanggil getColumnDimension()
) maka tidak't ada (memori hemat).
Jika anda perlu untuk melakukan itu pada beberapa lembar, dan beberapa kolom di setiap lembar, di sini adalah bagaimana anda dapat iterate melalui semua dari mereka:
// 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);
}
}
Di sini yang lebih fleksibel varian berdasarkan @Mark Baker posting:
foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
$phpExcelObject->getActiveSheet()
->getColumnDimension($col)
->setAutoSize(true);
}
Semoga ini bisa membantu ;)
Ini adalah contoh bagaimana menggunakan semua kolom dari lembar kerja:
$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 );
}
Potongan kode ini akan otomatis ukuran semua kolom yang berisi data di semua lembar. Ada tidak perlu untuk menggunakan activeSheet getter dan 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);
}
}
untuk 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);
}
Dalam kasus seseorang yang sedang mencari ini.
Resolusi di bawah ini juga bekerja pada PHPSpreadsheet
, mereka versi baru dari 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);
}
Catatan:
getHighestColumn()
dapat diganti dengangetHighestDataColumn()
atau yang terakhir sebenarnya kolom.
Apa metode ini dilakukan:
getHighestColumn($row = null)
- Dapatkan tertinggi kolom lembar kerja.
getHighestDataColumn($row = null)
- Dapatkan tertinggi kolom lembar kerja yang berisi data.
getHighestRow($kolom = null)
- Dapatkan tertinggi lembar kerja baris
getHighestDataRow($kolom = null)
- Dapatkan tertinggi lembar kerja baris yang berisi data.
Jika anda mencoba untuk berkreasi dengan for ($col = 2; $col <= 'AC'; ++ $col){...}
, atau dengan foreach(range('A','AC') sebagai $col) {...}
itu akan bekerja untuk kolom dari A sampai Z, tapi gagal lulus Z (Ex. iterate antara 'A' untuk 'AC').
Dalam rangka untuk iterate lulus 'Z', anda perlu mengkonversi kolom untuk bilangan bulat, kenaikan, membandingkan, dan mendapatkan itu sebagai string lagi:
$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);
}
Dengan ini, anda mudah iterate lulus 'Z' kolom dan mengatur autosize untuk setiap kolom.
anda juga perlu untuk mengidentifikasi kolom untuk mengatur dimensi:
foreach (range('A', $phpExcelObject->getActiveSheet()->getHighestDataColumn()) as $col) {
$phpExcelObject
->getActiveSheet()
->getColumnDimension($col)
->setAutoSize(true);
}
Datang terlambat, tapi setelah mencari di mana-mana, saya've menciptakan solusi yang tampaknya menjadi "".
Diketahui, ada kolom iterator pada versi API, tetapi tidak tahu bagaimana untuk atuoadjust kolom objek itu sendiri, pada dasarnya saya've menciptakan sebuah loop untuk pergi dari real pertama kali digunakan kolom untuk real terakhir digunakan.
Berikut ini kelanjutannya:
//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');
$col = 'A';
while(true){
$tempCol = $col++;
$objPHPExcel->getActiveSheet()->getColumnDimension($tempCol)->setAutoSize(true);
if($tempCol == $objPHPExcel->getActiveSheet()->getHighestDataColumn()){
break;
}
}
Untuk Spreedsheet PHP + 7, anda harus menulis bukan PHPExcel_Cell::columnIndexFromString
, \PhpOffice\PhpSpreadsheet\Cell::columnIndexFromString
. Dan di loop adalah sebuah kesalahan, di sana anda harus <
tidak bekerja dengan <=
. Sebaliknya, dia mengambil kolom terlalu banyak ke dalam lingkaran.
lang-php // Auto-ukuran kolom untuk semua lembar kerja foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { foreach ($worksheet->getColumnIterator() as $kolom) { $lembar kerja ->getColumnDimension($kolom->getColumnIndex()) ->setAutoSize(true); } }