PHPExcel基本使用(2) 导入图片

一、效果

二、代码

  • 基于thinkphp5.1
<?php

namespace app\index\controller;

use think\facade\Env;

class Test
{
    public function test()
    {
        self::excelAction();
    }

    /**
     * @todo 导出报表
     */
    public function excelAction()
    {
        $objPHPExcel = new \PHPExcel();      //实例化Excel类,通过composer.json安装

        $titleArray = [['头像', '姓名', '性别', '爱好', '时间', 'ID']];    //设置标题
        $data = $this->getData();    //获取详情数据
        $lastData = array_merge($titleArray, $data);    //追加标题和详情数据

        //定义每一行的列数据, $key =>$val $key:二维数组中一维数组的数据(下标从0开始);$val:Excel列的名字。综合:数组下标对应的每一列的字母。
        $cols = self::getCols(count($titleArray[0]));
        $lastCol = end($cols);

        $k = 0;    //需要执行 Excel 哪一行
        foreach ($lastData as $val) {
            $k++;    //从第一行开始,每执行一行自增一次
            foreach ($cols as $_k => $_v) {    //for循环,每执行一次就生成一行Excel数据
                if ($k != 1) {    //第二行才有头像,需要写入图片
                    //设置除第一行的高宽
                    $objPHPExcel->getActiveSheet()->getColumnDimension($_v)->setWidth(20);    //设置这一行表格宽度
                    $objPHPExcel->getActiveSheet()->getRowDimension($k)->setRowHeight(80);    //设置这一行表格高度

                    if ($_k == 0) {    //数组下标为0,第0列的时候处理图标
                        //$imageObj[$k] 代表每一行,$_k=0 代表的是一维数组下标为0的数据,就是每个一维数组的第一条数据。综合:第一列的所有数据(除第一行的列)。
                        $imageObj[$k] = new \PHPExcel_Worksheet_Drawing();    //实例化Excel画图类
                        /* 下载图片操作 */
                        $url = $this->download($val[$_k]);    //图片的url地址,把线上的图片下载到本地
                        $imageObj[$k]->setPath($url);        //把本地的图片路径设置到Excel中
                        $imageObj[$k]->setHeight(80);        //设置列的高度
                        $imageObj[$k]->setWidth(80);        //设置列的宽度
                        $imageObj[$k]->setCoordinates($_v . $k);//设置图片要插入的单元格
                        $imageObj[$k]->setOffsetX(12);        //图片偏移距离
                        $imageObj[$k]->setOffsetY(12);
                        $imageObj[$k]->setWorksheet($objPHPExcel->getActiveSheet());
                        //unlink($url);    //最后删除文件。
                    } else {
                        //如果数字字符串不是很长,可以这样写
                        $objPHPExcel->getActiveSheet()->setcellvalue($_v . $k, $val[$_k]);
                        //用于解决字符串显示问题
                        //在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号。
                        $objPHPExcel->getActiveSheet()->setCellValueExplicit($_v . $k, $val[$_k], \PHPExcel_Cell_DataType::TYPE_STRING);
                    }
                } else {    //第一行数据,直接写入
                    //如果数字字符串不是很长,可以这样写
                    $objPHPExcel->getActiveSheet()->setcellvalue($_v . $k, $val[$_k]);
                    //字体加粗
                    $objPHPExcel->getActiveSheet()->getStyle($_v . $k)->getFont()->setBold(true);
                    //用于解决字符串显示问题
                    //在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号。
                    $objPHPExcel->getActiveSheet()->setCellValueExplicit($_v . $k, $val[$_k], \PHPExcel_Cell_DataType::TYPE_STRING);
                }
            }
        }

        //设置内容垂直居中
        $objPHPExcel->getActiveSheet()->getStyle("A1:{$lastCol}{$k}")->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);

        //最后通过浏览器输出
        //$fn = getUniName()."导出信息.xls";
        //$fn =	APP_PATH."/data/log/订单列表(".date("Y.m.d H:i").").xls";
        $fn = "订单列表(" . date("Y.m.d.H.i.s") . ").xls";
        header('Content-Type: application/vnd.ms-excel; charset=utf-8');
        header("Content-Disposition: attachment;filename=$fn");
        header('Cache-Control: max-age=0');
//        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
        $objWriter->save('php://output');
        exit;
    }

    /**
     * 返回数据
     * @return array
     */
    public function getData()
    {
        $photo = 'http://www.pptbz.com/pptpic/UploadFiles_6909/201203/2012031220134655.jpg';
        $data = array(
            array($photo, '张三', '男', '吃', '2019-03-20', '123456789876543'),
            array($photo, '李四', '男', '喝', '2019-03-21', '123456789034455'),
            array($photo, '王五', '男', '玩', '2019-03-22', '987654321234567'),
        );

        return $data;
    }

    /**
     * 获取列的所有英文符号信息
     * @param int $count 列的数量
     * @return array 列名一维数组,例如 array ( 0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D', 4 => 'E', 5 => 'F', )
     */
    public static function getCols($count)
    {
        $columnFlag = [
            0 => 'Z', 1 => 'A', 2 => 'B', 3 => 'C', 4 => 'D', 5 => 'E', 6 => 'F', 7 => 'G', 8 => 'H',
            9 => 'I', 10 => 'J', 11 => 'K', 12 => 'L', 13 => 'M', 14 => 'N', 15 => 'O', 16 => 'P', 17 => 'Q',
            18 => 'R', 19 => 'S', 20 => 'T', 21 => 'U', 22 => 'V', 23 => 'W', 24 => 'X', 25 => 'Y', 26 => 'Z'
        ];

        if ($count == 0) {
            return [];
        }

        $column = [];
        for ($index = 1; $index <= $count; $index++) {
            if ($index <= 26) {
                $column[] = $columnFlag[$index];
            } else {
                $value = floor($index / 26);
                if ($index % 26 == 0) {
                    $value -= 1;
                }
                $column[] = $columnFlag[$value] . $columnFlag[floor($index % 26)];
            }
        }
        return $column;
    }

    /**
     * 把线上图片下载到本地
     * @param string $url 线上地址
     * @param string $path 保存路径
     * @return string
     */
    function download($url, $path = '/data/excel/')
    {
        $path = Env::get('root_path') . '/public' . $path;    //root_path 项目根目录
        $this->createDirectory($path);    //递归创建文件夹
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        $file = curl_exec($ch);
        curl_close($ch);
        $filename = pathinfo($url, PATHINFO_BASENAME);
        $savePath = $path . $filename;
        if (!file_exists($savePath)) {
            $resource = fopen($savePath, 'a');
            fwrite($resource, $file);
            fclose($resource);
        }
        return $savePath;
    }

    /**
     * 递归创建目录
     * @param string $dir 目录名
     */
    function createDirectory($dir)
    {
        if (!file_exists($dir)) {
            mkdir($dir, 0777, true);
            chmod($dir, 0777);
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值