TP5.1导出和导入Excel

该博客展示了如何在PHP中使用PHPExcel库来实现数据的导出和导入功能。导出功能支持根据条件筛选字段并快速生成Excel文件,而导入功能则读取Excel文件并将数据保存到数据库。整个过程涉及数据库操作、文件上传验证以及数据处理。
摘要由CSDN通过智能技术生成

composer require phpoffice/phpexcel

自定义导出Excel (本地测试导出5W条数据还是可以的,5秒左右。如果电脑性能好的话,可以多尝试导出点数据,10W或者20W试一试。如果在Linux上会更快,想对来说导出的数据也会更多)

public function exportExcel()
    {
        $condition = input('condition',[]);

        $condition = array_flip($condition);

        foreach ($condition as $k=>&$item){
            $item = $k;
        }

        $excelName = '用户信息表';
        $column  = [
            ['id','序号'],
            ['name','姓名'],
            ['pwd','密码'],
            ['address','地址'],
            ['is_show','是否展示'],
            ['sex','性别'],
            ['number','数值'],
            ['create_time','创建时间'],
        ];

        $field = [];

        $field[] = 'id';


        if (isset($condition['name'])){
            $field[] = 'name';
        }
        if (isset($condition['pwd'])){
            $field[] = 'pwd';
        }
        if (isset($condition['address'])){
            $field[] = 'address';
        }
        if (isset($condition['is_show'])){
            $field[] = 'is_show';
        }
        if (isset($condition['sex'])){
            $field[] = 'sex';
        }
        if (isset($condition['number'])){
            $field[] = 'number';
        }
        if (isset($condition['create_time'])){
            $field[] = 'create_time';
        }

        $userModels = Db::name('user')->field($field)->order('id desc')->limit(50000)->select();

        foreach ($userModels as &$model){
            $model['sex'] = $model['sex'] == 0 ? '女' : '男';
             if ($model['pwd'] != ''){
                 $pwd = '******';
                 $model['pwd'] = $pwd;
             }
        }

        $res = PhpExcelUtils::exportData($excelName,$column,$userModels);

        if($res){
            return json_encode(['code' => 200, 'data' => '下载成功','message' => 'success']);
        }else{
            return json_encode(['code' => 404, 'data' => '请重试', 'message' => 'error']);
        }

    }




public static function exportData($Title, $CellNameList, $TableData)
    {
        $rand_arr = array_rand($TableData, 1);
        $arr = $TableData[$rand_arr];

        $list = [];
        foreach ($CellNameList as $key => $item) {
            foreach ($arr as $k => $v) {

                if (in_array($k, $item)) {
                    $list[] = $item;
                }
            }
        }
        $CellNameList = $list;

        $xlsTitle = iconv('utf-8', 'gb2312', $Title);  // excel标题
        $fileName = $Title;                  // 文件名称
        $cellNum = count($CellNameList);    // 单元格名 个数
        $dataNum = count($TableData);       // 数据 条数

        $obj = new \PHPExcel();

        $originCell = [                           // 所有原生名
            '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'
        ];

        //getActiveSheet(0) 获取第一张表
        $obj->getActiveSheet(0)
            ->mergeCells('A1:' . $originCell[$cellNum - 1] . '1');       //合并单元格A1-F1 变成新的A1

        $obj->getActiveSheet(0)->setCellValue('A1', $fileName);        // 设置第一张表中 A1的内容


        $obj->getActiveSheet()->getColumnDimension()->setWidth(25);        //设置单元格宽度
        $obj->getActiveSheet()->getDefaultRowDimension()->setRowHeight(25);  //设置单元格行高

        for ($i = 0; $i < $cellNum; $i++) {                                     // 设置第二行 ,值为字段名
            $obj->getActiveSheet(0)
                ->setCellValue($originCell[$i] . '2', $CellNameList[$i][1]);      //设置 A2-F2 的值
        }

        // Miscellaneous glyphs, UTF-8  循环写入数据
        for ($i = 0; $i < $dataNum; $i++) {
            for ($j = 0; $j < $cellNum; $j++) {                         // 设置第三行 ,每一行为 数据库一条数据
                $obj->getActiveSheet(0)                                 // 设 A3 值, 值为$TableData[0]['id']
                ->setCellValue($originCell[$j] . ($i + 3), $TableData[$i][$CellNameList[$j][0]]);
            }
        }
        //居中
        $obj->getActiveSheet(0)->getDefaultStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

        ob_end_clean();//这一步非常关键,用来清除缓冲区防止导出的excel乱码
        header('pragma:public');
        header('Content-type:application/vnd.ms-excel;charset=utf-8;name="' . $xlsTitle . '.xlsx"');
        header("Content-Disposition:attachment;filename=$fileName.xlsx");   //"xls"参考下一条备注
        $objWriter = \PHPExcel_IOFactory::createWriter($obj, 'Excel2007');

        //"Excel2007"生成2007版本的xlsx,"Excel5"生成2003版本的xls 调用工厂类
        return $objWriter->save('php://output');
    }

导入Excel。注:自定义导入还未实现------

public function uploadExcel()
    {
        header("content-type:text/html;charset=utf-8");

        $file = request()->file('excel');
        $info = $file->validate(['size' => 1048576, 'ext' => 'xls,xlsx'])->move('./excels');    //文件上传

        if ($info){

            $fileName = $info->getSaveName();                    //文件名
            $filePath = app()->getRootPath().'public/' . 'excels/' . $fileName  ;          //绝对路径
            $suffix = $info->getExtension();                     //后缀

            //判断哪种类型
            if ($suffix == "xlsx")
                $reader = \PHPExcel_IOFactory::createReader('Excel2007');
            else
                $reader = \PHPExcel_IOFactory::createReader('Excel5');   //xls
        }else{
            return $file->getError();
        }


        $excel = $reader->load($filePath, $encode = 'utf-8');       //载入excel文件

        $res = PhpExcelUtils::uploadDatas($excel);                         //导入数据库

        if($res){
            return json_encode( ['code' => 200, 'data' => '导入成功','message' => 'success']);
        }else{
            return json_encode(['code' => 404, 'data' => '请重试', 'message' => 'error']);
        }
    }



public static function uploadDatas($excel)
    {
        //读取第一张表
        $sheet = $excel->getSheet(0);
        //获取总行数
        $row_num = $sheet->getHighestRow();
        //获取总列数
        $col_num = $sheet->getHighestColumn();

        $a_z = [];
        for ($i = 'A'; $i <= $col_num; $i++){
            $a_z[] = $i;
        }

        $datas = [];
        for ($i = 3; $i <= $row_num; $i++) {                        //i=2是为了知道是哪个列的,好插入字段
            foreach ($a_z as $item){
                $datas[$i][$item] = $sheet->getCell($item . $i)->getValue();
            }
        }

        $data = [];
        foreach ($datas as $key => $value) {
            $data[$key]['id'] = $value['A'];
            $data[$key]['name'] = $value['B'];
            $data[$key]['pwd'] = $value['C'];
            $data[$key]['sex'] = ($value['D'] == '女') ? 0 : 1;
            $data[$key]['create_time'] = $value['E'];
        }

        foreach ($data as $item){
            $userModel = Db::name('user')->where([['id','=',$item['id']]])->find();
            if ($userModel){
                $item['id'] = $userModel['id'];
                 $res = Db::name('user')->where([['id','=',$item['id']]])->update($item);
                 var_dump($res);
            }else{
                 $res = Db::name('user')->insert($item);
            }
        }

        return $res;

    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值