liugc 1 год назад
Родитель
Сommit
71d9150486
1 измененных файлов с 78 добавлено и 0 удалено
  1. 78 0
      extend/excel/ExcelWriter.php

+ 78 - 0
extend/excel/ExcelWriter.php

@@ -0,0 +1,78 @@
+<?php
+namespace excel;
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
+
+class ExcelWriter
+{
+    private $spreadsheet;
+    private $sheet;
+    private $fileUrl;
+
+    public function __construct()
+    {
+        $this->spreadsheet = new Spreadsheet();
+        $this->sheet = $this->spreadsheet->getActiveSheet();
+    }
+
+    public function setHeaders(array $headers, $row = 1)
+    {
+        foreach ($headers as $column => $header) {
+            $this->sheet->setCellValue($this->getColumnLetter($column + 1) . $row, $header);
+        }
+    }
+
+    public function addData(array $data, $startRow = 2)
+    {
+        foreach ($data as $rowIndex => $row) {
+            foreach ($row as $column => $value) {
+                $this->sheet->setCellValue($this->getColumnLetter($column + 1) . ($startRow + $rowIndex), $value);
+                if (is_numeric($value) && strlen($value) > 10) {
+                    $this->sheet->getCell($this->getColumnLetter($column + 1) . ($startRow + $rowIndex))->setValueExplicit($value);
+                }
+                $this->sheet->getColumnDimension($this->getColumnLetter($column + 1))->setWidth(20);
+            }
+        }
+    }
+
+    public function save($filename)
+    {
+        $savePath = "./exports/";
+        $filePath = $savePath . $filename;
+        $writer = new Xlsx($this->spreadsheet);
+        $writer->save($filePath);
+        $this->fileUrl = "/exports/". $filename;
+    }
+    public function fileUrl()
+    {
+        return $this->fileUrl;
+    }
+
+    /**
+     * 生成并保存 Excel 文件
+     * @return void
+     */
+    function generateExcelFile(array $headers, array $lists,string $filename, array $map = [],string $suffix = 'xlsx'): void
+    {
+        //if(!in_array($suffix,['xlsx','xls'])) throw new \Exception('文件格式不正确');
+        $this->setHeaders($headers);
+        $data = array_map(function($row) use ($map) {
+            if(empty($map)){
+                return $row;
+            }
+            $tmp_arr = [];
+            foreach ($map as $value){
+                $tmp_arr[] = $row[$value];
+            }
+            return $tmp_arr;
+        }, $lists);
+        $this->addData($data);
+        $this->save($filename.".".$suffix);
+    }
+
+
+    private function getColumnLetter($columnIndex)
+    {
+        return \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($columnIndex);
+    }
+}