说明
本文章是基于上一篇ThinkPHP8 导出Excel数据表格文章的完善版,上一篇仅导出为文本框,此处增加下拉框。
其他内容与上一章不变,此处展示不同内容。
更改
1.头部数组修改
增加type类型,text为文本框,select为下拉框,具体其他需求自行扩展。
['key' => 'field', 'title' => '内容', 'type' => 'text'],
['key' => 'date', 'title' => '日期', 'type' => 'select'],
2.设置内容方法修改
仅需要替换该方法即可,具体内容可根据业务场景自行修改。
/**
* @notes 设置单元格值
* @param array $data 数据
* @param array $header 表头数据
* @param string|int $startRow 默认第二行开始
* @return object
*/
public function setContent(array $data, array $header, string|int $startRow = 2): object
{
// 获取总列数
$column = $this->getColumn(count($header));
$totalColumn = count($data);
// 遍历数据
foreach ($data as $key => $value) {
// 遍历表头
for ($i = 0; $i < count($header); $i++) {
// 获取单元格名称
$columnName = $column[$i] . ($key + $startRow);
$columnType = $header[$i]['type'];
$columnValue = $value[$header[$i]['key']] ?? '';
// 设置单元格数据
switch ($columnType) {
case 'text':
$this->sheet->getActiveSheet()->setCellValue($columnName, $columnValue);
break;
case 'select':
$objValidation = $this->sheet->getActiveSheet()->getCell($columnName)->getDataValidation();
$objValidation->setType(DataValidation::TYPE_LIST)
->setErrorStyle(DataValidation::STYLE_INFORMATION)
->setAllowBlank(false)
->setShowInputMessage(true)
->setShowErrorMessage(true)
->setShowDropDown(true)
->setErrorTitle('输入的值有误')
->setError('您输入的值不在下拉框列表内.')
->setPromptTitle('')
->setPrompt('')
->setFormula1('"' . $columnValue . '"');
break;
default:
$this->sheet->getActiveSheet()->setCellValue($columnName, $value[$header[$i]['key']] ?? '');
}
// 设置单元格自适应宽度
$this->sheet->getActiveSheet()->getColumnDimension($column[$i])->setAutoSize(true);
// 设置单元格自适应高度
$this->sheet->getActiveSheet()->getRowDimension($key + $startRow)->setRowHeight(24);
}
unset($data[$key]);
}
$startColumn = $column[0] . $startRow;
$endColumn = $column[count($column) - 1] . $totalColumn + $startRow - 1;
// 设置字体大小及加粗
$this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getFont()->setBold(false)->setSize(11);
// 设置单元格水平居中
$this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
// 设置单元格垂直居中
$this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
// 设置单元格边框
$this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
return $this->sheet;
}