SingleSheetExport.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace App\Exports;
  3. use Illuminate\Support\Collection;
  4. use Maatwebsite\Excel\Concerns\FromCollection;
  5. use Maatwebsite\Excel\Concerns\WithTitle;
  6. use Maatwebsite\Excel\Concerns\WithCustomValueBinder;
  7. use Maatwebsite\Excel\Concerns\WithStyles;
  8. use PhpOffice\PhpSpreadsheet\Cell\Cell;
  9. use PhpOffice\PhpSpreadsheet\Cell\DataType;
  10. use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder;
  11. use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  12. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  13. use PhpOffice\PhpSpreadsheet\Style\Border;
  14. class SingleSheetExport extends DefaultValueBinder implements FromCollection, WithTitle, WithCustomValueBinder, WithStyles
  15. {
  16. protected $data;
  17. protected $sheetName;
  18. public function __construct(array $data, string $sheetName)
  19. {
  20. $this->data = $data;
  21. $this->sheetName = $sheetName;
  22. }
  23. /**
  24. * 数据集合
  25. */
  26. public function collection()
  27. {
  28. return new Collection($this->data);
  29. }
  30. /**
  31. * Sheet 名称
  32. */
  33. public function title(): string
  34. {
  35. return $this->sheetName;
  36. }
  37. /**
  38. * 自定义单元格绑定(防止数字丢失前导零 / 科学计数法)
  39. */
  40. public function bindValue(Cell $cell, $value)
  41. {
  42. // 如果是纯数字,则以字符串形式写入
  43. if (is_numeric($value)) {
  44. $cell->setValueExplicit($value, DataType::TYPE_STRING);
  45. return true;
  46. }
  47. return parent::bindValue($cell, $value);
  48. }
  49. /**
  50. * 每页 Sheet 的样式
  51. */
  52. public function styles(Worksheet $sheet)
  53. {
  54. $highestRow = $sheet->getHighestRow();
  55. $highestColumn = $sheet->getHighestColumn();
  56. // 1. 表头加粗、居中
  57. $sheet->getStyle('A1:' . $highestColumn . '1')->applyFromArray([
  58. 'font' => [
  59. 'bold' => true,
  60. 'size' => 11,
  61. ],
  62. 'alignment' => [
  63. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  64. 'vertical' => Alignment::VERTICAL_CENTER,
  65. ],
  66. 'borders' => [
  67. 'bottom' => ['borderStyle' => Border::BORDER_THIN],
  68. ],
  69. ]);
  70. // 2. 内容垂直居中
  71. $sheet->getStyle('A2:' . $highestColumn . $highestRow)
  72. ->getAlignment()
  73. ->setVertical(Alignment::VERTICAL_CENTER);
  74. // 3. 自动列宽
  75. foreach (range('A', $highestColumn) as $col) {
  76. $sheet->getColumnDimension($col)->setAutoSize(true);
  77. }
  78. return [];
  79. }
  80. }