主页   文章   ThinkPHP5  

通过PHPExcel导入导出表格,再打印的方法

时间:2018-10-07 21:03

导入

注:导出不要使用ajax,不然会中途会乱码

PHPExcel放入位置

  1. ExcelToArrary.php放入thinkphp\library\think\文件夹目录下。

  2. PHPExcel文件夹PHPExcel.php放入vendor文件夹目录下。

  3. PHPExcel

  4. PHPExcel-Github

实现流程

进入action表单里的控制器

    //导入

    public function dc()
    {
        return $this->fetch();
    }
        public function drPost()
    {
        if (!empty ($_FILES ['file_stu'] ['name'])) {
            $tmp_file = $_FILES ['file_stu'] ['tmp_name'];
            $file_types = explode(".", $_FILES ['file_stu'] ['name']);
            $file_type = $file_types [count($file_types) - 1];
            /*判别是不是.xls文件,判别是不是excel文件*/
            if (strtolower($file_type) != "xlsx") {
                $this->error('文件格式错误');
            }
            /*设置上传路径*/
            /*百度有些文章写的上传路径经过编译之后斜杠不对。不对的时候用大写的DS代替,然后用连接符链接就可以拼凑路径了。*/
            $savePath = ROOT_PATH . 'public' . DS . 'excel' . DS;/*以时间来命名上传的文件*/
            $str = date('Ymdhis');
            $file_name = $str . "." . $file_type;

            /*是否上传成功*/

            if (!copy($tmp_file, $savePath . $file_name)) {
                $this->error('上传失败');
            }
            /*
            *对上传的Excel数据进行处理生成编程数据,这个函数会在下面第三步的ExcelToArray类中
            *注意:这里调用执行了第三步类里面的read函数,把Excel转化为数组并返回给$res,再进行数据库写入
            */
            /*require THINK_PATH.'library/think/ExcelToArrary.php';//导入excelToArray类*/
            /*引入这个类试了百度出来的好几个方法都不行。最后简单粗暴的使用了require方式。这个类想放在哪里放在哪里。只要路径对就行。*/

            $ExcelToArrary = new \think\ExcelToArrary();/*实例化*/
            $res=$ExcelToArrary->read($savePath.$file_name,"UTF-8",$file_type);/*传参,判断office2007还是office2003*/

            /*对生成的数组进行数据库的写入*/
            foreach ($res as $k => $v) {
                if ($k > 3) {
                    $data[$k]['user_login'] = $v[0];
                    $data[$k]['sex'] = $v[1];
                    $data[$k]['user_pass'] = cmf_password($v[2]);
                    $data[$k]['birthday'] = $v[3];
                    $data[$k]['user_email'] = $v[11];
                }
            }
            /*插入的操作最好放在循环外面*/
            /*foreach ($res as $k => $v) {
                if ($k > 2) {
                    $data1[$k]['id_card'] = $v[1];
                    $data1[$k]['class'] = $v[3];
                    $data1[$k]['fdy_name'] = $v[4];
                    $data1[$k]['fdy_tel'] = $v[5];
                    $data1[$k]['yx'] = $v[6];
                    $data1[$k]['user_xh'] = $v[7];
                    $data1[$k]['province'] = $v[8];
                    $data1[$k]['current'] = $v[9];

                }
            }*/
            $result = db::name('user')->insertAll($data);
            if($result){
               /* db::name('student')->insertAll($data1);*/
                $this->success('成功导入'.$result.'条数据!');
            }else{
                $this->error('导入失败');
            }

        }
    }


$k>2是因为第一列要写对应的数据库字段,第二列是execl字段备注


导出

控制器

