zoukankan      html  css  js  c++  java
  • thinkphp5 使用PHPExcel 导入导出

    首先下载PHPExcel类。网上很多,自行下载。

    然后把文件放到vendor文件里面。

    一般引用vendor里面的类或者插件用vendor();

    里面加载的就是vendor文件,然后想要加载哪个文件,直接写就行,中间的“.”相当于文件路径的“/”。

    例如加载excel5这个文件:

    先把html代码贴出来(整个导入导出的):

        <form enctype="multipart/form-data" method="post" id="form-admin-role-add">
            <div class="form-group col-sm-2">
                <input type="file" name="file_stu" />
            </div>
            <div class="form-group col-sm-2">
                <input type="submit" value="导入" class="btn btn-w-m btn-primary btn-outline" />
            </div>
        </form>
    
        <div class="form-group col-sm-2">
            <a class="btn btn-w-m btn-primary btn-outline" href="{:url('EquipmentList/out')}">下载excel表格</a>
        </div>

    这里有个要注意的地方,我导入是做了异步的,导出不能做异步。

    然后先放导入的方法吧:

    //导入Excel
        public function into()
        {
            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('不是Excel文件,重新上传');
                }
                /*设置上传路径*/
                /*百度有些文章写的上传路径经过编译之后斜杠不对。不对的时候用大写的DS代替,然后用连接符链接就可以拼凑路径了。*/
                $savePath = ROOT_PATH . 'public' . DS . 'uploads' . 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 ExcelToArrary();//实例化
                
                $res=$ExcelToArrary->read($savePath.$file_name,"UTF-8",$file_type);//传参,判断office2007还是office2003
               
                /*对生成的数组进行数据库的写入*/
                foreach ($res as $k => $v) {
                    if ($k > 1) {
                        $data[$k]['pname'] = $v[0];
                        $data[$k]['access'] = $v[1];
                       $data[$k]['jointime'] = time();
                    }
                }
    
                
                //插入的操作最好放在循环外面
    
                $result = model('ProductAccess')->insertAll($data);
                
                if($result){
                    return ['state'=>true, 'msg'=>'导入成功'];
                }else{
                    return ['state'=>false, 'msg'=>'导入失败'];
                }
    
            }
    
        }

    这里面有要引入ExcelToArray,代码如下:

    <?php
    namespace think;
    
    use PHPExcel_IOFactory;
    use PHPExcel_Cell;
    use PHPExcel;
    /** 
     * 读取Excel数据
     */
    class ExcelToArrary
    {
        public function __construct() {
            //这些文件需要下载phpexcel,然后放在vendor文件里面。具体参考上一篇数据导出。
            vendor("PHPExcel.PHPExcel.PHPExcel");
            vendor("PHPExcel.PHPExcel.Writer.IWriter");
            vendor("PHPExcel.PHPExcel.Writer.Abstract");
            vendor("PHPExcel.PHPExcel.Writer.Excel5");
            vendor("PHPExcel.PHPExcel.Writer.Excel2007");
            vendor("PHPExcel.PHPExcel.IOFactory");
        }
    
        public function read($filename,$encode,$file_type){
                if(strtolower ( $file_type )=='xls')//判断excel表类型为2003还是2007
                {
                    Vendor("Excel.PHPExcel.Reader.Excel5"); 
                    $objReader = PHPExcel_IOFactory::createReader('Excel5');
                    $objReader = PHPExcel_IOFactory::createReader('Excel5');
    
                }elseif(strtolower ( $file_type )=='xlsx')
                {
                    Vendor("Excel.PHPExcel.Reader.Excel2007"); 
                    $objReader = PHPExcel_IOFactory::createReader('Excel2007');
                }
                $objReader->setReadDataOnly(true);
                $objPHPExcel = $objReader->load($filename);
                $objWorksheet = $objPHPExcel->getActiveSheet();
                $highestRow = $objWorksheet->getHighestRow();
                $highestColumn = $objWorksheet->getHighestColumn();
                $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
                $excelData = array();
                for ($row = 1; $row <= $highestRow; $row++) {
                    for ($col = 0; $col < $highestColumnIndex; $col++) {
                        $excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();
                        }
                }
                return $excelData;
        }
    
    }

    只要类都引入成功了,代码直接贴上去就能用了

    这里改成你自己的。导入就完成啦。

    然后就是导出。

    //导出Excel
        public function out()
        {
            
            //导出
            $path = dirname(__FILE__); //找到当前脚本所在路径
            vendor("PHPExcel.PHPExcel.PHPExcel");
            vendor("PHPExcel.PHPExcel.Writer.IWriter");
            vendor("PHPExcel.PHPExcel.Writer.Abstract");
            vendor("PHPExcel.PHPExcel.Writer.Excel5");
            vendor("PHPExcel.PHPExcel.Writer.Excel2007");
            vendor("PHPExcel.PHPExcel.IOFactory");
            $objPHPExcel = new PHPExcel();
            $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
            $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
    
    
            // 实例化完了之后就先把数据库里面的数据查出来
            $sql = model('ProductAccess')->select();
    
            // 设置表头信息
            $objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', '机型')
            ->setCellValue('B1', '机型编号')
            ->setCellValue('C1', '生产日期');
    
            /*--------------开始从数据库提取信息插入Excel表中------------------*/
    
            $i=2;  //定义一个i变量,目的是在循环输出数据是控制行数
            $count = count($sql);  //计算有多少条数据
            for ($i = 2; $i <= $count+1; $i++) {
                $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, $sql[$i-2]['pname']);
                $objPHPExcel->getActiveSheet()->setCellValue('B' . $i, $sql[$i-2]['access']);
                $objPHPExcel->getActiveSheet()->setCellValue('C' . $i, $sql[$i-2]['jointime']);
            }
    
            
            /*--------------下面是设置其他信息------------------*/
    
            $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文件
            
        }

    这部分相应改成自己的就成了。

    我做这个,遇到的问题也基本就是类引入不成功。只要都引入成功了。就改相应代码就OK了。

  • 相关阅读:
    C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。
    opencv中的vs框架中的Blob Tracking Tests的中文注释。
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
  • 原文地址:https://www.cnblogs.com/yayaa/p/8006919.html
Copyright © 2011-2022 走看看