thinkphp5用phpexcel导出导入数据
未知
2023-06-10 11:23:06
0
问题描述:

      最近用thinkphp5做项目,要用excel表格导出数据。tp5还是第一次使用,在网上找了好多方法,现在把成功后的使用步骤分享一下。
      按照步骤来,很简单的。

解决办法:
第一步:从https://github.com/PHPOffice/PHPExcel下载PHPExcel,并将解压的文件中的Classes文件夹重命名为PHPExcel,然后复制到根目录下‘vendor’文件夹中。





第二步:在控制器中创建excel.php文件,或者直接复制 public function export方法放在导出按钮的控制器里面。


<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
class Excel extends Controller
{
  //导出excel
 public function export(){

        $xlsData = Db::name('company')->select();
        Vendor('PHPExcel.PHPExcel');//调用类库,路径是基于vendor文件夹的
        Vendor('PHPExcel.PHPExcel.Worksheet.Drawing');
        Vendor('PHPExcel.PHPExcel.Writer.Excel2007');
        $objExcel = new \PHPExcel();
        //set document Property
        $objWriter = \PHPExcel_IOFactory::createWriter($objExcel, 'Excel2007');

        $objActSheet = $objExcel->getActiveSheet();
        $key = ord("A");
        $letter =explode(',',"A,B,C,D,E,F");
        $arrHeader = array('公司名称','联系人','手机号','QQ','公司描述','备注');
        //填充表头信息
        $lenth =  count($arrHeader);
        for($i = 0;$i < $lenth;$i++) {
            $objActSheet->setCellValue("$letter[$i]1","$arrHeader[$i]");
        };

        //填充表格信息
        foreach($xlsData as $k=>$v){
            $k +=2;
            $objActSheet->setCellValue('A'.$k,$v['company_name']);
            $objActSheet->setCellValue('B'.$k, $v['linkman']);
            $objActSheet->setCellValue('C'.$k, $v['telphone']);
            $objActSheet->setCellValue('D'.$k, $v['qq']);
            $objActSheet->setCellValue('E'.$k, $v['description']);
            $objActSheet->setCellValue('F'.$k, $v['notes']);

           // 对图片进行判断
            if(!empty($v['imgsrc'])){
                $image = $v['imgsrc'];
                if( @fopen($image , 'r' ) ) {
                    $objDrawing = new \PHPExcel_Worksheet_Drawing();
                    $objDrawing->setPath($image);
                    // 设置图片的宽度
                    $objDrawing->setHeight(50);
                    $objDrawing->setWidth(50);
                    $objDrawing->setCoordinates('F' . $k);
                    $objDrawing->setWorksheet($objExcel ->getActiveSheet());
                }
            }

            // 表格高度
            $objActSheet->getRowDimension($k)->setRowHeight(20);
        }

        $width = array(10,15,20,25,30,20);
        //设置表格的宽度
        $objActSheet->getColumnDimension('A')->setWidth($width[0]);
        $objActSheet->getColumnDimension('B')->setWidth($width[1]);
        $objActSheet->getColumnDimension('C')->setWidth($width[2]);
        $objActSheet->getColumnDimension('D')->setWidth($width[3]);
        $objActSheet->getColumnDimension('E')->setWidth($width[4]);
        $objActSheet->getColumnDimension('F')->setWidth($width[5]);       

        $outfile = "公司信息列表.xlsx";
        ob_end_clean();
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        header('Content-Disposition:inline;filename="'.$outfile.'"');
        header("Content-Transfer-Encoding: binary");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Pragma: no-cache");
        $objWriter->save('php://output');
    }


//导入excel文件
    public function import(){

        Vendor('PHPExcel.PHPExcel');//调用类库,路径是基于vendor文件夹的
        Vendor('PHPExcel.PHPExcel.IOFactory.PHPExcel_IOFactory');//调用类库,路径是基于vendor文件夹的
        Vendor('PHPExcel.PHPExcel.Reader.Excel5');//调用类库,路径是基于vendor文件夹的
       
        $file = request()->file('excel');
      //$file = request()->file('file');//如果前端框架是layui
      if(is_null($file)){         
           // return json_encode(["code" => 1001, "msg" => "请先选择文件再点击上传"]);//如果前端框架是layui
                     
                      $this->error('请先选择文件再点击上传');
        }
        $save_path = ROOT_PATH . 'public/excel/';

        $info = $file->move($save_path); //print_r($info);exit;
        $filename=$save_path . DIRECTORY_SEPARATOR . $info->getSaveName();
        if(file_exists($filename)) {
        //如果文件存在
            if( strstr($filename,'.xlsx')) {
                $PHPReader = new \PHPExcel_Reader_Excel2007();
            } else {
                $PHPReader = new \PHPExcel_Reader_Excel5();

            } //载入excel文件

            $PHPExcel = $PHPReader->load($filename);

            $sheet = $PHPExcel->getActiveSheet(0);//获得sheet
            $highestRow = $sheet->getHighestRow(); // 取得共有数据数
            $data=$sheet->toArray();//转换为数组格式
                       array_shift($excel_array);  //删除第一个数组(标题);
            //从数据库获取数据
            for($i=0;$i<$highestRow-1;$i++){
                $user['company_name']=trim($data[$i][0]);
                $user['linkman']=trim($data[$i][1]);
                $user['telphone']=trim($data[$i][2]);
                $user['qq']=trim($data[$i][3]);
                $user['address']=trim($data[$i][4]);
                $user['description']=trim($data[$i][5]);
                $map['company_name']=trim($data[$i][0]);
                $map['linkman']=trim($data[$i][1]);
            //第二栏 检测数据库中是否存在相同数据
                $data_list=Db::name("company")->where($map)->find();
                if(!$data_list){ 
                   $new_datas[] = $user;
                } else {
                   $new_datas =array();
                }
            }

            if(!empty($new_datas)){
                db('company')->insertAll($new_datas, true);
                $this->success('成功上传' . count($new_datas) . '条数据。有'.($highestRow-count($new_datas)).'无效数据。','collect/index');
                            //return json_encode(["code" => 1000, "msg" => '成功上传' . count($new_datas) . '条数据。有'.($highestRow-count($new_datas)).'无效数据。']);//layui


            }else{
                $this->error('上传'.($highestRow-count($new_datas)).'条无效数据。');
                //return json_encode(["code" => 1001, "msg" =>'上传'.($highestRow-count($new_datas)).'条无效数据。']);//layui


            }
        }else{
            return array("resultcode" => -5, "resultmsg" => "文件不存在", "data" => null);
            //return json_encode(["code" => 1001, "msg" => "文件不存在"]);//layui


        }
    }
}

