phpspreadsheet导出数据和图片到excel
仅作记录,废话不多说
前提是已经安装了phpspreadsheet ( composer require phpoffice/phpspreadsheet )
一、 数据拼装,调用excel类
<?php
/*** 电子台账* Date: 2023/4/20* Time: 17:28*/namespace app\store\controller;
use app\common\controller\Excel;
use app\common\model\ModelRedis;
use app\store\model\ModelSaleStoreInput;class Ledger extends \app\ApiCommon
{/*** 导出数据拼装* @param $ids string 出库id 列表 1,2,3,4*/public function export_input($ids,$start,$end){$where = [];if(!empty($start) && !empty($end)){$where[] = ['ctime','>=',strtotime($start)];$where[] = ['ctime','<=',strtotime($end)];}else{$where[] = ['id','in',$ids];}$list = ModelSaleStoreInput::where($where)->field($field)->select()->toArray();if(empty($list)){return $this->apiError('数据不存在');}$data = $list;//此处说明:解决数字太长尾数变000的问题//由于数字超过15位,会被显示成0或者加小数点处理。造成这种情况是由于Excel内置的数值有效范围是15位。超过15位,如果要显示的话,就需要转换成非数字格式。比如文本格式。foreach ($data as $key => $value) {$tmp = [];$explode_no = self::decode_explode_no($value['explode_no']);array_push($tmp,"\t".$value['id']."\t");array_push($tmp,"\t".$value['ctime']."\t");array_push($tmp,"\t".$value['store_name']."\t");array_push($tmp,"\t".$value['name']."\t");array_push($tmp,"\t".$value['spec_name']."\t");array_push($tmp,"\t".$value['amount']."\t");array_push($tmp,"\t".$explode_no."\t");array_push($tmp,"\t".$value['supply_company']."\t");array_push($tmp,"\t".$value['deliver']."\t"); array_push($tmp,"\t".self::desensitizedIdCard($value['deliver_idcard'])."\t");array_push($tmp,"\t".$value['carry_no']."\t");array_push($tmp,"\t".$value['buy_no']."\t");array_push($tmp,"\t".$value['storeman_names']."\t");array_push($tmp,"\t".$value['storeman_signs']."\t");array_push($tmp,"\t".$value['safety_name']."\t");array_push($tmp,"\t".$value['safety_sign']."\t");$data[$key] = $tmp;}//保存到本地临时目录$path = './uploads/tmp/';$excel_name = '数据盘点';$title = ['id','时间','仓库名','物品名称','品种规格','物品数量','编号','供货单位','送货人','身份证号','运输证号','购买证号','库管员','库管员签字','安全员','安全员签字'];$file_name = date('Y-m-d').rand(1000,9999).$excel_name.'.xlsx';$res = Excel::export($title,$data,$path,$file_name);return $res;}
}
二、封装好的Excel类:注意远程图片必须base64后缓存到本地再写入excel。
<?php
/*** excel导入导出公共类* Date: 2023/4/27* Time: 18:39*/namespace app\common\controller;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
use think\exception\ValidateException;
use think\facade\Filesystem;class Excel
{/*** 数据导出Excel* @param array $title 表头* @param array $data 数据源* @param string $path 目录* @param string $file_name 文件名称* @return array*/public static function export($title = [], $data = [],$path,$file_name=""){try{$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();// 表头单元格内容 第一行$titCol = 'A';foreach ($title as $value) {// 单元格内容写入$sheet->setCellValue($titCol . '1', $value);$titCol++;}//单元格内容居中$sheet->getDefaultRowDimension()->setRowHeight(60);//默认行高60$sheet->getDefaultColumnDimension()->setAutoSize(true);//列宽自适应$sheet->getStyle('A:'.$titCol)->getAlignment()->setVertical('center');//内容容垂居中$sheet->getStyle('A:'.$titCol)->getAlignment()->setHorizontal('center');//内水平直居中// 从第二行开始写入数据$row = 2;foreach ($data as $item) {$dataCol = 'A';foreach ($item as $value) {// 单元格内容写入$values = explode(".",$value);$ext = trim(end($values));if(in_array($ext,['jpg','png','jpeg'])){ //多图导出$num = 10;$images = explode(',', $value);foreach ($images as $k => $v) {$drawings[$k] = new Drawing();$img = self::img_resource(trim($v),$path,$k);//图片路径,项目目录下就行$drawings[$k]->setResizeProportional(false);$drawings[$k]->setName('手动签名图片');$drawings[$k]->setDescription('手动签名图片展示');$drawings[$k]->setPath($img,true);$drawings[$k]->setWidth(60);$drawings[$k]->setHeight(60);$drawings[$k]->setOffsetX($num);$drawings[$k]->setOffsetY(10);$drawings[$k]->setCoordinates($dataCol . $row);$drawings[$k]->setWorksheet($sheet);$num = $num + 70; // 增加每张图之间的间距}}else{$sheet->setCellValue($dataCol . $row, $value);}//自适应列宽$len = strlen($value);if($len>1){ //空数据不做处理避免影响到有数据的列宽度$sheet->getColumnDimension($dataCol)->setWidth($len);}$dataCol++;}$row++;}$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');if(is_file($path.$file_name)){file_put_contents($path.$file_name,'');;}$writer->save($path.$file_name);return ['code'=>0,'url'=>trim($path.$file_name,'.')];}catch (\Exception $e){return ['code'=>1,'msg'=>$e->getMessage()];}}/*** 图片缓存到本地* @param $url string 远程图片地址* @param $dir string 本地缓存目录* @param $i int 图片序号* @return mixed*/public static function img_resource($url,$dir,$i){$data = file_get_contents($url);$path = $dir.time().'-'.$i;file_put_contents($path, $data);return $path;}
}
相关文章:
phpspreadsheet导出数据和图片到excel
仅作记录,废话不多说 前提是已经安装了phpspreadsheet ( composer require phpoffice/phpspreadsheet ) 一、 数据拼装,调用excel类 <?php /*** 电子台账* Date: 2023/4/20* Time: 17:28*/namespace app\store\controlle…...
Seata的 TCC 模式
目录 概述 使用 依赖与配置 代码 概述 TCC 模式是一种侵入式的分布式事务解决方案,它不依赖于数据库的事务,而是要求开发者自定义完成 预提交、提交、回滚的方法逻辑。因此,它是一个种偏 复杂、灵活、有侵入性 的分布式事务处理方案。 De…...
Vue全局指令防止重复点击(等待请求)
继《vue之全局请求loading》之后,总觉得全局loading有时候不太…友好,所以总想将loading加到被点击的元素上面,于是乎就想到了点击事件与请求方法相关联,本想重写组件的click方法,但是这样对组件的影响太大,…...

数据库索引面试的相关问题
查看索引的执行计划 索引失效的情况 1、索引列上做了计算,函数,类型转换等操作。索引失效是因为查询过程需要扫描整个索引并回表。代价高于直接全表扫描。 Like匹配使用了前缀匹配符“%abc” 字符串不加引号导致类型转换。 原因: 常见索…...
Spring启动生命周期
Spring Boot 生命周期详解 Spring Boot 应用程序的生命周期包含几个阶段,每个阶段都有特定的事件和钩子,允许开发者在应用程序的不同生命周期阶段插入自定义逻辑。以下是 Spring Boot 生命周期的主要阶段和对应的事件: 准备阶段:…...
瑞芯微RK3568芯片介绍
RK3568简介 RK3568是一款由瑞芯微电子有限公司(Rockchip Electronics Co. Ltd)推出的高性能多媒体处理器,定位于中高端市场,被广泛应用于平板电脑、多媒体盒子、电子看板和工业控制等领域。以下是对这款芯片的简要介绍࿱…...

15.一种坍缩式的简单——组合模式详解
当曾经的孩子们慢慢步入社会才知道,那年味渐淡的春节就像是疾驰在人生路上的暂停键。 它允许你在隆隆的鞭炮声中静下心来,瞻前顾后,怅然若失。 也允许你在寂静的街道上屏气凝神,倾听自己胸腔里的那团人声鼎沸。 孩子们会明白的&am…...

Node.js的debug模块源码分析及在harmonyOS平台移植
Debug库 是一个小巧但功能强大的 JavaScript 调试工具库,可以帮助开发人员更轻松地进行调试,以便更快地发现和修复问题。它的主要特点是可以轻松地添加调试日志语句,同时在不需要调试时可以轻松地禁用它们,以避免在生产环境中对性…...

【Crypto | CTF】BUUCTF RSA2
天命:密码学越来越难了,看别人笔记都不知道写啥 天命:莫慌,虽然我不会推演法,但我可以用归纳法 虽然我不知道解题的推演,但我可以背公式啊哈哈哈 虽然我不会这题,但是我也能做出来 公式我不知…...

单片机学习笔记---红外遥控红外遥控电机调速(完结篇)
目录 低电平触发中断和下降沿触发中断的区别 红外遥控 Int0.c Int.h Timer0.c Timer0.h IR.c IR.h main.c 红外遥控电机调速 Timer1.c Timer.h Motor.c Motor.h main.c 上一节讲了红外发送和接收的工作原理,这一节开始代码演示! 提前说…...

Linux第62步_备份移植好的所有的文件和文件夹
1、备份“my-tfa”目录下所有的文件和文件夹 1)、打开终端 输入“ls回车”,列出当前目录下所有的文件和文件夹 输入“cd linux回车”,切换“linux”目录下 输入“ls回车”,列出当前目录下所有的文件和文件夹 输入“cd atk-mp1/回车”&am…...
【xss跨站漏洞】xss漏洞前置知识点整理
xss漏洞成因 xss漏洞是一种前端javascript产生的漏洞。 我们网站基本都是会用到javascript编写一些东西,浏览器也能直接识别javascript。 如果有一个地方能够输入文字,但是他又没有过滤你的输入,那么自己或者他人看到你输入的javascript代…...
mac下mysql 常用命令
mysql启动命令 在Mac OS X启动和停止MySQL服务的命令, 启动MySQL服务 sudo /usr/local/mysql/support-files/mysql.server start 停止MySQL服务 sudo /usr/local/mysql/support-files/mysql.server stop 重启MySQL服务 sudo /usr/local/mysql/support-files/mys…...
2.21号qt
1.QMainWindow中常用的类 继承于QMainWindow类,原因该类提供了QWidget没有提供的成员函数。 菜单栏、工具栏、状态栏、浮动窗口(铆接部件)、核心部件 1.1 菜单栏 QMenuBar //创建菜单栏 QMenuBar 最多只能有一个 QMenuBar *mbar menu…...
什么是MVVM?MVC、MVP与MVVM模式的区别?
MVVM(Model-View-ViewModel)是一种软件架构模式,用于将用户界面(View)与业务逻辑(Model)分离,并通过ViewModel来连接两者。MVVM的目标是实现可测试性、可维护性和可复用性。 MVC&am…...

ElementUI组件的安装和使用
Element UI 是一款基于 Vue 2.0 的桌面端组件库,主要用于快速构建网站的前端部分。它提供了丰富的组件,如按钮、输入框、表格、标签页等,以及一些布局元素,如布局容器、分割线等。Element UI 的设计风格简洁,易于上手&…...

Laravel01 课程介绍以及Laravel环境搭建
Laravel01 课程介绍 1. Laravel2. mac开发环境搭建(通过Homebrew)3. 创建一个项目 1. Laravel 公司中面临着PHP项目与Java项目并行,所以需要我写PHP的项目,公司用的框架就是Laravel,所以在B站上找了一门课学习。 Laravel中文文档地址 https…...

面试redis篇-03缓存击穿
原理 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮 解决方案一:互斥锁 解决方案二:逻辑过期 提问与回答 面试官 :什么是缓存击穿 ? 怎么解决 ? 回答: 缓存击穿的意思…...
k8s容器以及基础设施优化
1.硬件系统选型:宿主机通用配置16c/32GB/4网卡队列 2.os优化:单机支持百万tcp并发,/etc/sysctl.conf,/etc/security/limits.conf 3.k8s&容器层优化:性能优化initContainer 4.kube-dns优化:增大--cache-size,设置…...

蓝桥杯备赛系列——倒计时50天!
蓝桥杯备赛系列 倒计时50天! 前缀和和差分 知识点 **前缀和数组:**假设原数组用a[i]表示,前缀和数组用sum[i]表示,那么sum[i]表示的是原数组前i项之和,注意一般用前缀和数组时,原数组a[i]的有效下标是从…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...