PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)


Posted in PHP onNovember 19, 2019

今天接到了一个从Excel内读取图片的需求,在网上查找了一些资料,基本实现了自己的需求,不过由于查到的一些代码比较久远,不能直接移植到自己的项目里,需要稍加改动一下。

这里介绍一下分别使用phpspreadsheet和PHPExcel扩展库来实现读取Excel内图片的功能:

PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库) 

PHPSpreadsheet

首先安装phpspreadsheet,由于线上服务器PHP版本是PHP5.6,所以需要安装兼容PHP5.6的版本,这里安装1.8.2版本

composer require phpoffice/phpspreadsheet=1.8.2

然后就可以在项目里使用了

use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\IOFactory;
$imageFilePath = './uploads/imgs/'; //图片本地存储的路径
if (!file_exists($imageFilePath)) { //如果目录不存在则递归创建
 mkdir($imageFilePath, 0777, true);
}
try {
 $inputFileName = './files/1.xlsx'; //包含图片的Excel文件
 $objRead = IOFactory::createReader('Xlsx');
 $objSpreadsheet = $objRead->load($inputFileName);
 $objWorksheet = $objSpreadsheet->getSheet(0);
 $data = $objWorksheet->toArray();
 foreach ($objWorksheet->getDrawingCollection() as $drawing) {
  list($startColumn, $startRow) = Coordinate::coordinateFromString($drawing->getCoordinates());
  $imageFileName = $drawing->getCoordinates() . mt_rand(1000, 9999);
  switch ($drawing->getExtension()) {
   case 'jpg':
   case 'jpeg':
    $imageFileName .= '.jpg';
    $source = imagecreatefromjpeg($drawing->getPath());
    imagejpeg($source, $imageFilePath . $imageFileName);
    break;
   case 'gif':
    $imageFileName .= '.gif';
    $source = imagecreatefromgif($drawing->getPath());
    imagegif($source, $imageFilePath . $imageFileName);
    break;
   case 'png':
    $imageFileName .= '.png';
    $source = imagecreatefrompng($drawing->getPath());
    imagepng($source, $imageFilePath, $imageFileName);
    break;
  }
  $startColumn = ABC2decimal($startColumn);
  $data[$startRow-1][$startColumn] = $imageFilePath . $imageFileName;
 }
 dump($data);die();
} catch (\Exception $e) {
 throw $e;
}
public function ABC2decimal($abc)
{
 $ten = 0;
 $len = strlen($abc);
 for($i=1;$i<=$len;$i++){
  $char = substr($abc,0-$i,1);//反向获取单个字符
  $int = ord($char);
  $ten += ($int-65)*pow(26,$i-1);
 }
 return $ten;
}

可以看到,图片被读取并存到了本地服务器中

PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库) 

PHPExcel

PHPExcel实现从Excel文件里读取内容的方法和phpspreadsheet几乎一样,毕竟phpspreadsheet就是在PHPExcel基础上写的,不过PHPExcel由于已经被废弃了,所以建议优先使用phpspreadsheet,如果原来项目里一直使用了PHPExcel也可以继续使用PHPExcel的方法

use PHPExcel_IOFactory;
use PHPExcel_Cell;
try {
 $inputFileName = './files/1.xlsx';
 $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
 $objReader = PHPExcel_IOFactory::createReader($inputFileType);
 $objPHPExcel = $objReader->load($inputFileName);
} catch (\Exception $e) {
 die('加载文件发生错误:"'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());
}
$sheet = $objPHPExcel->getSheet(0);
$data = $sheet->toArray(); //该方法读取不到图片,图片需单独处理
$imageFilePath = './uploads/imgs/'; //图片本地存储的路径
if (!file_exists($imageFilePath)) {
 mkdir($imageFilePath, 0777, true);
}
//处理图片
foreach ($sheet->getDrawingCollection() as $img) {
 list($startColumn, $startRow) = PHPExcel_Cell::coordinateFromString($img->getCoordinates()); //获取图片所在行和列
 $imageFileName = $img->getCoordinates() . mt_rand(1000, 9999);
 switch($img->getExtension()) {
  case 'jpg':
  case 'jpeg':
   $imageFileName .= '.jpeg';
   $source = imagecreatefromjpeg($img->getPath());
   imagejpeg($source, $imageFilePath.$imageFileName);
   break;
  case 'gif':
   $imageFileName .= '.gif';
   $source = imagecreatefromgif($img->getPath());
   imagejpeg($source, $imageFilePath.$imageFileName);
   break;
  case 'png':
   $imageFileName .= '.png';
   $source = imagecreatefrompng($img->getPath());
   imagejpeg($source, $imageFilePath.$imageFileName);
   break;
 }
 $startColumn = ABC2decimal($startColumn);
 $data[$startRow-1][$startColumn] = $imageFilePath . $imageFileName;
}
var_dump($data);
public function ABC2decimal($abc)
{
 $ten = 0;
 $len = strlen($abc);
 for($i=1;$i<=$len;$i++){
  $char = substr($abc,0-$i,1);//反向获取单个字符
  $int = ord($char);
  $ten += ($int-65)*pow(26,$i-1);
 }
 return $ten;
}

 总结

以上所述是小编给大家介绍的PHP读取Excel内的图片,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

PHP 相关文章推荐
php mssql 日期出现中文字符的解决方法
Mar 10 PHP
PHP5中新增stdClass 内部保留类
Jun 13 PHP
php define的第二个参数使用方法
Nov 04 PHP
php 生成短网址原理及代码
Jan 23 PHP
php面向对象中static静态属性与方法的内存位置分析
Feb 08 PHP
PHP常用处理静态操作类
Apr 03 PHP
php中 ob_start等函数截取标准输出的方法
Jun 22 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
php无限级分类实现方法分析
Oct 19 PHP
php实现和c#一致的DES加密解密实例
Jul 24 PHP
详解PHP 7.4 中数组延展操作符语法知识点
Jul 19 PHP
使用PHP开发留言板功能
Nov 19 #PHP
关于Laravel参数验证的一些疑与惑
Nov 19 #PHP
php传值和传引用的区别点总结
Nov 19 #PHP
php 使用 __call实现重载功能示例
Nov 18 #PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 #PHP
php 多继承的几种常见实现方法示例
Nov 18 #PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 #PHP
You might like
PHP观察者模式原理与简单实现方法示例
2017/08/25 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
浅谈php调用python文件
2019/03/29 PHP
javascript cookies操作集合
2010/04/12 Javascript
js 获取Listbox选择的值的代码
2010/04/15 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
AngularJS基础知识
2014/12/21 Javascript
jQuery中add()方法用法实例
2015/01/08 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
vue.js 实现点击展开收起动画效果
2018/07/07 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
vue 计算属性和侦听器的使用小结
2021/01/25 Vue.js
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
详解Python中第三方库Faker
2020/09/25 Python
python用Configobj模块读取配置文件
2020/09/26 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
高中学生期末评语
2014/04/25 职场文书
经管应届生求职信范文
2014/05/18 职场文书
授权委托书怎么写
2014/09/25 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
重阳节活动主持词
2015/07/04 职场文书
学校食堂管理制度
2015/08/04 职场文书
三八节祝酒词
2015/08/11 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书