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 相关文章推荐
真正的ZIP文件操作类(php)
Jul 21 PHP
php教程之phpize使用方法
Feb 12 PHP
使用php清除bom示例
Mar 03 PHP
php中数据库连接方式pdo和mysqli对比分析
Feb 25 PHP
PHP判断是否为空的几个函数对比
Apr 21 PHP
php文件压缩之PHPZip类用法实例
Jun 18 PHP
php通过前序遍历树实现无需递归的无限极分类
Jul 10 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
Feb 23 PHP
ThinkPHP项目分组配置方法分析
Mar 23 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
Yii2中简单的场景使用介绍
Jun 02 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
Jun 04 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
PHP实现的日历功能示例
2018/09/01 PHP
javascript 解析url的search方法
2010/02/09 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
angularjs中的单元测试实例
2014/12/06 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
使用ajaxfileupload.js实现上传文件功能
2016/08/13 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
js制作支付倒计时页面
2016/10/21 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
使用python模拟高斯分布例子
2019/12/09 Python
学python需要去培训机构吗
2020/07/01 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
奇怪的鱼:Weird Fish
2018/03/18 全球购物
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
小学生家长评语大全
2014/02/10 职场文书
商场主管竞聘书
2014/03/31 职场文书
政府信息公开实施方案
2014/05/09 职场文书
五四青年节演讲稿
2014/05/26 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
铁路安全反思材料
2014/12/24 职场文书
佛光寺导游词
2015/02/10 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
应届毕业生自荐信
2015/03/04 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
九年级语文教学反思
2016/03/03 职场文书
一行Python命令实现批量加水印
2022/04/07 Python