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

news2024/11/14 2:47:03

  • 一、效果
  • 二、代码

一、效果

  • 基于这篇 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);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Microcontent - 微内容

这两年&#xff0c;微内容不断被人提及。微内容是什么&#xff1f;微内容解决什么问题&#xff1f;今天我们一起来看看这个话题。 作者&#xff1a;Sarah Cuellar - 1 - 什么是微内容 什么是微内容&#xff1f;微内容指的是小块的内容&#xff0c;它们遵循具体的的结构规则…

classnames 源码学习笔记与解读

前言 这里我引用源码文档中的一句话来作为开场白&#xff1a; A simple JavaScript utility for conditionally joining classNames together. 话不多说&#xff0c;咱们直接开始 classnames 的源码学习。 核心源码解读 直接来看它的源码部分&#xff0c;以下这是 classnam…

Win10的几个实用技巧系列之win10和win8系统哪个好用、系统任务栏和窗口假死的解决方法

目录 win10系统任务栏和窗口假死怎么办?win10系统任务栏和窗口假死的解决方法 win10系统任务栏和窗口假死怎么解决 Win10进不去Epic下载的死亡搁浅怎么办?Win10玩死亡搁浅闪退的解决方法 Epic领取的死亡搁浅进不去 Win10玩死亡搁浅闪退的解决方法 win10和win8系统哪个好用…

Eth09- EthCtrlConfig:以太网控制器写MAC地址到NVM中的配置

文章目录 1 MAC地址保存到非易失性存储器中传送门 ==>> AutoSAR入门和实战系列总目录 1 MAC地址保存到非易失性存储器中 如果想把MAC地址保存到非易失性存储器中,防止掉电之后MAC地址不存在了,可以通过以下的配置参数,实现实时保存MAC地址到NVM中 EthCtrlConfig/…

【Effective Objective - C】—— 读书笔记(四)

【Effective Objective - C】—— 读书笔记&#xff08;四&#xff09; 协议与分类 文章目录【Effective Objective - C】—— 读书笔记&#xff08;四&#xff09;协议与分类23.通过委托与数据源协议进行对象间通信要点&#xff1a;24.将类的实现代码分散到便于管理的数个分类…

Friedman 检验后的two-tailed Nemenyi test和the two-tailed Bonferroni-Dunn test的关键值

Critical values qαq_{\alpha}qα​ for post-hoc tests after the Friedman testCritical values qαq_{\alpha}qα​ for the two-tailed Nemenyi test Critical values qαq_{\alpha}qα​ for the two-tailed Bonferroni-Dunn test 其中classifiers是比较的方法个数&#…

【nowcoder】笔试强训Day15

目录 一、选择题 二、编程题 2.1 查找输入整数二进制中1的个数 2.2 手套 一、选择题 1.给出数据表 score(stu-id,name,math,english,Chinese), 下列语句正确的是&#xff08; &#xff09; A. Select sum(math),avg(chinese) from score B. Select *,sum(english) from …

初步改造2

1.找到登录按钮的触发方法 views/login/index.vue 找到是handleLogin 接着发现调用的是vuex里面的user/login方法 2.vuex中的方法&#xff0c;其实对应于"store/modules/user.js 中actions的login方法 3.前端请求与发现无响应&#xff0c;我们先用postman排除是后端问题&a…

Java集合 - HashMap

介绍 HashMap Map 是一种存储键值对的集合。Map 集合可以根据 key 快速查找对应的 value 值。HashMap 是 Map 类型的一中。 HashMap 的底层存储结构是&#xff1a;数组 链表 红黑树。 下面我们通过 HashMap 的新增操作、查找操作来看 HashMap 的底层存储结构。 HashMap 的…

深入理解ConcurrentHashMap1.8源码

1. 概述 之前介绍了ConcurrentHashMap1.7&#xff0c;采用的是数组分段锁的方式来实现的。虽然说采用分段锁的方式能够在一定程度上提高并发的效率&#xff0c;但是锁的粒度是Segment级别的&#xff0c;其实还是挺大的。 于是&#xff0c;ConcurrentHashMap1.8继续在1.7版本上…

