tp8/6 插件PhpOffice\PhpSpreadsheet导入表格

news2024/12/23 11:32:03

一、安装

composer require phpoffice/phpspreadsheet

官网:phpoffice/phpspreadsheet - Packagist

二、代码

<?php
namespace app\services\upload\model;
use app\services\BaseServices;
use \PhpOffice\PhpSpreadsheet\Spreadsheet;
use \PhpOffice\PhpSpreadsheet\IOFactory;
use \PHPExcel_Style_NumberFormat;    //设置列的格式==>>设置文本格式
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Shared\Date;

/**
* @name 导入表格处理
* @method Model
* @author 峰神
* @date 2024-1-3
* @ruturn array
*/

class Import  extends BaseServices
{

	/**
	* @name 导入表格处理
	* @author 峰神
	* @date 2024-1-3
    * @param array $postArr 选填 提交表单的数组
    * @param 对象 $files 必填 上传文件
	* @ruturn array
	*/
	public function importUploads(array $postData,$files){
		$msg='成功';$code=200;$data=[];
		try {
			if(empty($files)){
				throw new \Exception("上传文件为空");
			}
			if(empty($postData)){
				throw new \Exception("提交参数为空");
			}
			$action=!empty($postData['action'])?$postData['action']:'';
			$oss_c_n=!empty($postData['oss_c_n'])?$postData['oss_c_n']:'';
			if($oss_c_n=='Live'){//导入直播章节
				// $fieldArr=['A'=>'title','B'=>'ctitle','C'=>'starttime','D'=>'duration','E'=>'endtime'];
				$sheetArr = self::readData('file',[],'excel',$postData,['C']);
                $data = (new \app\appcenter\model\LiveChapter())->batchImportData($sheetArr,$postData);
				dump($data);die;
				// $data = $this->LiveImportChapter($files,$postData);
			}


		} catch (\Exception $e) {
			// 这是进行异常捕获
			$code=-200;$msg=$e->getMessage();
		}
		return ['code' => $code,'msg' => $msg,'data'=>$data];
	}

    /**
     * 读取表格数据
     *
     * @param string $name 必填 文件域名称
     * @param array  $field 选填 表格各列对应的数据库字段
     * @param string $scene 选填 验证场景
     * @param array $postData 选填 表单数组
     * @param array $timeFieldArr 选填 时间日期字段(带日期字段值都需要格式化,例子:表格中C列是日期,值是2024/1/3 0:00,如果不处理,取得是45305.708333333这种的)
     */
    public static function readData(string $name, array $field=[], string $scene = 'excel',array $postData=[],array $timeFieldArr=[])
    {
        try {
            $file = request()->file($name);
            if (!$file) throw new \Exception('没有文件上传');
            // Excel文件验证
            validate(\app\tableappcenter\validate\ImportValidate::class)->scene($scene)->check([$scene => $file]);
            // Excel 类型 Xls Excel2005 Xlsx Excel2007
            $type = ucfirst($file->getOriginalExtension());
            // 创建读操作对象
            $reader = IOFactory::createReader($type);
            // 忽略任何格式的信息
            $reader->setReadDataOnly(true);
            // 打开文件、载入excel表格
            $spreadsheet = $reader->load($file->getRealPath());
            // 获取活动工作薄
            $sheet = $spreadsheet->getActiveSheet();
            // 返回表格数据
            return self::getCellData($sheet, $field,$postData,$timeFieldArr);
        } catch (\Exception $e) {
            // 有异常发生
            return ['code' => $e->getCode(), 'errMsg' => $e->getMessage()];
        }
    }
    /**
     * 获取单元格数据
     *
     * @param object $sheet 获取活动工作薄
     * @param array  $field 表格各列对应的数据库字段
	 * @param array $postData 选填 表单数组
     * @param array $timeFieldArr 选填 时间日期字段(带日期字段值都需要格式化,例子:表格中C列是日期,值是2024/1/3 0:00,如果不处理,取得是45305.708333333这种的)
     */
    private static function getCellData(object $sheet, array $field=[],array $postData=[], array $timeFieldArr=[])
    {
        # 获取最高列 返回字母 如: C
        $highestColumn = $sheet->getHighestColumn();
        # 获取最大行 返回数字 如: 4
        $highestRow = $sheet->getHighestRow();
        # 列数 改为数字显示
        $highestColumnIndex = Coordinate::columnIndexFromString($highestColumn);
        $data = [];
        // 从第二行开始读取数据
        for ($row = 2; $row <= $highestRow; $row++) {
            $build = [];
            // 从第一列读取数据
            for ($col = 1; $col <= $highestColumnIndex; $col++) {
                // 'A' 对应的ASCII码十进制为 64
                // 将ASCII值转为字符
                $chr = chr(64 + $col);
                // 列转为数据库字段名
                $key = $field[$chr] ?? $chr;
                $Value = $sheet->getCellByColumnAndRow($col, $row)->getValue();
                if(!empty($timeFieldArr)){//格式化时间-
                    if(in_array($key,$timeFieldArr) && $Value){  
                        // $Value = $sheet->getCellByColumnAndRow($col, $row)->getValue();
                        $Value = gmdate('Y-m-d H:i:s',\PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp(($Value)));
                    }
                }
                // 构建当前行数据
                $build[$key] = $Value;
            }
            $data[] = $build; //当前行数据
        }
        return $data;
    }

}

