zoukankan      html  css  js  c++  java
  • TP6|TP5.1 PHPoffice导出|导入

    插件合集

    点击跳转

    安装

    composer require phpoffice/phpspreadsheet

    TP6基类

    <?php
    /**
     * Created by PhpStorm.
     * User: Zhangyongfeng
     * Date: 2020/12/1
     * Time: 11:31
     *
     * ━━━━━━━━━神兽出没━━━━━━━━━
     *
     *        ┏┓   ┏┓+ +
     *       ┏┛┻━━━┛┻┓ + +
     *       ┃       ┃  
     *       ┃   ━   ┃ ++ + + +
     *       ████━████ ┃+
     *       ┃       ┃ +
     *       ┃   ┻   ┃
     *       ┃       ┃ + +
     *       ┗━┓   ┏━┛
     *         ┃   ┃           
     *         ┃   ┃ + + + +
     *         ┃   ┃    Code is far away from bug with the animal protecting       
     *         ┃   ┃ +     神兽保佑,代码无bug  
     *         ┃   ┃
     *         ┃   ┃  +         
     *         ┃    ┗━━━┓ + +
     *         ┃        ┣┓
     *         ┃        ┏┛
     *         ┗┓┓┏━┳┓┏┛ + + + +
     *          ┃┫┫ ┃┫┫
     *          ┗┻┛ ┗┻┛+ + + +
     *
     * ━━━━━━━━━感觉萌萌哒━━━━━━━━━
     */
    
    namespace zyf;
    
    use thinkfacadeFilesystem;
    use PhpOfficePhpSpreadsheetIOFactory;
    use PhpOfficePhpSpreadsheetWriterXlsx;
    use PhpOfficePhpSpreadsheetSpreadsheet;
    
    class Excel
    {
    
        static public function returnData($code = '', $msg = '', $data = []){
            return appcommoncontrollerBase::returnData($code, $msg, $data);
        }
    
        /**
         * [exportExcel 导出表格]
         * @param string $fileName excel表的表名
         * @param array  $arr 要导出excel表的数据,接受一个二维数组
         * @param array  $headAr excel表的表头,接受一个一维数组
         * @param array  $keyAr $arr中对应表头的键的数组,接受一个一维数组
         * @return file 到uploads目录下
         * @author zyf <1322816443@qq.com>
         */
        public function exportExcel($fileName = '表格', $arr = [], $headAr = [], $keyAr = [])
        {
            // 计算所需表头数量
            $count = count($headAr)-1;
    
            $spreadsheet = new Spreadsheet();
            $sheet = $spreadsheet->getActiveSheet();
    
            // 设置列
            $rowAr = self::setRowAr($count);
            foreach ($rowAr as $k => $v) {
                if($k > $count) break;
                $sheet->setCellValue($v.'1', $headAr[$k]);
            }
    
            // 写入值
            foreach ($arr as $k => $v) {
                foreach ($rowAr as $ke => $ve){
                    if($ke > $count) break;
                    $sheet->setCellValue($ve.($k+2), $v[$keyAr[$ke]]);      // 给单元格设置值
                    $spreadsheet->getActiveSheet()->getColumnDimension($ve)->setWidth(10); // 固定列宽,看着更整齐
                }
            }
            // 冻结首行
            $spreadsheet->getActiveSheet()->freezePaneByColumnAndRow(0,2);
    
            // 在输出Excel前,缓冲区中处理BOM头
            ob_end_clean();
            ob_start();
    
            header('Content-Type: application/vnd.ms-excel');
            header('Content-Disposition: attachment;filename="'.$fileName.date('_Ymd_Hi',time()).'.xlsx"');
            header('Cache-Control: max-age=0');
            $writer = new Xlsx($spreadsheet);
            $writer->save('php://output');
    
            // 删除清空:
            $spreadsheet->disconnectWorksheets();
            unset($spreadsheet);
            exit;
        }
    
        /**
         * [importExcel 导入数据]
         * @return array
         * @author zyf <1322816443@qq.com>
         * */
        public function importExcel()
        {
            set_time_limit(0);
    
            // 文件上传导入
            $res = self::uploadFileImport();
            if($res['code'] == 999){ return $res; }
    
            // 进行读取
            $spreadsheet = IOFactory::load($res['data']);
            $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);
            return $sheetData;
        }
    
        /**
         * [uploadFileImport 导入文件(数据不入库)]
         * @param file file 文件
         * @return array
         * @author zyf <1322816443@qq.com>
         * */
        public function uploadFileImport()
        {
            $param = request()->param();
            $file = request()->file('file');
            if ($file == null) return $this::returnData(999, '请上传文件');
            // 上传路径
            $disk = !empty($param['disk']) ? $param['disk'] : 'excel';
            // 文件名称
            $saveName = Filesystem::disk($disk)->putFile('', $file);
            $savePath = str_replace(date('Ymd', time()) .'\', '', '/uploads/' . $disk . "/" . date('Ymd', time()) . "/" . $saveName);
            return $this::returnData(200, '上传成功', $savePath);
        }
    
        /**
         * [setRowAr 设置列]
         * @param int $count 列总数
         * @return array
         * @author zyf <1322816443@qq.com>
         * */
        public function setRowAr($count = 26)
        {
            $indData = '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';
            $indData = explode(',',$indData);
            $curCount = 26;
            for ($i = 0; $i <26 ; $i++) {
                for ($j = 0; $j < 26 ; $j++) {
                    if($curCount >= $count) return $indData;
                    $indData[] = $indData[$i].$indData[$j];
                    $curCount++;
                }
            }
            return $indData;
        }
    
    }

    TP5.1基类

    <?php
    /**
     * Created by PhpStorm.
     * User: Zhangyongfeng
     * Date: 2020/12/1
     * Time: 11:31
     *
     * ━━━━━━━━━神兽出没━━━━━━━━━
     *
     *        ┏┓   ┏┓+ +
     *       ┏┛┻━━━┛┻┓ + +
     *       ┃       ┃  
     *       ┃   ━   ┃ ++ + + +
     *       ████━████ ┃+
     *       ┃       ┃ +
     *       ┃   ┻   ┃
     *       ┃       ┃ + +
     *       ┗━┓   ┏━┛
     *         ┃   ┃           
     *         ┃   ┃ + + + +
     *         ┃   ┃    Code is far away from bug with the animal protecting       
     *         ┃   ┃ +     神兽保佑,代码无bug  
     *         ┃   ┃
     *         ┃   ┃  +         
     *         ┃    ┗━━━┓ + +
     *         ┃        ┣┓
     *         ┃        ┏┛
     *         ┗┓┓┏━┳┓┏┛ + + + +
     *          ┃┫┫ ┃┫┫
     *          ┗┻┛ ┗┻┛+ + + +
     *
     * ━━━━━━━━━感觉萌萌哒━━━━━━━━━
     */
    
    namespace zyf;
    
    use PhpOfficePhpSpreadsheetIOFactory;
    use PhpOfficePhpSpreadsheetWriterXlsx;
    use PhpOfficePhpSpreadsheetSpreadsheet;
    
    class Excel
    {
        /**
         * [exportExcel 导出表格]
         * @param string $fileName excel表的表名
         * @param array  $arr 要导出excel表的数据,接受一个二维数组
         * @param array  $headAr excel表的表头,接受一个一维数组
         * @param array  $keyAr $arr中对应表头的键的数组,接受一个一维数组
         * @return file 到uploads目录下
         * @author zyf <1322816443@qq.com>
         */
        public function exportExcel($fileName = '表格', $arr = [], $headAr = [], $keyAr = []){
            // 计算所需表头数量
            $count = count($headAr)-1;
    
            $spreadsheet = new Spreadsheet();
            $sheet = $spreadsheet->getActiveSheet();
    
            // 设置列
            $rowAr = self::setRowAr($count);
            foreach ($rowAr as $k => $v) {
                if($k > $count) break;
                $sheet->setCellValue($v.'1', $headAr[$k]);
            }
    
            // 写入值
            foreach ($arr as $k => $v) {
                foreach ($rowAr as $ke => $ve){
                    if($ke > $count) break;
                    $sheet->setCellValue($ve.($k+2), $v[$keyAr[$ke]]);      // 给单元格设置值
                    $spreadsheet->getActiveSheet()->getColumnDimension($ve)->setWidth(10); // 固定列宽,看着更整齐
                }
            }
            // 冻结首行
            $spreadsheet->getActiveSheet()->freezePaneByColumnAndRow(0,2);
    
            // 在输出Excel前,缓冲区中处理BOM头
            ob_end_clean();
            ob_start();
    
            header('Content-Type: application/vnd.ms-excel');
            header('Content-Disposition: attachment;filename="'.$fileName.date('_Ymd_Hi',time()).'.xlsx"');
            header('Cache-Control: max-age=0');
            $writer = new Xlsx($spreadsheet);
            $writer->save('php://output');
    
            // 删除清空:
            $spreadsheet->disconnectWorksheets();
            unset($spreadsheet);
            exit;
        }
    
        /**
         * [importExcel 导入数据]
         * @return array
         * @author zyf <1322816443@qq.com>
         * */
        public function importExcel(){
            set_time_limit(0);
    
            // 文件上传导入
            $res = self::uploadFileImport();
            if($res['code'] == 500){ return $res; }
    
            $data = $res['data'];
            // 修正路径
            $filename = str_replace('/uploads', 'uploads', $data);
            // 进行读取
            $spreadsheet = IOFactory::load($filename);
            $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);
            return $sheetData;
        }
    
        /**
         * [uploadFileImport 导入文件(数据不入库)]
         * @param file file 文件
         * @return array
         * @author zyf <1322816443@qq.com>
         * */
        public function uploadFileImport(){
            // 获取表单上传文件
            $file = 
    equest()->file('file');
            // 移动到框架应用根目录/public/uploads/ 目录下
            if($file){
                $savePath = '/uploads/importExcel';
                $info = $file->move(ROOT_PATH . 'public' . DS .$savePath);
                $saveName = strtr($info->getSaveName(),'\','/');
                return self::setResAr(200,'上传成功',$savePath.'/'.$saveName);
            }
            return self::setResAr(500,'上传失败');
        }
    
        /**
         * [setRowAr 设置列]
         * @param int $count 列总数
         * @return array
         * @author zyf <1322816443@qq.com>
         * */
        public function setRowAr($count = 26){
            $indData = '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';
            $indData = explode(',',$indData);
            $curCount = 26;
            for ($i = 0; $i <26 ; $i++) {
                for ($j = 0; $j < 26 ; $j++) {
                    if($curCount >= $count) return $indData;
                    $indData[] = $indData[$i].$indData[$j];
                    $curCount++;
                }
            }
            return $indData;
        }
    
        /**
         * [setResAr 设置返回结果格式]
         * @param int $code 自定义编码
         * @param string $msg 返回信息
         * @param array $data 返回数据
         * @return array
         * @author zyf <1322816443@qq.com>
         * */
        public function setResAr($code = 200,$msg = '',$data = array()){
            return ['code' => $code,'msg' => $msg,'data' => $data];
        }
    
    }

    导出后台

    // 导出excel-实现
        public function export()
        {
            // 获取数据
            $systemMod = new appcommonmodelSystem();
            $data = $systemMod->getAll('');
            // 设置表头
            $headAr = [
                '姓名',
                '邮箱',
                '电话',
            ];
            $keyAr = [
                'name',
                'email',
                'tel',
            ];
            $phpOffice = new Excel();
            $phpOffice->exportExcel('数据', $data, $headAr, $keyAr);
        }

    导入后台

        // 导入excel-实现
        public function import()
        {
            if(IS_POST){
                $phpOffice = new Excel();
                $data = $phpOffice->importExcel();
                halt($data);
            }
            return $this->render();
        }

    导入前端

    导入前台用的layui

        <div class="layui-form-item">
            <label class="layui-form-label">上传Excel:</label>
            <div class="layui-input-block">
                <div class="layui-upload">
                    <button type="button" class="layui-btn upload_excel">Excel</button>
                </div>
            </div>
        </div>

    导入JS

    // 导入上传
    upload.render({
        elem: '.upload_excel'
        , url: 'import'
        , multiple: false
        , accept: 'file'
        , before: function(obj){ layer.load(1); }
        , done: function (res) {
            console.log(res)
        }, error: function(index, upload){
            layer.closeAll('loading');
        }
    })
  • 相关阅读:
    21、Java并发性和多线程-Java中的锁
    20、Java并发性和多线程-Slipped Conditions
    19、Java并发性和多线程-嵌套管程锁死
    Java 架构师眼中的 HTTP 协议
    MonolithFirst
    【SpringMVC】从Fastjson迁移到Jackson,以及对技术选型的反思
    SpringMVC接口测试异常:Can not deserialize instance of int out of START_OBJECT token
    请不要盲目的进行横向扩展,优先考虑对单台服务器的性能优化,只有单台服务器的性能达到最优化之后,集群才会被最大的发挥作用
    Android Fragment中调用getActivity为null的问题
    Android 那些年,处理getActivity()为null的日子
  • 原文地址:https://www.cnblogs.com/zyfeng/p/14455432.html
Copyright © 2011-2022 走看看