【PHP】使用phpoffice/phpspreadsheet导入导出数据
当你在使用phpoffice/phpexcel 类库时候。composer 会给你提示一句话
- Package phpoffice/phpexcel is abandoned, you should avoid using it. Use phpoffice/phpspreadsheet instead
phpexcel 已被废弃,建议我们用phpspreadsheet,
包地址:
- https://packagist.org/packages/phpoffice/phpspreadsheet
composer:
- composer require phpoffice/phpspreadsheet
使用
引入
导出:
- //模板下载
- public function template_download()
- {
- $spreadsheet = new Spreadsheet();
- $worksheet = $spreadsheet->getActiveSheet();
- $worksheet->setTitle('导入模板'); //设置当前sheet的标题
- $worksheet->getStyle('A1:E1')->getFont()->setBold(true)->setName('Arial')->setSize();
- $worksheet->getStyle('B1')->getFont()->setBold(true);
- $worksheet->getDefaultColumnDimension()->setWidth();
- //设置第一栏的标题
- $worksheet->setCellValue('A1', '交易流水号');
- $worksheet->setCellValue('B1', '开户名');
- $worksheet->setCellValue('C1', '卡号');
- $worksheet->setCellValue('D1', '交易金额');
- $worksheet->setCellValue('E1', '交易时间');
- //默认填充数据
- $explame_data_list = array(
- array(
- 'bank_deal_no' => '',
- 'account_name' => '小明',
- 'bank_card' => '',
- 'deal_money' => '100.00',
- 'deal_time' => date("Y-m-d H:i:s"),
- ),
- );
- //第二行起
- $baseRow = ; //数据从N-1行开始往下输出 这里是避免头信息被覆盖
- foreach ($explame_data_list as $k => $val) {
- $i = $k + $baseRow;
- $worksheet->setCellValue('A' . $i, $val['bank_deal_no']);
- $worksheet->setCellValue('B' . $i, $val['account_name']);
- $worksheet->setCellValue('C' . $i, $val['bank_card']);
- $worksheet->setCellValue('D' . $i, $val['deal_money']);
- $worksheet->setCellValue('E' . $i, $val['deal_time']);;
- }
- //处理 数字过大会进行科学计数法
- $worksheet->getStyle('A2')->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER);
- $worksheet->getStyle('C2')->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER);
- $this->downloadExcel($spreadsheet, '批量导入模板-合同表单选项', 'Xls');
- }
- /*********************************************************************************************************************/
- //公共文件,用来传入xls并下载
- private function downloadExcel($spreadsheet, $filename, $format)
- {
- // $format只能为 Xlsx 或 Xls
- if ($format == 'Xlsx') {
- header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
- } elseif ($format == 'Xls') {
- header('Content-Type: application/vnd.ms-excel');
- }
- header("Content-Disposition: attachment;filename="
- . $filename . date('Y-m-d') . '.' . strtolower($format));
- header('Cache-Control: max-age=0');
- $objWriter = IOFactory::createWriter($spreadsheet, $format);
- $objWriter->save('php://output');
- //通过php保存在本地的时候需要用到
- //$objWriter->save($dir.'/demo.xlsx');
- //以下为需要用到IE时候设置
- // If you're serving to IE 9, then the following may be needed
- //header('Cache-Control: max-age=1');
- // If you're serving to IE over SSL, then the following may be needed
- //header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
- //header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
- //header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
- //header('Pragma: public'); // HTTP/1.0
- exit;
- }
导入
- public function import(){
- header("content-type:text/html;charset=utf-8");
- //上传excel文件
- $files = request()->file();
- //将文件保存到public/uploads目录下面
- try {
- validate(['image'=>'fileSize:1048576|fileExt:xls'])
- ->check($files);
- $savename = [];
- foreach($files as $file){
- $savename[] = \think\facade\Filesystem::disk('public')->putFile( 'billfile', $file,'md5');
- }
- } catch (think\exception\ValidateException $e) {
- return json(['status' => '', 'message' => $e->getMessage()]);
- }
- //获取文件路径
- $filePath = ROOT_PATH().'/public/uploads/'.$savename[];
- $spreadsheet = IOFactory::load($filePath);
- $sheetData = $spreadsheet->getActiveSheet()->toArray(true, true, true, true,true);
- $row_num = count($sheetData);
- $now_time = time();
- $import_data = []; //数组形式获取表格数据
- for ($i = ; $i <= $row_num; $i++) {
- $bank_deal_no = $sheetData[$i]['A'];
- $account_name = $sheetData[$i]['B'];
- $bank_card = $sheetData[$i]['C'];
- $deal_money = $sheetData[$i]['D'];
- $deal_time = $sheetData[$i]['E'];
- if(!empty($bank_deal_no) && !empty($account_name) && !empty($bank_card) && !empty($deal_money) && !empty($deal_time) ){
- $import_data[$i]['bank_deal_no'] = $bank_deal_no;
- $import_data[$i]['account_name'] = $account_name;
- $import_data[$i]['bank_card'] = $bank_card;
- $import_data[$i]['deal_money'] = $deal_money;
- $import_data[$i]['deal_time'] = $deal_time;
- $import_data[$i]['create_time'] = $now_time;
- $import_data[$i]['update_time'] = $now_time;
- }
- }
- sort($import_data);
- if (empty($import_data)) {
- return json(['status' => '', 'message' => '数据解析失败']);
- }
- $total_num = count($import_data);
- if ($total_num > ) {
- return json(['status' => '', 'message' => '数据超出限制,最多100条']);
- }
- //校验是否重复:交易流水号
- $data_array = array_column($import_data, 'bank_deal_no');
- $data_ids = implode(',', $data_array);
- $result_data = Db::name('user_bank_bill')
- ->field('bank_deal_no')
- ->where('bank_deal_no', 'in', $data_ids)
- ->select()
- ->toArray();
- $error_message = '';
- if (!empty($result_data)) {
- $result_data_array = array_column($result_data, 'bank_deal_no');
- $result_data_ids = implode(',', $result_data_array);
- $error_message = '以下流水号有重复,已筛选出: '.$result_data_ids;
- foreach ($import_data as $key => $value) {
- if(in_array($value['bank_deal_no'],$result_data_array)){
- unset($import_data[$key]);
- }
- }
- }
- if(!empty($import_data)){
- //将数据保存到数据库
- $res = Db::name('user_bank_bill')->insertAll($import_data);
- if ($res) {
- return json(['status' => '', 'message' => '操作成功','result'=>$error_message]);
- } else {
- return json(['status' => '', 'message' => '提交失败,请刷新重试']);
- }
- }
- return json(['status' => '', 'message' => '数据错误','result' => $error_message]);
- }
【PHP】使用phpoffice/phpspreadsheet导入导出数据的更多相关文章
- 【PHP】使用phpoffice/phpexcel导入导出数据
本例以thinkphp5.1为例 包地址: https://packagist.org/packages/phpoffice/phpexcel 使用: composer require phpoffi ...
- CRL快速开发框架系列教程九(导入/导出数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- mysql导入导出数据中文乱码解决方法小结
linux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqld ...
- Android开发笔记:SQLite导入导出数据
SQLite是Android中最方便使用的数据库了,现在看下如何快速的在SQLite中导入导出数据. 首先由于是.NET项目转Android,原有数据库使用的是SQLSERVER,由于项目相同部分结构 ...
- 解决mysql导入导出数据乱码问题
最近在linux上面用mysqldump导出数据,放在windows系统中导入就会出现中文乱码,然后就会导致出现: Unknown MySQL server host和Can't connect to ...
- [转]mysql导入导出数据中文乱码解决方法小结
本文章总结了mysql导入导出数据中文乱码解决方法,出现中文乱码一般情况是导入导入时编码的设置问题,我们只要把编码调整一致即可解决此方法,下面是搜索到的一些方法总结,方便需要的朋友. linux系统中 ...
- oracle中导入导出数据备份数据库
原文:oracle中导入导出数据备份数据库 数据库所在位置 将数据导出到的文件名 用户名 备份数据库 :exp c ...
- PLSQL导入/导出数据方法
PLSQL导入/导出数据方法 PLSQL导入/导出数据方法 以前导数据库信息的时候,总是会先开启sql窗口,把自己手写的建表文件复制进去,然后再导入数据信息. 今天突然懒得去找以前的建表文件,而想用S ...
- oracle10g和oracle11g导入导出数据区别
其中flxuser为用户名,flxuser为密码,file值为导入到数据库中的备份文件. oracle10g和oracle11g导入导出数据的命令方式大有不同: oracle10g导入数据: imp ...
随机推荐
- Java SpringBoot 手记
SpringBoot Git:https://github.com/spring-projects/spring-boot Maven (mvn)环境配置: 下载地址:http://maven.apa ...
- JavaSE理论篇
将已学过的知识记录在此,既能便于以后温习又能方便知识共享,做到共同成长. 计算机语言发展简史 主要分为三个阶段 机器语言:打点机,有点表示1,没有表示0,打点计时器 低级语言:汇编语言 高级语言:Ja ...
- The 2016 ACM-ICPC Asia China-Final D. Ice Cream Tower 二分 + 贪心
题目大意: 对于给出的n个冰激凌球的大小,满足下面的球的大小是上一个的至少2倍,对于给出的k(由k的冰激凌球才能算作一个冰激凌塔),问n个冰激凌球可以最多堆出多少个高度为k的冰激凌塔 题目分析: 对于 ...
- 使用django的MTV开发模式返回一个网页
1.MTV开发模式介绍 M:Models 模型(数据) 与数据组织相关的功能.组织和存储数据的方法和模式,与数据模型相关的操作. T:Templates 模板(样式) 与表现相关的所有功能.页面展示风 ...
- version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference
在python中运行如下: $ python >>> import wx 输出:symbol _ZNSt7__cxx1112basic_stringIwSt11char_traits ...
- 为什么使用正则RegExp.test( )方法时第一次是 true,第二次是false?
今天朋友问我一个问题,我现在需要多次匹配同一个内容,但是为什么我第一次匹配,直接是 true,而第二次匹配确实 false 呢? var s1 = "MRLP"; var s2 = ...
- JQuery系列(6) - jQuery设计思想
jQuery是目前使用最广泛的javascript函数库. 据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库.微软公司甚至把jQuery作为他们的官方库. JQuery设计 ...
- js 递归 汉诺塔的例子
程序调用自身的编程技巧称为递归. //汉诺塔的游戏,n为圆盘编号数量,编号,a,b,c代表的是三个柱子 var hanio=function(n,a,b,c){ if(n>0){ ...
- 学习:CMP/TEST比较指令
cmp指令:比较 cmp指令,和sub指令的最大的不同点就是影响标志位 不储存结果 1.当前汇编指令为cmp ecx,edx 2.当前ecx寄存器中的地址为00000000,edx寄存器中的地址000 ...
- 通过日志解决问题的一个小例子-http换端口
这个例子是将http服务的监听端口改为8999后重启服务报错: 此时查看日志/var/log/message,显示如下: 如红笔所示轨迹得到设置端口类型的命令:semanage port -a -t ...