OrderExportService.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. /**
  3. * Author: 芸众商城 www.yunzshop.com
  4. * Date: 2017/7/25
  5. * Time: 上午11:31
  6. */
  7. namespace app\common\services;
  8. class OrderExportService extends ExportService
  9. {
  10. public function getExportBuilder()
  11. {
  12. return new \app\backend\modules\order\models\OrderExport($this->export_data);
  13. }
  14. protected function exportBuilder()
  15. {
  16. $export_data = $this->export_data;
  17. return \Excel::create($this->file_name, function ($excel) use ($export_data) {
  18. $excel->setTitle('Office 2005 XLSX Document');
  19. $excel->setCreator('芸众商城')
  20. ->setLastModifiedBy("芸众商城")
  21. ->setSubject("Office 2005 XLSX Test Document")
  22. ->setDescription("Test document for Office 2005 XLSX, generated using PHP classes.")
  23. ->setKeywords("office 2005 openxml php")
  24. ->setCategory("report file");
  25. $excel->sheet('info', function ($sheet) use ($export_data) {
  26. $startRow = 2; // 表格起始行标
  27. $endRow = 2; // 表格结束行标
  28. $rowKey = $startRow;
  29. foreach ($export_data as $k => $v) {
  30. if ($k == 0) {
  31. // 表头
  32. foreach ($v as $key => $value) {
  33. $columnKey = $this->getColumnKey($key) . '1';
  34. $sheet->cell($columnKey, function ($cell) use ($value) {
  35. $cell->setValue($value);
  36. });
  37. }
  38. } else {
  39. $skipCol = 0; // 需要跳过合并单元格的列数
  40. $needMerge = 0; // 是否需要合并单元格
  41. // 判断是否有需要合并的单元格
  42. foreach ($v as $key => $value) {
  43. if (is_array($value)) {
  44. $rowCount = count($value);
  45. if ($rowCount > 1) {
  46. $endRow += $rowCount - 1; // 表格结束行标后移,跳过合并单元格
  47. $needMerge = 1;
  48. }
  49. $skipCol = count(reset($value)) - 1;
  50. }
  51. }
  52. $isSkip = 0; // 是否需要跳过合并单元格
  53. foreach ($v as $key => $values) {
  54. if (is_array($values)) {
  55. $isSkip = 1;
  56. foreach ($values as $value) {
  57. $cellKey = $key;
  58. foreach ($value as $item) {
  59. $columnKey = $this->getColumnKey($cellKey);
  60. $sheet->cell($columnKey . $rowKey, function ($cell) use ($item) {
  61. $cell->setValue($item);
  62. });
  63. ++$cellKey;
  64. }
  65. ++$rowKey;
  66. }
  67. } else {
  68. $columnKey = $isSkip ? $this->getColumnKey($key + $skipCol) : $this->getColumnKey($key);
  69. $sheet->cell($columnKey . $startRow, function ($cell) use ($values) {
  70. $cell->setValue($values);
  71. });
  72. if ($needMerge) {
  73. $mergeRow = $columnKey . $startRow . ':' . $columnKey . $endRow;
  74. $sheet->mergeCells($mergeRow);
  75. $sheet->cells($mergeRow, function ($cells) use ($values) {
  76. if (is_numeric($values)) {
  77. $cells->setAlignment('right');
  78. }
  79. });
  80. }
  81. }
  82. }
  83. $startRow = ++$endRow;
  84. }
  85. }
  86. });
  87. });
  88. }
  89. /**
  90. * 计算单元格列坐标
  91. *
  92. * @param $rowKey
  93. *
  94. * @return string
  95. */
  96. private function getColumnKey($rowKey)
  97. {
  98. $key = floor($rowKey / 26);
  99. if ($key > 0) {
  100. return chr($key + 64) . chr($rowKey % 26 + 65);
  101. } else {
  102. return chr($rowKey + 65);
  103. }
  104. }
  105. }