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]的有效下标是从…...
从ILSVRC2015_VID到SOT与MOT:这个经典数据集如何影响了今天的多目标跟踪算法?
ILSVRC2015_VID:计算机视觉领域的"罗塞塔石碑"如何重塑目标跟踪技术 当计算机视觉领域的学者们谈起目标跟踪算法的演进史,2015年是个绕不开的年份。那一年,ImageNet大规模视觉识别挑战赛(ILSVRC)首次引入视频…...
HARMONYOS应用实例246:互动七巧板拼图
项目二:互动七巧板拼图 功能介绍: 本应用模拟了中国传统智力玩具七巧板。屏幕上展示7块几何形状(三角形、正方形、平行四边形),支持拖动平移和点击旋转操作。用户可以自由拼接图形,拼出各种造型。该应用帮助学生直观理解图形的平移、旋转、对称等几何变换,以及面积守恒…...
AnimateDiff保姆级教学:负面提示词详解,轻松提升视频画质
AnimateDiff保姆级教学:负面提示词详解,轻松提升视频画质 你是否遇到过这样的困扰:用AnimateDiff生成的视频创意很棒,但画面总有些小瑕疵?比如人物皮肤上不自然的纹理、背景里莫名其妙的噪点,或是某些区域…...
Jellyfin MetaTube插件:5分钟打造专业级媒体库的终极指南
Jellyfin MetaTube插件:5分钟打造专业级媒体库的终极指南 【免费下载链接】jellyfin-plugin-metatube MetaTube Plugin for Jellyfin/Emby 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-metatube MetaTube是一款专为Jellyfin和Emby设计的免…...
互联网一线大厂最新版 Java面试八股文(含答案,万字总结,精心打磨,建议收藏)
Java 面试 Java 面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入。 在我初入职场的时候,类似于 Vector 与 A…...
BilibiliDown视频下载全攻略:从效率瓶颈到批量管理的进阶之路
BilibiliDown视频下载全攻略:从效率瓶颈到批量管理的进阶之路 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mi…...
墨语灵犀效果展示:康沃尔语复兴运动口号→中文新文化运动风格译文
墨语灵犀效果展示:康沃尔语复兴运动口号→中文新文化运动风格译文 1. 翻译效果惊艳呈现 墨语灵犀作为一款融合古典美学与现代AI技术的深度翻译工具,在语言转换过程中展现出令人惊叹的文化适应能力。本次展示以康沃尔语复兴运动口号为源文本,…...
OpenClaw儿童模式:基于百川2-13B打造家长控制的作业辅导助手
OpenClaw儿童模式:基于百川2-13B打造家长控制的作业辅导助手 1. 为什么需要AI作业辅导助手? 作为两个小学生的家长,我深刻体会到辅导作业的"痛"。每天晚上检查数学题、批改作文、讲解错题的过程,常常让亲子关系变得紧…...
Ubuntu服务器上配置KVM虚拟化环境:从零搭建Windows开发环境
1. 为什么要在Ubuntu服务器上跑Windows? 很多开发者可能都有这样的困惑:明明手头有性能强劲的Ubuntu服务器,但某些开发工具只能在Windows环境下运行。比如Visual Studio、SQL Server Management Studio这些微软系工具,或者某些行业…...
跨平台音频格式兼容性处理:让FRCRN支持更多音视频文件
跨平台音频格式兼容性处理:让FRCRN支持更多音视频文件 你有没有遇到过这种情况?精心搭建了一个基于FRCRN模型的音频降噪服务,信心满满地准备上线,结果用户一上传文件,服务就报错。有的用户传的是手机录的.m4a…...
