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 数组遍历的差异(array_diff 的实现)
Mar 23 PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
使用PHP实现蜘蛛访问日志统计
Jul 05 PHP
PHP实现今天是星期几的几种写法
Sep 26 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
Oct 21 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
Aug 19 PHP
PHP 的Opcache加速的使用方法
Dec 29 PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 PHP
php从数据库中获取数据用ajax传送到前台的方法
Aug 20 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 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数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
Extjs中常用表单介绍与应用
2010/06/07 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
Node.js 8 中的重要新特性
2017/06/28 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
微信分享invalid signature签名错误踩过的坑
2020/04/11 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
Django实现学生管理系统
2019/02/26 Python
python实践项目之监控当前联网状态详情
2019/05/23 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
python进行参数传递的方法
2020/05/12 Python
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
遗嘱继承公证书
2014/04/09 职场文书
年终工作总结范文2014
2014/11/27 职场文书
社区党建工作总结2015
2015/05/13 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
汉语拼音教学反思
2016/02/22 职场文书
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server