注意:

$sheetArr = self::readData('file',[],'excel',$postData,['C']);//file相当request()->file('file')中file'

['C']=指 表格中放日期的列;日期需要经过处理后才可以的,不然取得的值是:45305.708333333,而且还会增加多8小时

处理方法:gmdate('Y-m-d H:i:s',\PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp(($Value)));

参考:

TP6.0 使用 phpoffice/phpspreadsheet 导入数据 - 霸波儿奔925 - 博客园 (cnblogs.com)

PhpOffice\PhpSpreadsheet 获取时间快了8小时_php xlxs 读取时间长-CSDN博客

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

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

相关文章

Axure鲜花速递商城网站原型图,花店网站O2O本地生活电商平台

作品概况 页面数量&#xff1a;共 30 页 兼容软件&#xff1a;仅支持Axure RP 9/10&#xff0c;非程序软件无源代码 应用领域&#xff1a;鲜花网、花店网站、本地生活电商 作品特色 本作品为「鲜花购物商城」网站模板&#xff0c;高保真高交互&#xff0c;属于O2O本地生活电…

python 深度学习 记录遇到的报错问题10

本篇继python 深度学习 解决遇到的报错问题9_module d2l.torch has no attribute train_ch3-CSDN博客 一、CUDA error: no kernel image is available for execution on the device CUDA kernel errors might be asynchronously reported at some other API call,so the stackt…

跟cherno手搓游戏引擎【1】:配置与入口点

环境配置&#xff1a; 编译环境&#xff1a;VS2019 创建两个项目&#xff1a; 设置Sandbox为启动项&#xff1a; 设置sandbox的配置属性-常规-输出目录\中间目录为如下&#xff1a; 预处理定义&#xff1a;为了配置一些只有windows才能用的函数。 设置YOTOEngin&#xff08;我…

LeetCode 每日一题 Day 28293031 ||三则模拟||找循环节(hard)

1185. 一周中的第几天 给你一个日期&#xff0c;请你设计一个算法来判断它是对应一周中的哪一天。 输入为三个整数&#xff1a;day、month 和 year&#xff0c;分别表示日、月、年。 您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday…

Cam4DOcc: 基于摄像头的4D占据网格预测的自动驾驶应用

文章&#xff1a;Cam4DOcc: Benchmark for Camera-Only 4D Occupancy Forecasting in Autonomous Driving Applications 作者&#xff1a;Junyi Ma, Xieyuanli Chen , Jiawei Huang, Jingyi Xu, Zhen Luo, Jintao Xu, Weihao Gu, Rui Ai, Hesheng Wang 编辑&#xff1a;点云P…

Python高效编程:十招实用技巧大揭秘!

文章目录 1\. 代码优化与高效数据结构2\. 列表推导式和生成器表达式3\. 使用装饰器和上下文管理器4\. 多线程和多进程5\. 函数式编程和Lambda函数6\. 内置模块与标准库7\. 文件处理与I/O操作8\. 调试和性能优化工具9\. 文档化与测试10\. 并发编程与异步技术总结Python技术资源分…

UE4.27.2 网页串流

1、和Unity串流一样安装Node.js 下载地址https://nodejs.org/ 2、下载安装Epic Games启动程序https://www.unrealengine.com/zh-CN/download 3、安装UE4.7.2 4、这里就不安装像素流送演示&#xff0c;选个别的然后创建工程 5、启用PixelStreaming插件 6、设置额外启动参数&am…

开发手机中控软件:从零开始的代码之旅!

在这个智能化风靡的时代&#xff0c;手机中控软件成为了许多人的梦想&#xff0c;通过一款软件&#xff0c;我们可以轻松地控制家中的各种智能设备&#xff0c;实现智能家居的美好愿景。 但是&#xff0c;开发手机中控软件并非易事&#xff0c;需要具备一定的编程知识和技能&a…

