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开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Java利用poi实现word表格转excel

《Java利用poi实现word表格转excel》这篇文章主要为大家详细介绍了Java如何利用poi实现word表格转excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、每行对象类需要针对不同的表格进行对应的创建。package org.example.wordToEx

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

浅析Python中的绝对导入与相对导入

《浅析Python中的绝对导入与相对导入》这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1 Imports快速介绍2 import语句的语法2.1 基本使用2.2 导入声明的样式3 绝对import和相对i

如何利用Python实现给Excel表格截图

《如何利用Python实现给Excel表格截图》这篇文章主要为大家详细介绍了如何利用Python实现给Excel表格截图功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 我搜索了网络上的方案,感觉把 Excel 表格转换为 html 再用 platwright 截图是比China编程较顺

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档