phpoffice/phpspreadsheet读取excel表格中的图片并保存到本地

news2025/1/12 2:59:35

我们开发导入excel表格功能时,会遇到表格中带有图片的情况,怎样获取到表格的图片并且把图片保存到本地,这样就可以展示你导入的数据和图片,实现此功能。
这里介绍一下分别使用phpspreadsheet和PHPExcel扩展库来实现读取Excel内图片的功能:
表格是这样的。在这里插入图片描述
开始使用
首先安装phpspreadsheet到你的项目里,在项目根目录下使用composer安装,命令如下:

composer require phpoffice/phpspreadsheet

部分代码:

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;


// 获取excel表格的图片
	public function readexcel1()
	{
		$imageFilePath = ROOT_PATH . 'public/uploads/imgs/'; //图片本地存储的路径
		if (!file_exists($imageFilePath)) { //如果目录不存在则递归创建
		 	mkdir($imageFilePath, 0777, true);
		}
		try {
			$file = ROOT_PATH . 'public/excel/2.xlsx';; //包含图片的Excel文件
			$objRead = IOFactory::createReader('Xlsx');
			$objSpreadsheet = $objRead->load($file);
			$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;
				}
				$data[$startRow-1][$startColumn] = '/uploads/imgs/' . $imageFileName;
			}
			dump($data);die();
		} catch (\Exception $e) {
		 	throw $e;
		}
	}

输出表格的数据:

		array(3) {
			  [0] => array(3) {
			    [0] => string(6) "编码"
			    [1] => string(6) "名称"
			    [2] => string(6) "图片"
			  }
			  [1] => array(4) {
			    [0] => string(4) "B101"
			    [1] => string(9) "票据夹"
			    [2] => NULL
			    ["C"] => string(25) "./uploads/imgs/C26829.png"
			  }
			  [2] => array(4) {
			    [0] => string(4) "B102"
			    [1] => string(6) "油笔"
			    [2] => NULL
			    ["C"] => string(25) "./uploads/imgs/C39403.png"
			  }
			}

图片在第三列也就是C列,但是这样的数据不方便保存到数据库。所以我们将图片数据重新保存在一个图片数组中,然后再和获取的表格数据合并下,最后得到的数组就可以直接拿来保存到数据库了。

	public function readexcel2()
	{
		$imageFilePath = ROOT_PATH . 'public/uploads/imgs/'; //图片本地存储的路径
		if (!file_exists($imageFilePath)) { //如果目录不存在则递归创建
		 	mkdir($imageFilePath, 0777, true);
		}
		try {
			$file = ROOT_PATH . 'public/excel/2.xlsx';; //包含图片的Excel文件
			$objRead = IOFactory::createReader('Xlsx');
			$objSpreadsheet = $objRead->load($file);
			$objWorksheet = $objSpreadsheet->getSheet(0);
			$data = $objWorksheet->toArray();
			$img_data = [];// 图片数组
			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;
				}
				$img_data[$startRow-1][$startColumn] = '/uploads/imgs/' . $imageFileName;
			}
			dump($img_data);
			// 合并表格数据
			if(!empty($img_data)){
				foreach ($img_data as $key => $value){
					//$data[$key][2] 是导入表格图片的哪一行
                	$data[$key][2] = $value['C'];
				}
			}
			dump($data);
		} catch (\Exception $e) {
		 	throw $e;
		}
	}

再看看最后输出的数据:

// 图片数组
array(2) {
  [1] => array(1) {
    ["C"] => string(24) "/uploads/imgs/C27788.png"
  }
  [2] => array(1) {
    ["C"] => string(24) "/uploads/imgs/C35897.png"
  }
}
// 合并的表格数据数组
array(3) {
  [0] => array(3) {
    [0] => string(6) "编码"
    [1] => string(6) "名称"
    [2] => string(6) "图片"
  }
  [1] => array(3) {
    [0] => string(4) "B101"
    [1] => string(9) "票据夹"
    [2] => string(24) "/uploads/imgs/C27788.png"
  }
  [2] => array(3) {
    [0] => string(4) "B102"
    [1] => string(6) "油笔"
    [2] => string(24) "/uploads/imgs/C35897.png"
  }
}

最后的数组和适合我们保存到数据库中。

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

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

相关文章

win10multiple editions意思详细介绍

multiple editions是win10系统的一个版本号,很多的小伙伴都不知道这个英文是什么意思,今天就给你们带来了win10multiple editions意思详细介绍,还不清楚的就快来看看吧。 multiple editions是什么意思: 1、multiple editions是多…

C++笔记之内置基本类型的默认构造函数

C笔记之内置基本类型的默认构造函数 code review! 文章目录 C笔记之内置基本类型的默认构造函数1.C中基本内置类型的默认构造函数2.C有没有一个“内置构造函数”这样一个名词?3.基本内置类型按照前面提到的规则进行初始化是C11才开始的新特性吗? 1.C中…

【NX】NXOpen::BlockStyler::Tree的个人使用类分享

网上关于NXOpen::BlockStyler::Tree的例子不是太多,控件默认id名称为tree_control01,因为例子不多很多功能得自己写,虽然NXOpen::BlockStyler::Tree的封装已经不错了,但是实际使用起来也不是很方便,比如像获取所有节点…

