公司有个需求,是用excel更新数据的,把错误的行列放到一个数组返回出来,正常的数据则插入,且返回数量

1.先需要引入phpspreadsheet,这里使用composer 安装

composer require phpoffice/phpspreadsheet

2.还需要在头部引入,命名空间自己根据vendor目录设置

use Exception;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\Xls;
use PhpOffice\PhpSpreadsheet\Reader\Csv;

3.下面就是相关代码了,其实逻辑很简单,把excel导入的数据和数据表的字段拼接成二维数组,然后插入就行了

  /**
* excel开启上传
* author: panzhide
* @return array
* Date: 2020/9/4
*/
public function logisticsImportExcel()
{
$file = request()->file('file');
if (!$file) {
return json_success('excel文件不能为空', 'file');
}
//将文件保存到public/storage/uploads/目录下面
$savename = \think\Facade\Filesystem::disk('public')->putFile('uploads', $file); //获取文件路径
$filePath = getcwd() . '/storage/' . $savename;
if (!is_file($filePath)) {
return json_success('没有发现结果');
}
//实例化reader
$ext = pathinfo($filePath, PATHINFO_EXTENSION);
if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {
return json_success('未知的数据格式');
}
if ($ext === 'csv') {
$file = fopen($filePath, 'r');
$filePath = tempnam(sys_get_temp_dir(), 'import_csv');
$fp = fopen($filePath, "w");
$n = 0;
while ($line = fgets($file)) {
$line = rtrim($line, "\n\r\0");
$encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);
if ($encoding != 'utf-8') {
$line = mb_convert_encoding($line, 'utf-8', $encoding);
}
if ($n == 0 || preg_match('/^".*"$/', $line)) {
fwrite($fp, $line . "\n");
} else {
fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n");
}
$n++;
}
fclose($file) || fclose($fp); $reader = new Csv();
} elseif ($ext === 'xls') {
$reader = new Xls();
} else {
$reader = new Xlsx();
} //导入文件首行类型,默认是注释,如果需要使用字段名称请使用name
$importHeadType = isset($this->importHeadType) ? $this->importHeadType : 'comment';
//默认的表名
$table = OrderAddress::build()->getTable(); $fieldArr = [];
$list = Db::query('SHOW FULL COLUMNS FROM `' . $table . '`');
foreach ($list as $k => $v) {
if ($importHeadType == 'comment') {
$fieldArr[$v['Comment']] = $v['Field'];
} else {
$fieldArr[$v['Field']] = $v['Field'];
}
} //加载文件
$insert = [];
try {
if (!$PHPExcel = $reader->load($filePath)) {
return json_success('未知的数据格式');
}
$currentSheet = $PHPExcel->getSheet(0); //读取文件中的第一个工作表
$allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号
$allRow = $currentSheet->getHighestRow(); //取得一共有多少行
$maxColumnNumber = Coordinate::columnIndexFromString($allColumn);
$fields = [];
for ($currentRow = 1; $currentRow <= 1; $currentRow++) {
for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
$val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
$fields[] = $val;
}
} for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
$values = [];
for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
$val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
$values[] = is_null($val) ? '' : $val;
}
$row = [];
$temp = array_combine($fields, $values);
foreach ($temp as $k => $v) {
if (isset($fieldArr[$k]) && $k !== '') {
$row[$fieldArr[$k]] = $v;
}
}
if ($row) {
$insert[] = $row;
}
}
} catch (Exception $exception) {
return json_success($exception->getMessage());
} if (!$insert) {
return json_success('没有更新行');
} $n = 0;
foreach ($insert as $key => $value) {
$n++;
if (!$value['logistics_sn']) {
$error[] = '第' . $n . '行物流编号不得为空';
} else {
$kuaidicom_code = KuaidiCode::build()->where('name', $value['kuaidicom'])->find();
if (!$kuaidicom_code) {
$error[] = '第' . $n . '行' . $value['kuaidicom'] . '物流公司不支持';
} else {
$info = OrderAddress::build()->where('order_sn', $value['order_sn'])->find();
if (!$info) {
$error[] = '第' . $n . '行订单不存在';
} else {
$update_data['kuaidicom_code'] = $kuaidicom_code['code'];
$update_data['update_time'] = time();
$update_data['order_sn'] = $value['order_sn'];
$update_data['kuaidicom'] = $value['kuaidicom'];
$update_data['logistics_sn'] = $value['logistics_sn'];
$update_data['id'] = $info['id'];
$update_data_list[] = $update_data;
}
}
}
}
$this->logisticsImportExcelUpdate($update_data_list);
$msg = '导入成功,共整合更新' . count($update_data_list) . '条订单数据';
return json_success($msg, $error);
} private function logisticsImportExcelUpdate($update_data_list)
{
Db::startTrans();
try {
OrderAddress::build()->saveAll($update_data_list);
} catch (\Exception $e) {
Db::rollback();
$msg = $e->getMessage();
return json_success($msg);
} catch (\Exception $e) {
Db::rollback();
return json_success($e->getMessage() . $e->getLine());
}
Db::commit();
}