postgresql_internals-14 学习笔记(五)Buffer Cache

新年的第一篇博客~ 一、 Buffer Cache简介 1. 主要用途 调和内存&#xff08;ns级&#xff09;与磁盘&#xff08;ms级&#xff09;间的速度差异。 pg不仅用自己的buffer cache&#xff0c;也用os cache&#xff0c;所以它使用了“双缓存”&#xff0c;这也是很多文档推荐sha…

《UEFI内核导读》UEFI是不是操作系统?

敬请关注微信公众号&#xff1a;“固件C字营” 最近一直在思考一个问题&#xff0c;UEFI是什么&#xff1f;UEFI算不算是操作系统&#xff1f; 众所周知&#xff0c;计算机系统是由软件和硬件两大部分组成的&#xff0c;但从更科学的角度来划分&#xff0c;我们其实可以分得更…

电子学会2020年9月青少年软件编程(图形化)等级考试试卷(四级)答案解析

目录 一、单选题&#xff08;共15题&#xff0c;每题2分&#xff0c;共30分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题【该题由测评师线下评分】&#xff08;共5题&#xff0c;共50分&#xff09; 青少年软件…

【MySQL】说透锁机制(三)行锁升表锁如何避免? 锁表了如何排查?

文章目录前言哪些场景会造成行锁升表锁&#xff1f;如何避免?如何分析排查?查看InnoDB_row_lock%相关变量查看 INFORMATION_SCHEMA系统库总结最后前言 在上文我们曾小小的提到过&#xff0c;在索引失效的情况下&#xff0c;MySQL会把所有聚集索引记录和间隙都锁上&#xff0…

【正点原子】嵌入式Linux C应用编程-第十一章

第十一章&#xff1a;线程 前言&#xff1a; 与进程类似&#xff0c;线程是允许应用程序并发执行多个任务的一种机制&#xff0c;线程参与系统调度&#xff0c;事实上&#xff0c;系统调度的最小单元为线程&#xff0c;而不是进程 1&#xff1a;线程的概念 什么是线程&#xff…

【游戏编程扯淡精粹】自研引擎切 UE

【游戏编程扯淡精粹】自研引擎切 UE UF2022 的两篇讲座&#xff0c;再加上 The Machinery 引擎项目失败 结合过去两年笔者使用自研引擎的体验&#xff0c;其实有一部分是共通的 Crystal Dynamics&#xff1a;如何从自研引擎转变到虚幻引擎5 游戏技术&#xff08;featurelist…

LVGL的学习及使用

1、LVGL简介 LVGL是最受欢迎的免费开源嵌入式图形库&#xff0c;可为任何MCU、MPU和显示器类型创建漂亮的用户界面。使用SquareLine工作室&#xff0c;使用拖放UI编辑器来简化开发。 1.1、LVGL源码下载 lvgl 在github 上的开源代码 https://github.com/lvgl/lvgl 下载的源码包里…

Vue的数据绑定

一、Vue的数据绑定 1、单向数据绑定&#xff1a;将Model绑定到View上&#xff0c;当通过JavaScript代码改变了Model时&#xff0c;View就会自动刷新。不需要进行额外的DOM 操作就可以实现视图和模型的联动 ​ a、数据只保存一份 ​ b、data—->DOM ​ &#xff08;1&am…

在wsl下开发T113的主线linux(3)-写入spinand测试

接下来是烧写入硬件验证&#xff0c;我的板子焊接的是W25N01GV&#xff0c;这里使用xfel&#xff0c;因为支持写入spi-nand。GitHub - xboot/xfel: Tiny FEL tools for allwinner SOC, support RISC-V D1 chipTiny FEL tools for allwinner SOC, support RISC-V D1 chip - GitH…

QML学习笔记【04】:常用控件

1 Repeater与model Window {width: 640; height: 480visible: truetitle: qsTr("Hello World")Column{id: colspacing: 30Repeater{model: 3 //model控制了所有的数据&#xff0c;这里定义了Button的数量Button{width: 100; height: 50text: "btn" index…