ThinkPHP5 excel 导入/导出

首先vendor下引入phpexcel

 

 

use phpexcel\phpexcel\Classes\PHPExcel;//excel引入


/**
* excel导入
* @author gyj  <375023402@qq.com>
* @createtime 2018-10-30 10:12:16
* @param $file 导入文件
* @return data
*/
if (!function_exists('import_excel')) {

    function import_excel($file){

        //引入excel类
        vendor('phpexcel.phpexcel.Classes.PHPExcel');

        //判断文件是否存在
        if (!file_exists($file)) {
            die('no file!');
        }

        // 判断文件是什么格式
        $extension = strtolower( pathinfo($file, PATHINFO_EXTENSION) );

        //根据文件类型执行对应的数据获取方法
        if($extension === 'csv'){
            //获取文件内容
            $data=file_get_contents($file);
            $data=explode("\r\n", $data);

            //解析数组
            foreach ($data as $key => $value) {
                if($key > 0){
                    $tmp_data[] = explode(",", $value);
                }
            }

            //将解析结果组装进数组
            $data = $tmp_data;
        }else{
            //设置最大执行时间
            ini_set('max_execution_time', '0');

            //根据文件后缀获取,文件对象
            $inputFileType = PHPExcel_IOFactory::identify($file);
            $objReader = PHPExcel_IOFactory::createReader($inputFileType);
            $objExcel = $objReader->load($file);

            $sheet = $objExcel ->getActiveSheet();


            // 取得总行数 
            $highestRow = $sheet->getHighestDataRow();     
            // 取得总列数,并将列的字母转成数字序号使用      
            $highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestDataColumn()); 

            //循环读取excel文件,读取一条,插入一条
            $data=array();

            
            //从第二行开始读取数据
            for($y=2;$y<=$highestRow;$y++){

                //为空的行 
                $empty_col = 0;

                //从A列读取数据
                for($i=0;$i<$highestColumn;$i++){

                    //将列的数字序号转成字母使用
                    $x = PHPExcel_Cell::stringFromColumnIndex($i);
                    // 读取单元格
                    $value = $sheet->getCell($x.$y)->getValue();

                    //判断单元格数据是否为空
                    if(empty($value)){
                        $empty_col++;
                    }

                    //将单元格数据填充入数组
                    $data[$y-2][]=$value;
                } 

                //判断是否整行为空,如果是 跳出循环
                if($empty_col == $highestColumn){
                    unset($data[$y-2]);
                    break;
                }
            }  
        }
        return $data;
    }
}


/**
* excel导出
* @author gyj  <375023402@qq.com>
* @createtime 2018-10-29 15:01:51
* @param $data 数据源
* @param $filename 文件名
* @param $sheet_title 表头
* @return excel
*/
if (!function_exists('export_excel')) {

    function export_excel($data,$filename,$sheet_title){
        vendor('phpexcel.phpexcel.Classes.PHPExcel');//引入excel类
        $PHPExcel = new \PHPExcel(); //实例化PHPExcel类,类似于在桌面上新建一个Excel表格
        $PHPSheet = $PHPExcel->getActiveSheet(); //获得当前活动sheet的操作对象
        $PHPSheet->setTitle($filename); //给当前活动sheet设置名称
        /*--------------设置表头信息------------------*/
        $x = 'A';
        foreach ($sheet_title as $value) {
            $PHPSheet->setCellValue($x.'1', $value)->getStyle($x.'1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
            $x++;
        }
        /*--------------表格数据填充------------------*/
        $y =2;
        foreach ($data as $value) {
            $x = 'A';
           
            foreach ($value as $val) {
                $PHPSheet->setCellValue($x.$y,$val)->getStyle($x.$y)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                $PHPSheet->getColumnDimension($x)->setAutoSize(true);
                $x++;    
            }
           $y++; 
        }
        $PHPExcelWriter = new \PHPExcel_Writer_Excel2007($PHPExcel);
        /* 生成到浏览器,提供下载 */ 
        ob_end_clean();  //清空缓存             
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
        header("Content-Type:application/force-download");
        header("Content-Type:application/vnd.ms-execl");
        header("Content-Type:application/octet-stream");
        header("Content-Type:application/download");
        header('Content-Disposition:attachment;filename="'.$filename.'.xlsx"');
        header("Content-Transfer-Encoding:binary"); 
        $PHPExcelWriter->save('php://output');
        exit;
    }
}

 

 

调用

//导入
// 获取上传文件表单字段名
$fileKey = array_keys(request()->file());
// 获取表单上传文件
$file = request()->file($fileKey['0']);
// 移动到框架应用根目录/public/uploads/ 目录下
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads' . DS . 'excel');
$path=str_replace('\\','/',$info->getSaveName());
$url = ROOT_PATH . 'public' . DS . 'uploads' . DS . 'excel' . DS.$path;
$data = import_excel($url);
var_dump($data);

//导出
$data = db('device')->field('id,device_no,name')->select();
$title = ["编号","设备序号","名称"];
$res = export_excel($data,"test",$title);
var_dump($res);exit;

 

注意事项:

加载测试文件

下面主要判断Excel2007和Excel5类型,即xlsx/xlsm/xltx/xltm和xls/xlt格式文件

try {
    $inputFileType = PHPExcel_IOFactory::identify($filePath);
    if ($inputFileType !== "Excel5" && $inputFileType !== "Excel2007" ) {
        unlink($filePath) && str_alert(-1,"请确保导入的文件格式正确!");
    }
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
    $objPHPExcel = $objReader->load($filePath);
} catch(Exception $e) {
    unlink($filePath) && str_alert(-1,'加载文件发生错误:”'.pathinfo($filePath,PATHINFO_BASENAME).'”: '.$e->getMessage());
}

获取工作表行数和列数

$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();

注意:有时候你会发现你的表格明明有内容的行数就5行,但是获取到的$highestRow却有7,8行或者更多,这可能是因为你在操作你的表格的时候不小心点击了其它行数,虽然没有填写内容,但getHighestRow也是能够识别出行数;

想要获取有内容的行数应该使用getHighestDataRow和getHighestDataColumn,

源码注释是这样介绍的string Highest row number that contains data,即包含数据的字符串最高行数.

转换时间

 

获取表格中时间格式的内容,需要PHPExcel_Shared_Date::ExcelToPHP()来转换为php可识别的时间格式

date('Y-m-d',PHPExcel_Shared_Date::ExcelToPHP($sometime);

 或者在读取的时候进行处理

读出的时间是天数

excel 的日期是从 1900-01-01 开始计算的(php 是从 1970-01-01)
两者间有一个天数差 25569
时间是格林威治时间
所以有

$d = 25569;
$t = 24 * 60 * 60;
echo gmdate('Y-m-d H:i:s', (41728.732916667 - $d) * $t);

 

本文部分内容摘自:https://blog.csdn.net/weixin_36595597/article/details/81132472

 

posted @ 2018-08-30 14:13  加菲猫and大白  阅读(727)  评论(0编辑  收藏  举报