• PHP Help
  • How to make all columns width same in Php Spreadsheet

I am using Php spreadsheet library to export the data from mysql table in excel file.
Data is getting correctly exported but the last column width is not the same as previous column

public function actionExport()
    {
$spreadsheet = new Spreadsheet();

$sheet = $spreadsheet->getActiveSheet();
$sheet = $spreadsheet->removeSheetByIndex(0);
//Get dates of report which needs to be displayed on each sheets 
$sql='SELECT DateofReport from ascteacherreport where UserId=:Id order by DateofReport ASC';

$datesRows = \Yii::$app->db->createCommand($sql)->bindValues([':Id'=>\Yii::$app->user->identity->getonlyid()])
               ->queryColumn();

// Get times for each date report of user
$sql2 = ''; // contains the query to fetch the time

// Get student details for each time
$sql3 = ''; //contains the sql query to fetch students

$col1=3;
 $row = 7;
 $column1=2;
//Loop through dates for each sheet
foreach($datesRows as $date)
{
    $workSheet = new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, $date);
    $spreadsheet->addSheet($workSheet);
    
    $params[':date'] = $date;
    // Execute the time query
     $timedetails = \Yii::$app->db->createCommand($sql2, $params)->queryAll();
//Loop through each time
foreach($timedetails as $idx => $td){
    $row1=9;
    $col = $idx +3;
    $rowno=9;

foreach ($workSheet->getColumnIterator() as $column) {
   $workSheet->getColumnDimension($column->getColumnIndex())->setWidth(28);
}
 $workSheet->getCellByColumnAndRow($col, $row)->setValue($td['Time'])->getStyle($col.$row) ->applyFromArray($styleArray); // Print Time

$params1[':Id']=$td['ASCReportDetailsId'];
$StudentDetails=\Yii::$app->db->createCommand($sql3, $params1)->queryAll();

foreach($StudentDetails as $id=>$StudentDetais1) // Print Student details
		  {
$workSheet->getCellByColumnAndRow($col,$row1++)->setValue($StudentDetais1['StudentName'])->getStyle($col1.$row1)->applyFromArray($styleArray1)->getFont()->setBold(true);

$workSheet->getCellByColumnAndRow($col,$row1++)->setValue($StudentDetais1['Subject'])->getStyle($col1.$row1)->applyFromArray($styleArray1)->getAlignment()->setWrapText(true);
$workSheet->getCellByColumnAndRow($col,$row1++)->setValue($StudentDetais1['Topic'])->getStyle($col1.$row1)->applyFromArray($styleArray1)->getAlignment()->setWrapText(true);
$workSheet->getCellByColumnAndRow($col,$row1++)->setValue($StudentDetais1['Confidence'])->getStyle($col1.$row1)->setQuotePrefix(true)->applyFromArray($styleArray1)->getAlignment()->setHorizontal('left');

$workSheet->getCellByColumnAndRow($column1, $rowno++)->setValue('Student Name')->getStyle($column1.$rowno)->applyFromArray($styleArray1);
$workSheet->getCellByColumnAndRow($column1, $rowno++)->setValue('Subject')->getStyle($column1.$rowno)->applyFromArray($styleArray1);
$workSheet->getCellByColumnAndRow($column1, $rowno++)->setValue('Topic')->getStyle($column1.$rowno)->applyFromArray($styleArray1);
$workSheet->getCellByColumnAndRow($column1, $rowno++)->setValue('Confidence')->getStyle($column1.$rowno)->applyFromArray($styleArray1);

$highestRow = $workSheet->getHighestRow();
$highestColumn = $workSheet->getHighestColumn();
	}
$workSheet->getStyle('C9:'.$highestColumn.''.$highestRow)->applyFromArray($styleArray1);
	}
}
$writer = new Xlsx($spreadsheet);



ob_start();

$writer->save('php://output');
$writer->save('Report'.'.xlsx');


header('Content-type: application/.xlsx');
header('Content-Disposition: attachment; filename="'.'Report'.'.xlsx"');
}

![https://www.linkpicture.com/q/image_633.png](https://)

    I don't use PHPSpreadsheet, so I'm not seeing anything immediately obvious, but could you $worksheet->getDefaultColumnDimension()->setWidth(28) after creating the new worksheet instead of setting each column individually?

      Write a Reply...