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]的有效下标是从…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
鸿蒙Navigation路由导航-基本使用介绍
1. Navigation介绍 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(Nav…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...
【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
问题:IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案:将编译的堆内存增加一点 位置:设置setting-》构建菜单build-》编译器Complier...
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...