?>

第三步:在视图页面中,action路径要写正确。

//导出页面代码
<form action="__MODULE__/excel/export" enctype="multipart/form-data" method="post">

   <input type="submit" value="导出">

</form>

//导入页面代码
<form method="post" action="{:url('student/savestudentImport')}" class="form-signin" enctype="multipart/form-data" >

    <input name="excel" type="file" class="form-control">

    <button class="btn btn-lg btn-primary btn-block" type="submit">导入</button>

</form>
//如果前端框架使用的是layui
//html
<button type="button" class="layui-btn" id="test1">
   <i class="layui-icon">&#xe67c;</i>上传excel
</button>
//js
        layui.use(['table','upload'], function(){
            var table = layui.table;
            var tableIn=null;
             var upload = layui.upload;
   
              //执行实例
            var uploadInst = upload.render({
                elem: '#test1' //绑定元素
                ,url: '/admin/wash/xng_import' //上传接口
                ,method:'post'
                ,accept:'file'
                ,exts:'xls|xlsx'
                ,done: function(res){
                  //上传完毕回调
                  console.log(res);
                     if(res.code==1){
                     layer.msg(res.msg,{icon:6});
                                                 tableIn.reload({
                            page:{curr:1}
                            ,where:{}
                        })
                    }else{
                     layer.msg(res.msg,{icon:5});
                    }
                }
                ,error: function(){
                  //请求异常回调
                }
            });
     });

注意:1,如果出现is not recognised as an OLE file这样的问题,虽然这个文件是一个xls扩展名,但这是一个“假”的Excel文件。如果您在文本编辑器打开该文件你会发现它可能是一个HTML文件。解决办法是:另存为这个文件.xls或者.xlsx。
2,php Class 'ZipArchive' not found  遇到这个问题就可以换一下excel格式,excel5替换为excel2007,或者互换试试


相关内容

thinkphp5用php...
问题描述: 最近用thinkphp5做项目,要用excel表格导出...
2023-06-10 11:23:06

热门资讯

tp5 jquery判断手机端... application--common.php中添加如下代码 //函数作用是判断用户打开的是手机端还...
Laravel 5.5 .No... 创建了新的laravel项目后, 运行提示:No application encryption ke...
php 打印date函数出现错... 问题描述: 我使用的是phpstudy,在练习时间函数的时候,打印出现在的时间,date(Y-m-d...
生成随机字符唯一标识符guid... /** * @param $length * @return string * 生成随机字符串 */...
layui缩略图 div class=layui-form-item label class=layui-form-l...
php函数substr_rep... php函数substr_replace从某个位置替换或删除或插入字符串
Laravel 引入自定义类库... 强烈建议引入的类 都是含有命名空间的,这样使用起来就不会出现重名的情况。!!当然,没有命名空间也可以...
object json转化为数... //调用api 程序,通知商户订单异常 20200314 public function callt...
Laravel 查看SQL操作... 方法一:临时打印操作记录 DB::connection()-enableQueryLog(); # ...
php银行开放平台接口:pfx... 问题描述: 对接易通银行,他们的服务开放平台是java开发,而我的是php,现在需要php版本的SD...