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 相关文章推荐
How do I change MySQL timezone?
Mar 26 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
Apr 28 PHP
php 抽象类的简单应用
Sep 06 PHP
hadoop常见错误以及处理方法详解
Jun 19 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
Jul 02 PHP
php采集文章中的图片获取替换到本地(实现代码)
Jul 08 PHP
详解PHP中的状态模式编程
Aug 11 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
Feb 26 PHP
PHP 7.1新特性的汇总介绍
Dec 16 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
PHP进阶学习之反射基本概念与用法分析
Jun 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
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
js静态作用域的功能。
2006/12/25 Javascript
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
Python OS模块常用函数说明
2015/05/23 Python
python读写json文件的简单实现
2017/04/11 Python
python实现多层感知器
2019/01/18 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
python爬虫要用到的库总结
2020/07/28 Python
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
国外平面设计素材网站:The Hungry JPEG
2017/03/28 全球购物
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
三个儿子教学反思
2014/02/03 职场文书
仓管员岗位责任制
2014/02/19 职场文书
手术室护士节演讲稿
2014/08/27 职场文书
2014年教务工作总结
2014/12/03 职场文书
离婚协议书范文
2015/01/26 职场文书
青年志愿者活动感想
2015/08/07 职场文书
八年级作文之感恩
2019/11/22 职场文书
maven依赖的version声明控制方式
2022/01/18 Java/Android
Golang并发工具Singleflight
2022/05/06 Golang