论文阅读:通过时空生成卷积网络合成动态模式(重点论文)

原文链接 github code 介绍视频 视频序列包含丰富的动态模式&#xff0c;例如在时域中表现出平稳性的动态纹理模式&#xff0c;以及在空间或时域中表现出非平稳的动作模式。 我们证明了时空生成卷积网络可用于建模和合成动态模式。 该模型定义了视频序列上的概率分布&#xff0…

paddle v4 hubserving 部署

环境准备&#xff1a;https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.7/deploy/hubserving#24-%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1 服务器启动命令 hub serving start -c deploy/hubserving/ocr_system/config.json客户端请求 python tools/test_hubserving.…

境内深度合成服务算法备案清单(2023年12月)

截止2024年1月3日&#xff0c;第三批深度合成服务算法备案信息的公告尚未发布&#xff0c;预计将会在2024-1-10左右发布&#xff0c;我公司已知晓部分公示名单&#xff0c;如中国电信数字人生成算法&#xff0c;详情联系WX号&#xff1a;SuanfabeiandayuAI生成合成类算法应办理…

非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (实例篇 V)

Title: 非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (实例篇 V) 姊妹博文 非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (I) 非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (II) 非线性最小二乘问题的数值方法 —— 从牛顿…

RPA如何入门?

许多人可能认为RPA等人工智能软件的入门非常困难&#xff0c;不知道该如何开始。作为一名刚接触RPA软件一年多的新手&#xff0c;回答这个问题也是对自己学习RPA历程的回顾。同时&#xff0c;这也是分享给那些打算学习RPA初学者的经验&#xff0c;希望可以帮助大家更好地、更迅…

SANSAN新鲜事|物联网平台就只能做数据监控吗?

​物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过网络将各种物理设备、智能终端、传感器等连接起来&#xff0c;实现信息的交换和通信的技术。物联网平台&#xff08;IoT Platform&#xff09;是指为物联网应用提供基础设施、服务和工具的软件平…

【springboot配置文件加载源码分析】

在Spring Boot的源码中&#xff0c;配置文件的加载是在应用程序启动的早期阶段进行的。具体来说&#xff0c;配置文件加载的主要步骤发生在SpringApplication类的run()方法中的prepareEnvironment方法中&#xff0c;真正读取我们的配置文件还是PropertySourceLoader。 本篇博客…

RFID智能生产制造全周期管理系统

一、MES系统简述 RFID/条码技术基于的MES制造执行系统可以加强ERP/MRP计划的执行功能。该系统包括MES与ERP的对接、MES报表与看板、MES物料管理、MES设备与工具管理、MES品质管理和MES生产过程管理WIP等功能&#xff0c;通过将MES系统与ERP计划和车间作业现场控制系统联系起来…

【面试】面向对象编程的三大概念(实例辅助记忆)

【面试】面向对象编程的三大概念&#xff08;实例辅助记忆&#xff09; 虑面向对象编程的三大特性&#xff0c;它们是&#xff1a; 封装&#xff08;Encapsulation&#xff09;&#xff1a; 将对象的状态和行为封装在一起&#xff0c;对外部隐藏对象的内部实现细节。这样可以防…

第二部分组件化编程:vue学习(53-60)

文章目录 53.对组件的理解54 非单文件组件55 组件的几个注意事项56 组件的嵌套57 vuecomponent构造函数58 vue实例与组件实例59 一个重要的内置关系60 单文件组件 53.对组件的理解 左侧2个页面&#xff0c;如果要复用js和css的话&#xff0c;引用的路线十分混乱。使用js模块化&…

熔断、隔离、重试、降级、超时、限流,高可用架构流量治理核心策略全掌握

可用性的定义 在探讨高可用架构之前&#xff0c;让我们以 O2 系统为例&#xff0c;解释一下何谓可用性。O2 是腾讯内部的一个广告投放系统&#xff0c;专注于提升投放效率、分析广告效果&#xff0c;拥有自动化广告投放、AIGC 自动化素材生产等多种功能。 其整体架构概览如下&…

abaqus复合材料 19个实例

实例操作: 1.复合材料层结构的三种常用建模方法、静力分析中强度准则和损伤判据的引入、数据输入与输出 2.层合结构的热-力耦合分析 3.基于虚裂纹闭合技术(VCCT)的分层扩展模拟 4.基于cohesive单元的分层/界面损伤扩展模拟 5.基于XFEM方法的裂纹扩展模拟 6.复合材料加筋板…