基于PyQt5的桌面图像调试仿真平台开发(8)锐化

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

机器学习基础之《特征工程(2)—特征工程介绍》

一、什么是特征工程 机器学习领域的大神Andrew Ng(吴恩达)老师说“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. ” 注:业界广泛流传:数据和特…

论文阅读-DF-Platter: Multi-Face Heterogeneous Deepfake Dataset(多人脸异构深度伪造数据集)

一、论文信息 文章名称:DF-Platter: Multi-Face Heterogeneous Deepfake Dataset 作者团队: 会议:cvpr2023 数据集地址:http://iab-rubric.org/df-platter-database 二、动机与创新 动机 目前大多数研究工作都集中在个人外表…

【零基础入门学习Python---Python中安全编程和测试之快速入门实践】

🚀 零基础入门学习Python🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜…

Mysql基础之SQL语句

作定期复习和查询用,打开这篇博客提高效率,避免回视频或者百度上找 👂 无论你多怪异我还是会喜欢你(《刺客伍六七》动画推广版片尾曲) - 周子琰 - 单曲 - 网易云音乐 内容来自B站黑马Mysql,检索使用 附上…

浅析Lambda架构

大家好,今天我们来介绍一个用于亿级实时数据分析架构Lambda架构。 Lambda架构 Lambda架构(Lambda Architecture)是由Twitter工程师南森马茨(Nathan Marz)提出的大数据处理架构。这一架构的提出基于马茨在BackType和Tw…

Python GUI编程利器:Tkinker中的消息和文本(7)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 和猫妹学Python,一起趣味学编程。 今日目标 实现下面效果: 消息(Message类) 消息用于显示多行文本消息,对标签进行替代,如果…

【数学建模】国赛真题分析 2012 A题 葡萄酒的评价

2012 A题 葡萄酒的评价 优秀论文地址: 链接:https://pan.baidu.com/s/19WGpybgM6RncxTYhx61JRA?pwdvl22 提取码:vl22 –来自百度网盘超级会员V6的分享 确定葡萄酒质量时一般是通过聘请一批有资质的评酒员进行品评。每个评酒员在对葡萄酒进…

GWIN入门-完整一个程序

GWIN入门-完整一个程序 新建工程 右击工程名,添加.v文件 编写功能文件 /* timescale是Verilog HDL 中的一种时间尺度预编译指令,它用来定义模块的仿真时的时间单位和时间精度。 */`timescale 1ns/1ps module LED(input wire clk

第三步:STM32F4时钟介绍

1.0 时钟系统框图 1.1 时钟系统知识 1. STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟,RC振荡器,频率为16MHz,精度不高。可以直接作为系统 时钟或者用作PLL时钟输入。    ②、HSE是高速外部时钟,可接石英…

机器学习PCA + LogisticRegression 训练和预测 输出混淆矩阵

from sklearn.decomposition import PCA# --------------------------------------------- # 最佳主成分数量 pca = PCA(n_components=None) pca.fit_transform(x_train) var_values = pca.explained_variance_ratio_def select_best_components(var_, goal_var):best_componen…

flutter3.7版本下使用flutter boost解决使用platview崩溃或异常问题

背景 工程使用了混合开发,使用flutter boost插件,flutter 的activity1 frament1 跳转activity2 frament2,frament1 包含platformView,按照上面老哥解决崩溃问题的基础上,出现activity2 frament2返回activity1 framen…

百度--搜索引擎是怎么实现的--如何制作一个搜索浏览器

1.搜索引擎是怎么实现的? 搜索引擎是通过以下步骤实现的: 网页抓取(Crawling):搜索引擎会使用网络爬虫(Web Crawler)自动地从互联网上抓取网页内容。爬虫按照一定的规则遍历网页并提取网页内容…

数组之前缀和

1.前缀和 前缀和的概念:前缀和是指数组中从开始位置到当前位置的所有位置的元素之和,它可以通过累加数组元素来计算,一般来说,我们可以使用前缀和数组在常数时间复杂度内计算任意区间的和. 注意:特别是需要频繁的计算区间和的情况,可以通过先预先计算前缀和数组,可以将时间复…

经典神经网络(7)DenseNet及其在Fashion-MNIST数据集上的应用

经典神经网络(7)DenseNet及其在Fashion-MNIST数据集上的应用 1 DenseNet的简述 DenseNet不是通过更深或者更宽的结构,而是通过特征重用来提升网络的学习能力。 ResNet 的思想是:创建从“靠近输入的层” 到 “靠近输出的层” 的直连。而DenseNet 做得更…

idea取消右侧边缘提示信息;IDEA使用心得:工作区右边框提示信息

idea的提示是很人性的,合理使用一定程度上也会提升个人的编码水平 最终效果:能看到weak warning个数,但侧边栏不会显示直接清爽 但是idea在检查代码时有一种警告叫做weak warning 什么是weak warning 图中这种只是其中一种,这种…

导出本地文件(模板)

/*** 导出模板*/GetMapping("export/template")ApiOperationSupport(order 16)ApiOperation(value "导出模板")public void exportTemplate(HttpServletResponse response) {List<JointExcel> list new ArrayList<>();ClassPathResource cl…