data = $data; } public function title(): string { return '项目研发人员情况'; } public function registerEvents(): array { return [ AfterSheet::class => function (AfterSheet $event) { $sheet = $event->sheet->getDelegate(); $lastCol = 'I'; $dataCount = count($this->data); $lastRow = 2 + $dataCount; // --- 1. 第一行:主标题(包含红色提示文字) --- $sheet->mergeCells('A1:I1'); $sheet->setCellValue('A1', "项目研发活动人员情况表"); $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14); // --- 2. 第二行:表头设置 --- $headers = [ 'A' => '序号', 'B' => '姓名', 'C' => '学历', 'D' => '专业', 'E' => '职称', 'F' => "项目", // 提示列 'G' => '项目角色', 'H' => '部门', 'I' => '承担职责' ]; foreach ($headers as $col => $title) { $sheet->setCellValue("{$col}2", $title); } // 设置表头中 F2 单元格“项目角色”下方文字为红色 $sheet->getStyle('F2')->getFont()->getColor()->setARGB(Color::COLOR_RED); $sheet->getStyle('A2:I2')->getFont()->setBold(true); // --- 3. 填充数据 --- $currentRow = 3; foreach ($this->data as $index => $row) { $sheet->fromArray([ $index + 1, $row['title'] ?? '', $row['education'] ?? '', $row['major'] ?? '', $row['p_title'] ?? '', $row['item_title'] ?? '', $row['item_role'] ?? '', $row['depart_title'] ?? '', $row['duty'] ?? '', ], null, "A{$currentRow}"); $currentRow++; } // --- 4. 全局样式 --- $fullRange = "A1:{$lastCol}{$lastRow}"; $sheet->getStyle($fullRange)->getAlignment()->applyFromArray([ 'vertical' => Alignment::VERTICAL_CENTER, 'horizontal' => Alignment::HORIZONTAL_CENTER, 'wrapText' => true, ]); // --- 5. 行高与列宽 --- $sheet->getRowDimension(1)->setRowHeight(35); $sheet->getRowDimension(2)->setRowHeight(45); // 表头双行文字 $sheet->getColumnDimension('A')->setWidth(8); $sheet->getColumnDimension('B')->setWidth(12); $sheet->getColumnDimension('F')->setWidth(20); // 角色定义列 $sheet->getColumnDimension('G')->setWidth(15); $sheet->getColumnDimension('H')->setWidth(15); $sheet->getColumnDimension('I')->setWidth(25); // 职责列 // --- 6. 边框 --- $sheet->getStyle("A2:{$lastCol}{$lastRow}")->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN); }, ]; } }