Excel导入导出功能我们经常用到,下面记录自己的实现方法。Helper类PHPExcelHelper 可以直接拿过来使用。在控制器中实现数据组装,model中实现数据验证,最后导入或导出。

helper类中导出导入的写法

namespace app\common\helper;use app\common\constant\SystemConstant;
use PHPExcel;trait PHPExcelHelper
{/*** excel表格导出* @param string $fileName 文件名称* @param array $headArr 表头名称* @param array $data 要导出的数据* @author static7*/private function excelExport($fileName = '', $headArr = [], $data = []){$objPHPExcel = new PHPExcel();$objPHPExcel->getProperties();$keyA = ord("A"); // 设置表头foreach ($headArr as $v) {$colum = chr($keyA);$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum . '1', $v);$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum . '1', $v);$keyA += 1;}$column = 2;$objActSheet = $objPHPExcel->getActiveSheet();foreach ($data as $key => $rows) { // 行写入$span = ord("A");foreach ($rows as $keyName => $value) { // 列写入//判断数据是否有数组,如果有数组,转换成字符串if(is_array($value)){$value = implode("、", $value);}$objActSheet->setCellValue(chr($span) . $column, $value);$span++;}$column++;}$fileName .= "_" . date("Y_m_d", time()) . ".xls";//$fileName .= "_" . date("Y_m_d", Request()->instance()->time()) . ".xls";//$fileName = iconv("utf-8", "gb2312", $fileName); // 重命名表$objPHPExcel->setActiveSheetIndex(0); // 设置活动单指数到第一个表,所以Excel打开这是第一个表header('Content-Type: application/vnd.ms-excel');header("Content-Disposition: attachment;filename=" . $fileName);header('Cache-Control: max-age=0');$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');$objWriter->save('php://output'); // 文件通过浏览器下载exit();}//导入函数private function excelImport($file){header("content-type:text/html;charset=utf-8");//文件上传到服务器,返回文件的路径$info = $this->uploadFile($file);//$objPHPExcel = new PHPExcel();//获取文件后缀$suffix = $this->getExtension($info);//判断哪种类型if ($suffix == "xlsx") {$reader = \PHPExcel_IOFactory::createReader('Excel2007');} else {$reader = \PHPExcel_IOFactory::createReader('Excel5');}//载入excel文件$file_path = public_path().'public\storage\\'.$info;//$file_path = root_path() . "public\storage". $info;$excel = $reader->load($file_path);//读取第一张表$sheet = $excel->getSheet(0);//获取总行数$row_num = $sheet->getHighestRow(); //var_dump($row_num);die;//获取总列数$col_num = $sheet->getHighestColumn();if($sheet){return $sheet;}else{return false;}}}

在控制器中
导出

    public function export(Request $request){$ids = $request->post('ids');$user = UserModel::field('id,user_name,account,sex,phone,email,pid as post,oid as organization,star,is_post');//如果有选择时,导出部分if (!empty($ids)) {$user = $user->whereIn('id',$ids)->select()->toArray();}else{//导出全部$user = $user->select()->toArray();}$headArr = ['ID', '姓名', '帐号', '性别', '手机号', '邮件', '岗位', '部门', '星级', '是否在职'];$fileName = '成员表信息表';if (empty($user)) {ajaxR(SystemConstant::SYSTEM_FAILURE, 'no data');}$res = $this->excelExport($fileName, $headArr, $user);if ($res) {ajaxR(SystemConstant::SYSTEM_SUCCESS, 'ok', $res);} else {ajaxR(SystemConstant::SYSTEM_FAILURE, '导出失败');}}

导入写法

 //excel导入  excelImport 需要上传文件,传递导入文件的头信息,需要解析出文件的内容,表头public function import(Request $request){$file = $request->file('user_file');if (empty($file)) {ajaxR(SystemConstant::SYSTEM_FAILURE, 'File empty!:(');}//写法一//------------------------------------------------------------//文件上传,并读取文件中的数据$sheet = $this->excelImport($file)->toArray();if(!$sheet){ajaxR(SystemConstant::SYSTEM_FAILURE,'Data empty!:(');}//读取第一张表//获取总行数array_shift($sheet);  //删除第一个数组(标题);//组装数据,以及校验转化$data = [];$i = 0;foreach ($sheet as $k => $v) {if(empty(array_filter($v))){continue;}if(is_numeric($v[1])){ //如果是数字强制转换$v[1] = (int)$v[1];}$data[$k]['user_name'] = $v[1];$data[$k]['pwd'] = md5('123456');//判断是否有重复的账号$account = $this->get_user_fields(['account'=>$v[2]],'account');if($account){ajaxR(SystemConstant::SYSTEM_FAILURE,'The account '.$v[2].' is exist!:)');}$data[$k]['account'] = $v[2];//判断性别if($v[3] == '男'){$data[$k]['sex'] = 1;}elseif ($v[3]=='女'){$data[$k]['sex'] = 2;}else{$data[$k]['sex'] = 0;}$data[$k]['phone'] = $v[4];$data[$k]['email'] = $v[5];//根据excel中岗位判断岗位id$pid = $this->get_post_id($v[6]);$data[$k]['pid'] = $pid;//判断部门if($v[7]){$oid = $this->get_organization_id(['Organization_Name'=>$v[7]],'id')->id;}else{$oid = null;}$data[$k]['oid'] = $oid;if($v[8]){$star = $v[8];}else{$star = 0;}$data[$k]['star'] = $star;//判断是否在职if($v[9] == '离职'){$is_post = 1;}else{$is_post = 0;}$data[$k]['is_post'] = $is_post;$i++;}//-----------------------------------------//写法2//--------------------------------------------------------------------------//文件上传,并读取文件中的数据/*$sheet = $this->excelImport($file);$row_num = $sheet->getHighestRow();if(!$sheet){ajaxR(SystemConstant::SYSTEM_FAILURE,'Data empty!:(');}$data = []; //数组形式获取表格数据for ($i = 2; $i <= $row_num; $i++) {$data[$i]['user_name'] = $sheet->getCell("B" . $i)->getValue();$data[$i]['pwd'] = md5(123456);//判断是否有重复的账号$account = $sheet->getCell("C" . $i)->getValue();$accounts = $this->get_user_fields(['account'=>$account],'account');if($accounts){ajaxR(SystemConstant::SYSTEM_FAILURE,'The account '.$accounts.' is exist!:)');}$data[$i]['account'] = $account;//判断性别$sex = $sheet->getCell("D" . $i)->getValue();if($sex == "男"){$sex = 1;}elseif ($sex ==2){$sex =2;}else{$sex = 0;}$data[$i]['sex'] = $sex;$data[$i]['phone'] = $sheet->getCell("E" . $i)->getValue();$data[$i]['email'] = $sheet->getCell("F" . $i)->getValue();//判断岗位id$p_name = $sheet->getCell("G" . $i)->getValue();$pid = $this->get_post_id($p_name);$data[$i]['pid'] = $pid;//判断组织机构id$o_name =  $sheet->getCell("H" . $i)->getValue();if($o_name){$oid = $this->get_organization_id(['Organization_Name'=>$o_name],'id')->id;}else{$oid = null;}$data[$i]['oid'] = $oid;$data[$i]['star'] = $sheet->getCell("I" . $i)->getValue();//判断是否在职$is_post = $sheet->getCell("J" . $i)->getValue();if($is_post == '离职'){$is_post = 1;}else{$is_post = 0;}$data[$i]['is_post'] = $is_post;}if (empty($data)) {ajaxR(SystemConstant::SYSTEM_FAILURE,'数据解析失败');}//判断需要导入的数据中,是否有重复的account$account_array = array_column($data,'account'); //输出数组中account的值$accounts = implode(',',$account_array);//$account_result = Db::name('user')->field('account')->where('account','in',$account_array)->select()->toArray();$account_result = UserModel::field('account')->whereIn('account',$account_array)->select();if(count($account_result)){ajaxR(SystemConstant::SYSTEM_FAILURE,'The account '.$accounts.' is exist!:)');}*///--------------------------------------------------------------------------------if($data){//保存$data
/*            $user = new UserModel();$user = $user->saveAll($data);*/$user_num =  Db::name('user')->limit(100)->insertAll($data); //返回插入的条数$result = ['user_num'=>$user_num];if($result){ajaxR(SystemConstant::SYSTEM_SUCCESS,'success!:)',$result);}else{ajaxR(SystemConstant::SYSTEM_FAILURE,'save fail!:(');}}else{ajaxR(SystemConstant::SYSTEM_FAILURE,'Data is wrong,It is fail! :(');}}

ThinkPHP6 的Excel导入与导出相关推荐

  1. C# Excel导入、导出

    C# Excel导入.导出 本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含 ...

  2. C# Excel导入与导出

    Excel的结构     1.Workbook工作簿(也就是文件)     2.Sheet(也就是一个表)     3.Row(也就是一个数据行)     4.Cell(单元格)     5.Valu ...

  3. 大数据量的Excel导入和导出

    大数据量的Excel导入和导出 涉及到的技术 poi:使用SXSSFWorkbook,对数据进行分页且批量写入到磁盘(可以是任何outputsteam),减少数据在内存中的存储 easyExcel:从 ...

  4. 前端实现 Excel 导入和导出功能

    注意:Excel的导入.导出功能一般情况下都是服务端完成,这里只是记录一下前端实现方法,供小众场景使用. 这里的实现要依赖第三方库:xlsx. 兼容性:IE9+ 安装 xlsx npm i -S ht ...

  5. 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出

    场景 使用若依前后端分离版实现Excel的导入和导出. 前端:Vue+ElementUI 后端:SpringBoot+POI+Mysql 注: 博客: https://blog.csdn.net/ba ...

  6. 使用POI和EasyExcel实现Excel导入和导出功能

    需求场景 开发中经常会设计到excel的处理,需求场景如下所示: 1.将用户信息导出为excel表格(导出数据) 2.将Excel表中的信息录入到数据库中(导入数据) 操作Excel目前比较流行的就是 ...

  7. Java Excel导入和导出(支持xls导入,xlsx导入,图片导出,百万数据量导出)

    免费源码下载(提取码:qdhy) 工程结构目录 所需JAR包 <dependencies><!-- JUNIT 测试 --><dependency><grou ...

  8. C#Excel导入和导出

    Excel导入 一.在WEB中导入Excel的方法 方法1: 通过OleDB方式获取Excel文件的数据到DataSet中,然后将Dataset中的每笔记录插入到SQL Server using Sy ...

  9. 可以实现一个前端的 Excel 导入和导出功能吗?

    点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流 前言 [**负责人 A]:现在报表部分基于接口的 Excel 的导入和导出功能有点慢,前端这边能不能实现一下这个功能,然后我们在比对看看效果 ...

最新文章

  1. pandas loc()与iloc用法
  2. wxWidgets:wxRadioButton类用法
  3. Sql语句里的递归查询
  4. android:installLocation简析
  5. 开发工具:Git 代码回退功能详解,很实用!
  6. 【OJ】洛谷暴力枚举题单题解锦集
  7. JS Bin Tips and Bits • About
  8. Web前后端交互总结
  9. javascript继承机制的设计思想(ryf)
  10. Python爬虫方法三部曲
  11. python脚本微博自动转发抽奖_微博自动转发抽奖软件
  12. 将 SPSS 分析技术应用于大数据
  13. 牛客 彩虹 【经典状压dp】
  14. 三大通信协议(1)UART
  15. 2020年8月8日美团笔试题
  16. 机器学习(6)——凸优化理论(一)
  17. QT 信号toggled triggered区别
  18. Docker容器之cgroup搭建
  19. 本地测试dubbo远程调用找不到provider
  20. 关于AsyncHttpClient的cz.msebera.android.httpclient.Header

热门文章

  1. Java 数组最佳指南,快收藏让它吃灰
  2. 《惢客创业日记》2020.07.04(周六)小学生来搅局?
  3. 电池管理系统(BMS)作用、故障分析方法及常见故障分析
  4. NVIDIA GeForce GTX 1080Ti参数 quadro系列参数
  5. Android系统内核cpufreq技术分析
  6. hMailServer+foxmail配置局域网邮件服务器
  7. python俄罗斯方块实训报告_Python 俄罗斯方块游戏
  8. 八、让照片说话之SadTalk
  9. deepfreeze(冰点还原)--图文使用…
  10. 秀一下人民解放军的二等功勋章和遥不可及的《家庭二等功》勋章