php添加excel更新数据表数据的更多相关文章

  1. ASP.NET网页动态添加、更新或删除数据行

    ASP.NET网页动态添加.更新或删除数据行 看过此篇<ASP.NET网页动态添加数据行> http://www.cnblogs.com/insus/p/3247935.html的网友,也 ...

  2. MySQL<添加、更新与删除数据>

    添加.更新与删除数据 添加数据 为表中所有字段添加数据 INSERT INTO 表名(字段名1,字段名2,……) VALUES(值1,值2,……); insert into 表名 values(值1, ...

  3. 09Oracle Database 数据表数据插入,更新,删除

    Oracle Database 数据表数据插入,更新,删除 插入数据 Insert into table_name(column) values(values); insert into studen ...

  4. MySQL触发器更新本表数据异常:Can't update table 'tbl' in stored function/trigger because it

    MySQL触发器更新本表数据异常:Can't update table 'tbl' in stored function/trigger because it 博客分类: 数据库 MySQLJava ...

  5. SQL Server2016导出数据表数据

    SQL Server2016导出数据表数据 高文龙关注0人评论3914人阅读2017-09-22 08:41:56 SQL Server2016导出数据表数据 我们前面已经介绍了很多关于SQL Ser ...

  6. Django学习之天气调查实例(2):显示数据表数据

    数据表数据添加后,如添加3条用户信息,分别为“aaa”.“bbb”.“ccc”,现在通过代码的方式显示数据表中的数据. 1.在website项目文件夹中创建 userload.py文件,并且写如下代码 ...

  7. mssql sqlserver 三种数据表数据去重方法分享

    摘要: 下文将分享三种不同的数据去重方法数据去重:需根据某一字段来界定,当此字段出现大于一行记录时,我们就界定为此行数据存在重复. 数据去重方法1: 当表中最在最大流水号时候,我们可以通过关联的方式为 ...

  8. 10Oracle Database 数据表数据查询

    Oracle Database 数据表数据查询 DML 数据操纵语言 - 数据的查看和维护 select / insert /delete /update 基本查询语句 Select [distinc ...

  9. thinkphp添加excel更新数据表数据(优化篇)

    由于主管说使用saveAll更新数据效率太低,要改用sql语句一次执行现在修改 /** * excel开启上传 * author: panzhide * @return array * Date: 2 ...

随机推荐

  1. nasm aat函数 x86

    xxx.asm: %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain dllmain: ...

  2. Redis 博文索引

    博文索引 Redis 对象与编码 Redis 持久化 Redis 主从复制 Redis 哨兵 Redis 缓存淘汰 Redis 集合统计 Redis 简介

  3. 「NGK每日快讯」2021.1.4日NGK第62期官方快讯!

  4. CMD 中运行 xx 命令提示 不是内部或外部命令,也不是可运行的程序或批处理文件的问题

    出现这个问题的原因一般有2个 这个命令依赖某个软件,而你又没有安装 这里你只需要去下载安装好对应的软件,基本上就可以解决上面的问题了. 软件安装好了,但是需要配置环境变量 第二个原因就按照下图,去设置 ...

  5. Java Reference核心原理分析

    本文转载自Java Reference核心原理分析 导语 带着问题,看源码针对性会更强一点.印象会更深刻.并且效果也会更好.所以我先卖个关子,提两个问题(没准下次跳槽时就被问到). 我们可以用Byte ...

  6. js 实现红绿灯变换

    class LightFn{ async run(){ while(true){ console.log('this is green 3000'); await this.sleep(3000); ...

  7. Asp.Net Core学习笔记:(二)视图、模型、持久化、文件、错误处理、日志

    TagHelper 入门 优点:根据参数自动生成,不需要手写超链接,类似Django模板里面的url命令. 在ViewImport中添加TagHelper @addTagHelper *,Micros ...

  8. Vue学习笔记-django-cors-headers安装解决跨域问题

    一  使用环境: windows 7 64位操作系统 二  jango-cors-headers安装解决跨域问题(后端解决方案) 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的 ...

  9. Go benchmark 一清二楚

    前言 基准测试(benchmark)是 go testing 库提供的,用来度量程序性能,算法优劣的利器. 在日常生活中,我们使用速度 m/s(单位时间内物体移动的距离)大小来衡量一辆跑车的性能,同理 ...

  10. WIFI6 基本知识(二)

    WI-FI6核心技术 WI-FI6除了继承了WI-FI5的所有MIMO特性之外,还增加了许多针对高密部署场景的特性.以下是WI-FI6的核心新特性: OFDMA频分复用技术 DL/UL MU-MIMO ...