CompanyRdActivityExport.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. namespace App\Exports;
  3. use Maatwebsite\Excel\Concerns\WithEvents;
  4. use Maatwebsite\Excel\Concerns\WithTitle;
  5. use Maatwebsite\Excel\Events\AfterSheet;
  6. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  7. use PhpOffice\PhpSpreadsheet\Style\Border;
  8. class CompanyRdActivityExport implements WithEvents, WithTitle
  9. {
  10. protected $data; // 存放传入的列表数据
  11. public function __construct(array $data) {
  12. $this->data = $data;
  13. }
  14. public function title(): string {
  15. return '研发活动汇总';
  16. }
  17. public function registerEvents(): array {
  18. return [
  19. AfterSheet::class => function (AfterSheet $event) {
  20. $sheet = $event->sheet->getDelegate();
  21. $lastCol = 'H';
  22. $dataCount = count($this->data);
  23. $lastRow = 3 + $dataCount; // 数据从第4行开始填充
  24. // --- 1. 第一行:主标题 ---
  25. $sheet->mergeCells('A1:H1');
  26. $sheet->setCellValue('A1', "企业研究开发活动汇总表");
  27. // --- 2. 第二行:单位说明 ---
  28. $sheet->mergeCells('A2:H2');
  29. $sheet->setCellValue('A2', "单位:元 "); // 末尾加空格防止贴边
  30. // --- 3. 第三行:表头标题 ---
  31. $headers = [
  32. 'A'=>'序号','B'=>'研发活动名称','C'=>'起止时间',
  33. 'D'=>'技术来源','E'=>'研发预算','F'=>'实际支出',
  34. 'G'=>'技术领域','H'=>'备注'
  35. ];
  36. foreach ($headers as $col => $title) {
  37. $sheet->setCellValue("{$col}3", $title);
  38. }
  39. // --- 4. 填充数据 (从第4行开始) ---
  40. $currentRow = 4;
  41. foreach ($this->data as $index => $row) {
  42. $sheet->fromArray([
  43. $index + 1, // A 序号
  44. $row['activity_name']??'', // B 研发活动名称
  45. $row['time_range']??'', // C 起止时间
  46. $row['from'], // D 技术来源
  47. $row['budget']??0, // E 研发预算
  48. $row['actual_spending']??0, // F 实际支出
  49. $row['tech_area']??'', // G 技术领域
  50. $row['remark']??'', // H 备注
  51. ], null, "A{$currentRow}");
  52. $currentRow++;
  53. }
  54. // --- 5. 样式全局精修 ---
  55. $fullRange = "A1:{$lastCol}{$lastRow}";
  56. // 统一设置:垂直居中、水平居中、自动换行
  57. $sheet->getStyle($fullRange)->getAlignment()->applyFromArray([
  58. 'vertical' => Alignment::VERTICAL_CENTER,
  59. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  60. 'wrapText' => true,
  61. ]);
  62. // --- 【关键修正】第二行:单位说明 强制右对齐 ---
  63. // 必须在全局居中设置之后执行,否则会被覆盖
  64. $sheet->getStyle('A2:H2')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT);
  65. // 表头 (第1行和第3行) 字体加粗
  66. $sheet->getStyle('A1:H1')->getFont()->setBold(true)->setSize(14);
  67. $sheet->getStyle('A3:H3')->getFont()->setBold(true);
  68. // --- 6. 调整行高与列宽 ---
  69. $sheet->getRowDimension(1)->setRowHeight(35); // 主标题行
  70. $sheet->getRowDimension(2)->setRowHeight(20); // 单位行
  71. $sheet->getRowDimension(3)->setRowHeight(25); // 表头行
  72. // 设置列宽
  73. $sheet->getColumnDimension('A')->setWidth(8);
  74. $sheet->getColumnDimension('B')->setWidth(30);
  75. $sheet->getColumnDimension('C')->setWidth(18);
  76. $sheet->getColumnDimension('D')->setWidth(15);
  77. $sheet->getColumnDimension('E')->setWidth(13);
  78. $sheet->getColumnDimension('F')->setWidth(13);
  79. $sheet->getColumnDimension('G')->setWidth(15);
  80. $sheet->getColumnDimension('H')->setWidth(25);
  81. // --- 7. 全表加细边框 ---
  82. $sheet->getStyle("A3:{$lastCol}{$lastRow}")->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN);
  83. },
  84. ];
  85. }
  86. }