public function dcPost()
    {
        //导出

        $path = dirname(__FILE__); /*找到当前脚本所在路径*/
        vendor("PHPExcel.PHPExcel");
        vendor("PHPExcel.Writer.IWriter");
        vendor("PHPExcel.Writer.Abstract");
        vendor("PHPExcel.Writer.Excel5");
        vendor("PHPExcel.Writer.Excel2007");
        vendor("PHPExcel.IOFactory");
        $objPHPExcel = new \PHPExcel();
        $objWriter = new \PHPExcel_Writer_Excel5($objPHPExcel);
        $objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);


        // 实例化完了之后就先把数据库里面的数据查出来

        $sql = Db::name('student_service')->select();
        /*$content = file_get_contents("http://www.kuaidi100.com/query?type=ems&postid={$sql['ems']}");
        $arr=json_decode($content,true);

        function imp($tree, $children='childs') {
            $imparr = array();
            foreach($tree as $w) {
                if(isset($w[$children])) {
                    $t = $w[$children];
                    //unset($w[$children]);
                    $imparr[] = $w;
                    if(is_array($t)) $imparr = array_merge($imparr, imp($t, $children));
                } else {
                    $imparr[] = $w;
                }
            }
            return $imparr;
        }


        $n=imp($arr);*/

        //合并单元格

        $objPHPExcel->getActiveSheet()->mergeCells('A1:K1');

        // 设置表头信息

        $objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', '录取数据')
            ->setCellValue('A2', '姓名')
            ->setCellValue('B2', '考生号');

        /*--------------开始从数据库提取信息插入Excel表中------------------*/

        $i=3;  /*定义一个i变量,目的是在循环输出数据是控制行数*/
        $count = count($sql);  /*计算有多少条数据*/
        for ($i = 3; $i getActiveSheet()->setCellValue('A' . $i, $sql[$i-3]['id_card']." ");
            $objPHPExcel->getActiveSheet()->setCellValue('B' . $i, $sql[$i-3]['zx_tel']);
            $objPHPExcel->getActiveSheet()->setCellValue('C' . $i, $sql[$i-3]['email']);

        }
        //加边框
        $styleThinBlackBorderOutline = array(
            'borders' => array (
                'outline' => array (
                    'style' => \PHPExcel_Style_Border::BORDER_THIN,  /*设置border样式*/
                    /*'style' => PHPExcel_Style_Border::BORDER_THICK, 另一种样式*/
                    'color' => array ('argb' => 'FF000000'),     /*设置border颜色*/
                ),
            ),
        );
        $objPHPExcel->getActiveSheet()->getStyle( 'A2:k10')->applyFromArray($styleThinBlackBorderOutline);


        // 将A1单元格设置为加粗,居中

        $styleArray1 = array(
            'font' => array(
                'bold' => true,
                'size'=>12,
                'color'=>array(
                    'argb' => '00000000',
                ),
            ),
            'alignment' => array(
                'horizontal' => \PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
            ),
        );
        // 将A1单元格设置为加粗,居中

        $objPHPExcel->getActiveSheet()->getStyle('A1')->applyFromArray($styleArray1);

        $objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setBold(true);



        /*--------------下面是设置其他信息------------------*/

        $objPHPExcel->getActiveSheet()->setTitle('productaccess');      /*设置sheet的名称*/
        $objPHPExcel->setActiveSheetIndex(0);                   /*设置sheet的起始位置*/
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');   /*通过PHPExcel_IOFactory的写函数将上面数据写出来*/

        $PHPWriter = \PHPExcel_IOFactory::createWriter( $objPHPExcel,"Excel2007");

        header('Content-Disposition: attachment;filename="设备列表.xlsx"');
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

        $PHPWriter->save("php://output"); /*表示在$path路径下面生成demo.xlsx文件*/

    }


前台导出按钮

如果导出比较长的数字时,比如身份证就会出现`3.6E+27`,可以在后面加个空格`$objPHPExcel->getActiveSheet()->setCellValue('B' . $i, $sql[$i-3]['id_card']." ")

上一篇没有了
  评论





你还可以输入255

提交
返回顶部