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

2024-01-04 08:52

本文主要是介绍tp8/6 插件PhpOffice\PhpSpreadsheet导入表格,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、安装

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博客

这篇关于tp8/6 插件PhpOffice\PhpSpreadsheet导入表格的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/568789

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

eclipse安装subversion(SVN)版本控制插件

陈科肇 查看插件更新站点 网址:http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA 网站截图: 根据自己的eclipse版本,选择需要的更新站点. 使用eclipse集成subservion插件 Help > Install New Software…> 等待下载安装插件…

Weex入门教程之2,Android Studio安装Weex插件

插件位置及描述 https://plugins.jetbrains.com/idea/plugin/8460-weex 貌似对windows还不是很支持,先放着吧。 安装 插件功能 先预览下都有什么功能 安装完成Weex插件后,如果在main toolbar找不到这些功能图标,那么就需要手动添加到main toolbar 添加到main toolbar 红框内就是

如何导入sun.misc.BASE64Encoder和sum.misc.BASE64Decoder

右击项目名--->Build Path--->Configure Build Path...--->java Build Path--->Access rules:1 rule defined,added to all librar...   --->Edit --->Add...

mysql中导入txt文件数据的操作指令

1 表tt的格式:    CREATE TABLE `tt` (   `ind` int NOT NULL auto_increment,   `name` char(100) default NULL,   PRIMARY KEY  (`ind`)  )   2 文件d.txt的内容示例:  1,a  2,b  3,c