spreadsheet - PhpSpreadsheet setAutoSize(true) 不适用于 php 7.4.9 中的某些列
问题描述
我正在使用以下参数,
- PHP 7.4.9
- Zend 框架 1
- PhpOffice\PhpSpreadsheet\电子表格
我正在使用以下函数从数组生成 Excel 工作表,
public function array_to_excel_download($array, $columnTypeList = array())
{
$spreadsheet = new Spreadsheet();
// set column type
$columnNum='A';
if($columnTypeList) {
foreach ($columnTypeList as $columnType) {
$spreadsheet->getActiveSheet()->getStyle($columnNum++)->getNumberFormat()-
>setFormatCode(constant("phpOffice\PhpSpreadsheet\Style\NumberFormat::".$columnType));
}
}
// Fill worksheet from values in array
$spreadsheet->getActiveSheet()->fromArray($array, null, 'A1');
// Rename worksheet
$spreadsheet->getActiveSheet()->setTitle('Participants Detail');
// Apply to all columns in sheet
$defaultFont = isset($font['name']) ? $font['name'] : 'Arial';
$defaultStyle = array('font' => array('size' => 11, 'name' => $defaultFont));
if (!empty($array) && isset($array[1])) {
// Get First Row of sheet
$firstLetter = Coordinate::stringFromColumnIndex(1);
$lastLetter = Coordinate::stringFromColumnIndex(count($array[1]));
if(count($arrMergeExcelRange) > 0){
$headerRange = "{$firstLetter}1:{$lastLetter}2";
$spreadsheet->getActiveSheet()->freezePane('A3');
// START - MERGE COLUMN
foreach ($arrMergeExcelRange as $valMergeExcelRange){
if(isset($valMergeExcelRange['min']) && isset($valMergeExcelRange['max'])) {
$range= Coordinate::stringFromColumnIndex($valMergeExcelRange['min'])."1:".Coordinate::stringFromColumnIndex($valMergeExcelRange['max'])."1";
$spreadsheet->getActiveSheet()->mergeCells($range);
$spreadsheet->getActiveSheet()->getStyle($headerRange)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
}
// FOR ROW MERGE
if (isset($valMergeExcelRange['rmin']) && isset($valMergeExcelRange['rmax'])) {
$range= Coordinate::stringFromColumnIndex($valMergeExcelRange['rmin'])."1:".Coordinate::stringFromColumnIndex($valMergeExcelRange['rmax'])."2";
$spreadsheet->getActiveSheet()->mergeCells($range);
$spreadsheet->getActiveSheet()->getStyle($headerRange)->getAlignment()->setVertical(Alignment::VERTICAL_CENTER);
}
}
/* END - MERGE COLUMN */
} else{
$headerRange = "{$firstLetter}1:{$lastLetter}1";
$spreadsheet->getActiveSheet()->freezePane('A2');
}
$dataCount = count($array);
$footerRange = "{$firstLetter}{$dataCount}:{$lastLetter}$dataCount";
// Apply to first row in sheet
$firstRow = array(
'fill' => array(
'fillType' => Fill::FILL_SOLID,
'startColor' => array('argb' => '808080'),
),
'font' => array(
'bold' => true,
'color' => array('rgb' => 'FFFFFF'),
'size' => 11,
'name' => $defaultFont
)
);
$lastRow = array(
'font' => array(
'bold' => true,
'size' => 11,
'name' => $defaultFont
)
);
$spreadsheet->getActiveSheet()->getStyle($headerRange)->applyFromArray($firstRow);
// Apply border to data part
$borderStyle = array(
'borders' => array(
'allBorders' => array(
'borderStyle' => Border::BORDER_THIN
)
)
);
$dataRange="{$firstLetter}1:{$lastLetter}{$dataCount}";
$spreadsheet->getActiveSheet()->getStyle($dataRange)->applyFromArray($borderStyle);
$spreadsheet->getActiveSheet()->getStyle($dataRange)->getAlignment()->setWrapText(true);
// START - SET NUMBER FORMAT TO "Generated Parent Code" COLUMN
$columNumbOfGeneratedParentCode = 0;
foreach ($array[0] as $keyArray=>$valArray){
if($keyArray == 'generatedParentCode'){
$columNumbOfGeneratedParentCode++;
break;
}
}
if($columNumbOfGeneratedParentCode != 0){
$colLetter = Coordinate::stringFromColumnIndex($columNumbOfGeneratedParentCode);
$generatedParentCodeRange = "{$colLetter}1:{$colLetter}{$dataCount}";
$spreadsheet->getActiveSheet()->getStyle($generatedParentCodeRange)->getNumberFormat()->setFormatCode('0.0');
}
// END - SET NUMBER FORMAT TO "Generated Parent Code" COLUMN
}
// Cell auto width
foreach($spreadsheet->getActiveSheet()->getColumnIterator() as $columnID) {
$spreadsheet->getActiveSheet()->getColumnDimension($columnID->getColumnIndex())->setAutoSize(true);
}
// Apply to first row in sheet
$colorArr = array(
array (
'fill' => array(
'fillType' => Fill::FILL_SOLID,
'startColor' => array('argb' => 'FFFF00'),
),
'font' => array(
'bold' => true,
'color' => array('rgb' => '000000'),
'size' => 11,
'name' => $defaultFont
)
),
array (
'fill' => array(
'fillType' => Fill::FILL_SOLID,
'startColor' => array('argb' => '90EE90'),
),
'font' => array(
'bold' => true,
'color' => array('rgb' => '000000'),
'size' => 11,
'name' => $defaultFont
)
)
);
// Set Orientation, size and scaling
$pageSetupOrientation = PageSetup::ORIENTATION_PORTRAIT;
if(strtolower($fileOrientation)=="landscape"){
$pageSetupOrientation = PageSetup::ORIENTATION_LANDSCAPE;
}
$spreadsheet->getActiveSheet()->getPageSetup()->setOrientation($pageSetupOrientation);
$spreadsheet->getActiveSheet()->getPageSetup()->setPaperSize(PageSetup::PAPERSIZE_A4);
$spreadsheet->getActiveSheet()->getPageSetup()->setFitToPage(true);
$spreadsheet->getActiveSheet()->getPageSetup()->setFitToWidth(1);
$spreadsheet->getActiveSheet()->getPageSetup()->setFitToHeight(0);
$spreadsheet->getActiveSheet()->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 1);
$spreadsheet->getActiveSheet()->getStyle( $spreadsheet->getActiveSheet()->calculateWorksheetDimension() )->applyFromArray($defaultStyle);
ob_start();
// Redirect output to a client's web browser (Xlsx)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: no-store, no-cache,must-revalidate, post-check=0, pre-check=0');
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header ('Pragma: no-cache'); // HTTP/1.0
$objWriter = IOFactory::createWriter($spreadsheet, 'Xlsx');
$objWriter->save('php://output');
exit;
}
我在数组下面作为 $array 传递,
$array = array(
array(
'parentCode' => 'ParentCode',
'firstName' => 'FirstName',
'lastName' => 'LastName',
'status' => 'Status',
'initialPassword' => 'InitialPassword',
'language' => 'Language',
'createdDate' => 'CreatedDate',
'modifiedDate' => 'ModifiedDate'
),
array(
'parentCode' => '10060.0',
'firstName' => 'abc',
'lastName' => 'abc',
'status' => 'Open',
'initialPassword' => 'z9aqW4G1sZ',
'language' => 'English (UK)',
'createdDate' => '29.10.2021 15:38',
'modifiedDate' => '15.11.2021 18:38'
),
array(
'parentCode' => '10061.0',
'firstName' => 'test',
'lastName' => 'test',
'status' => 'Open',
'initialPassword' => '9Au7WN16Zt',
'language' => 'English (UK)',
'createdDate' => '29.10.2021 15:41',
'modifiedDate' => '29.10.2021 15:42'
)
);
并且在数组下方为 $columnTypeList,
$columnTypeList = array(
0 => 'FORMAT_TEXT',
1 => 'FORMAT_TEXT',
2 => 'FORMAT_TEXT',
3 => 'FORMAT_TEXT',
4 => 'FORMAT_TEXT',
5 => 'FORMAT_TEXT',
6 => 'FORMAT_TEXT',
7 => 'FORMAT_TEXT'
);
生成场景并为此提供一些解决方案。先感谢您!
解决方案
推荐阅读
- java - 如何在 Intellij IDEA 中找到注解的处理器类?
- linux - 在 bash 脚本中切换到 root 用户
- three.js - 如何在特定关键帧处停止动画
- naming-conventions - “懒惰”在编程意义上是什么意思?
- powershell - 在 PowerShell 中过滤重复消息?
- angular - 如何在 Ionic 3 中发送电子邮件(不使用电子邮件编辑器)
- scala - 如何获取传递给 Scala 宏的参数的运行时值?
- websphere - mod_was_ap22_http.so 在 Websphere 9 上不可用?
- python - keras 总是直线预测
- php - 从未知格式/Date(1576648800000)/在php中格式化日期