Thinkphp利用execl实现批量导入和导出

转自:https://www.cnblogs.com/shenlin/p/7826664.html

准备工作:

1、tp环境(本人使用的是tp3.2)。

2、phpexecl扩展包,下载地址:点击下载,下载地址(class.php):

1

<a href="http://www.ediut.com/soft/PHPExcel.class.rar"/>点击下载a>

  

官方地址:点击下载(github下载地址) 。

3、下载扩展包,解压后,放在ThinkPHP\Library\Org\Util目录下,最终目录结构为:ThinkPHP\Library\Org\Util\PHPExcel,将下载的包解压后.放在Util下。

写代码:

1、导出代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

//批量导出数据

public function batch_out(){

    // 清空(擦除)缓冲区并关闭输出缓冲

    ob_end_clean();

    //引入PHPExcel库文件

    import("Org.Util.PHPExcel");

    //创建对象

    $excel new \PHPExcel();

    $excel->getActiveSheet()->setTitle('投诉列表');

    // 设置单元格高度

    // 所有单元格默认高度

    $excel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(25);

    // 第一行的默认高度

    $excel->getActiveSheet()->getRowDimension('1')->setRowHeight(30);

    // 垂直居中

    $excel->getActiveSheet()->getDefaultStyle()->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);

    // 设置水平居中

    $excel->getActiveSheet()->getDefaultStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

    //Excel表格式

    $letter array('A','B','C','D','E','F','F','G','H');

    //设置表头

    $tableheader array('序号','插入时间 ','修改时间','数据状态','姓名','登录ip','登录城市','登录时间');

    //设置表头表格宽度

    $tablestyle array(

        array('width'=>'5'),    //序号

        array('width'=>'15'),   //插入时间

        array('width'=>'15'),   //修改时间

        array('width'=>'15'),   //数据状态

        array('width'=>'10'),   //姓名

        array('width'=>'10'),   //登录ip

        array('width'=>'20'),   //登录城市

        array('width'=>'10'),   //登录时间

    );

    //填充表头信息

    for($i = 0;$i count($tableheader);$i++) {

        $excel->getActiveSheet()->setCellValue("$letter[$i]1","$tableheader[$i]");

        $excel->getActiveSheet()->getColumnDimension($letter[$i])->setWidth($tablestyle[$i]['width']);

    }

    //写入数据,查询所有的数据

    $ResultInfo = D('Record')->select();

    //填充表格信息

    for ($i = 2;$i <= count($ResultInfo) + 1;$i++) {

        $j = 0;

        foreach ($ResultInfo[$i - 2] as $key=>$value) {

            $excel->getActiveSheet()->setCellValue("$letter[$j]$i","$value");

            $j++;

        }

    }

    //直接下载的代码

    $write new \PHPExcel_Writer_Excel5($excel);

    $write->save($filename);

    header("Pragma: public");

    header("Expires: 0");

    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;charset=utf-8");

    header("Content-Type:application/octet-stream");

    header("Content-Type:application/download");

    header('Content-Disposition:attachment;filename='.date('Y-m-d H:i:s').'.xls');

    header("Content-Transfer-Encoding:binary");

    $write->save('php://output');

}

  

导出结果截图

Thinkphp利用execl实现批量导入和导出_第1张图片

 

2、导入代码

复制代码

//批量导入数据
public function batch_in(){
    //上传文件-获取文件信息
    $info = $this->execl_upload();//获取文件路径
    $File_Name = $info['batch']['savepath'].$info['batch']['savename'];//存放位置
    $exts = $info['batch']['ext'];//获取文件后缀
    //引入第三方类
    import("Org.Util.PHPExcel");
    $PHPExcel = new \PHPExcel();
    if($exts == 'xls'){
        import("Org.Util.PHPExcel.Reader.Excel5");
        $PHPReader=new \PHPExcel_Reader_Excel5();
    }else if($exts == 'xlsx'){
        import("Org.Util.PHPExcel.Reader.Excel2007");
        $PHPReader=new \PHPExcel_Reader_Excel2007();
    }else if($exts == 'csv'){
        import("Org.Util.PHPExcel.Reader.CSV");
        $PHPReader=new \PHPExcel_Reader_CSV();
    }
    //载入文件
    $PHPExcel = $PHPReader->load($File_Name,$encode="utf-8");
    //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
    $currentSheet=$PHPExcel->getSheet(0);
    //获取总列数
    $allColumn=$currentSheet->getHighestColumn();
    //获取总行数
    $allRow=$currentSheet->getHighestRow();
    //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
    for($currentRow=2;$currentRow<=$allRow;$currentRow++){
        //从哪列开始,A表示第一列
        for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){
            //数据坐标
            $address=$currentColumn.$currentRow;
            //读取到的数据,保存到数组$arr中
            $data[$currentRow][$currentColumn]=$currentSheet->getCell($address)->getValue();
        }
    }
    $number_true = 0;
    $number_error=0;
    //遍历成数据库字段,便于执行
    foreach ($data as $key => $value) {
        //$data_info[$key]['id'] = $data[$key]['A'];
        $data_info[$key]['inputtime'] =$data_info[$key]['signtime'] =  $data[$key]['B'];
        $data_info[$key]['updatetime'] = $data[$key]['C'];
        $data_info[$key]['display'] = $data[$key]['D'];
        $data_info[$key]['name'] = $data[$key]['E'];
        $data_info[$key]['signip'] = $data[$key]['F'];
        $data_info[$key]['signcity'] = $data[$key]['G'];
        //如果出现空的情况,就删除
        if($data_info[$key]['name'] == null){
            unset($data_info[$key]);
        }
        //连接数据库,导入数据
        $ResultInfo =  D('Record')->create($data_info[$key]);
        if($ResultInfo){
            if( D('Record')->add($data_info[$key])){
                $number_true++;
            }else{
                $number_error++;
            }
        }

    }
    if($number_true >1){
        $this->success('导入成功',U('Result/result'));
    }else{
        $this->error("导入失败");
    }
}

复制代码

 

导入结果截图

Thinkphp利用execl实现批量导入和导出_第2张图片

 

3、文件上传代码

复制代码

//execl上传
function execl_upload(){
    $uplode= new \Think\Upload();//造实例化对象:造一个上传文件的类
    $uplode->maxSize="31457280";//上传文件的大小
    $uplode->exts=array('xls','xlsx','csv');//设置图片格式
    $uplode->autoSub=true;//自动使用子目录保存上传文件 默认为true
    $uplode->subName=array('date','Ymd');//文件命名方式已时期时间戳命名
    $uplode->rootPath="./";//表示在public文件夹下
    $uplode->savePath="Public/Uploads/Execl/";//设置附件上传目录:表示在public文件夹下自动建一个Uploads文件夹
    // 上传文件
    $info   =   $uplode->upload();
    if(!$info)
    {
        // 上传错误提示错误信息
        $this->error($uplode->getError());
    }else{
        // 上传成功 获取上传文件信息
        return $info;
    }
}

你可能感兴趣的:(后端)