2021-03-12

php

<?php
declare(strict_types=1);
use PHPExcel;
use PHPExcel_Cell_DataType;
use PHPExcel_Exception;
use PHPExcel_Writer_Excel2007;
use PHPExcel_Writer_Exception;

class Excel
{
    //列标识数组
    CONST CELL_NAME = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
        'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ',
        'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK', 'BL', 'BM', 'BN', 'BO', 'BP', 'BQ', 'BR', 'BS', 'BT', 'BU', 'BV', 'BW', 'BX', 'BY', 'BZ',
        'DA','DB', 'DC', 'DD', 'DE', 'DF', 'DG', 'DH', 'DI', 'DJ', 'DK', 'DL', 'DM', 'DN', 'DO', 'DP', 'DQ', 'DR', 'DS', 'DT', 'DU', 'DV', 'DW', 'DX', 'DY', 'DZ',
        'EA', 'EB', 'EC', 'ED', 'EE', 'EF', 'EG', 'EH', 'EI', 'EJ', 'EK', 'EL', 'EM', 'EN', 'EO', 'EP', 'EQ', 'ER', 'ES', 'ET', 'EU', 'EV', 'EW', 'EX', 'EY', 'EZ',
        'FA', 'FB', 'FC', 'FD', 'FE', 'FF', 'FG', 'FH', 'FI', 'FJ', 'FK', 'FL', 'FM', 'FN', 'FO', 'FP', 'FQ', 'FR', 'FS', 'FT', 'FU', 'FV', 'FW', 'FX', 'FY', 'FZ',
        'GA', 'GB', 'GC', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GJ', 'GK', 'GL', 'GM', 'GN', 'GO', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GV', 'GW', 'GX', 'GY', 'GZ',
        'HA', 'HB', 'HC', 'HD', 'HE', 'HF', 'HG', 'HH', 'HI', 'HJ', 'HK', 'HL', 'HM', 'HN', 'HO', 'HP', 'HQ', 'HR', 'HS', 'HT', 'HU', 'HV', 'HW', 'HX', 'HY', 'HZ'
    ];

    /**
     * 指定数组数据Excel导出[设置多个sheet]
     * @param $data
     * @param $fields
     * @param string $sheetTitleName
     * @param string $sheetDataName
     * @param string $exportName
     * @param string $downloadName
     * @return string
     * @throws PHPExcel_Exception
     * @throws PHPExcel_Writer_Exception
     * @throws Exception
     */
    public static function exportMoreFile(&$data, $fields, $sheetTitleName = 'sheetName',$sheetDataName = 'items',$exportName = "", $downloadName = ""): string
    {
        if (empty($data)) {
            return "";
        }

        $phpexcel = new PHPExcel();
        $write = new PHPExcel_Writer_Excel2007($phpexcel);//2007格式

        /*sheet工作区*/
        $sheetIndex = 0;
        foreach ($data as $keyFirst => $valFirst){ /* 循环sheet */
            /* 设置当前的sheet */
            if($sheetIndex > 0){
                $phpexcel->createSheet();
            }

            $phpexcel -> setActiveSheetIndex($sheetIndex);
            $sheet = $phpexcel -> getActiveSheet();

            /* sheet标题 */
            $sheetTitle = mb_substr($valFirst[$sheetTitleName],0,28);
            $sheet -> setTitle($sheetTitle);

            $key = 0;
            // 设置字段起始写入行
            $column = 1;
            foreach ($fields as $k => $v) {
                $sheet->setCellValue((self::CELL_NAME)[$key] . $column, $v);
                $key++;
            }

            // 设置数据起始写入行
            $column = $column + 1;
            foreach ($valFirst[$sheetDataName] as $keySecond => $valSecond) { /* 循环每页数据 */
                $kk = 0;//设置起始写入列
                foreach ($valSecond as $k => $v) {/* 循环每行数据 */
                    // 获取字段对应的数据
                    $sheet->setCellValue((self::CELL_NAME)[$kk] . $column, $v);
                    $kk++;//列数+1
                }

                $column++;//行数+1
            }

            $sheetIndex ++;
        }

        if (empty($exportName)) {
            $exportName = "data_" . date("YmdHis") . randstr(4, 6) . ".xlsx";
        }

        $fullName = self::exportFolder() . $exportName;
        if (empty($fullName)) {
            throw new Exception("导出文件生成失败", 201);
        }

        $write->save($fullName);
        $phpexcel -> disconnectWorksheets();

        unset($phpexcel);
        unset($sheet);
        unset($write);

        // 删除临时文件
        unlink($fullName);
        return fullName ?? "";
    }

    /**
     * 导出目录
     * @return string
     * @throws Exception
     */
    public static function exportFolder()
    {
        $folder = Env::get("root_path")
            . DIRECTORY_SEPARATOR . "data"
            . DIRECTORY_SEPARATOR . "excel"
            . DIRECTORY_SEPARATOR;
        if (!file_exists($folder)) {
            $mkRes = mkdir($folder);
            if (!$mkRes) {
                throw new Exception("没有权限创建导出文件暂存目录", 201);
            }
        }

        return $folder;
    }

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容