当你在使用phpoffice/phpexcel 类库时候。composer 会给你提示一句话

  1. Package phpoffice/phpexcel is abandoned, you should avoid using it. Use phpoffice/phpspreadsheet instead

phpexcel 已被废弃,建议我们用phpspreadsheet,

包地址:

  1. https://packagist.org/packages/phpoffice/phpspreadsheet

composer:

  1. composer require phpoffice/phpspreadsheet

使用

引入

use \PhpOffice\PhpSpreadsheet\Spreadsheet;
use \PhpOffice\PhpSpreadsheet\IOFactory;
use \PhpOffice\PhpSpreadsheet\Style\NumberFormat;

导出:

  1. //模板下载
  2. public function template_download()
  3. {
  4.  
  5. $spreadsheet = new Spreadsheet();
  6. $worksheet = $spreadsheet->getActiveSheet();
  7.  
  8. $worksheet->setTitle('导入模板'); //设置当前sheet的标题
  9. $worksheet->getStyle('A1:E1')->getFont()->setBold(true)->setName('Arial')->setSize();
  10. $worksheet->getStyle('B1')->getFont()->setBold(true);
  11. $worksheet->getDefaultColumnDimension()->setWidth();
  12.  
  13. //设置第一栏的标题
  14. $worksheet->setCellValue('A1', '交易流水号');
  15. $worksheet->setCellValue('B1', '开户名');
  16. $worksheet->setCellValue('C1', '卡号');
  17. $worksheet->setCellValue('D1', '交易金额');
  18. $worksheet->setCellValue('E1', '交易时间');
  19.  
  20. //默认填充数据
  21. $explame_data_list = array(
  22. array(
  23. 'bank_deal_no' => '',
  24. 'account_name' => '小明',
  25. 'bank_card' => '',
  26. 'deal_money' => '100.00',
  27. 'deal_time' => date("Y-m-d H:i:s"),
  28. ),
  29. );
  30.  
  31. //第二行起
  32. $baseRow = ; //数据从N-1行开始往下输出 这里是避免头信息被覆盖
  33. foreach ($explame_data_list as $k => $val) {
  34. $i = $k + $baseRow;
  35. $worksheet->setCellValue('A' . $i, $val['bank_deal_no']);
  36. $worksheet->setCellValue('B' . $i, $val['account_name']);
  37. $worksheet->setCellValue('C' . $i, $val['bank_card']);
  38. $worksheet->setCellValue('D' . $i, $val['deal_money']);
  39. $worksheet->setCellValue('E' . $i, $val['deal_time']);;
  40. }
  41.  
  42. //处理 数字过大会进行科学计数法
  43. $worksheet->getStyle('A2')->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER);
  44. $worksheet->getStyle('C2')->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER);
  45.  
  46. $this->downloadExcel($spreadsheet, '批量导入模板-合同表单选项', 'Xls');
  47.  
  48. }
  49.  
  50. /*********************************************************************************************************************/
  51.  
  52. //公共文件,用来传入xls并下载
  53. private function downloadExcel($spreadsheet, $filename, $format)
  54. {
  55. // $format只能为 Xlsx 或 Xls
  56. if ($format == 'Xlsx') {
  57. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  58. } elseif ($format == 'Xls') {
  59. header('Content-Type: application/vnd.ms-excel');
  60. }
  61.  
  62. header("Content-Disposition: attachment;filename="
  63. . $filename . date('Y-m-d') . '.' . strtolower($format));
  64. header('Cache-Control: max-age=0');
  65. $objWriter = IOFactory::createWriter($spreadsheet, $format);
  66.  
  67. $objWriter->save('php://output');
  68.  
  69. //通过php保存在本地的时候需要用到
  70. //$objWriter->save($dir.'/demo.xlsx');
  71.  
  72. //以下为需要用到IE时候设置
  73. // If you're serving to IE 9, then the following may be needed
  74. //header('Cache-Control: max-age=1');
  75. // If you're serving to IE over SSL, then the following may be needed
  76. //header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
  77. //header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
  78. //header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
  79. //header('Pragma: public'); // HTTP/1.0
  80. exit;
  81. }

  

导入

  1. public function import(){
  2. header("content-type:text/html;charset=utf-8");
  3.  
  4. //上传excel文件
  5. $files = request()->file();
  6.  
  7. //将文件保存到public/uploads目录下面
  8. try {
  9. validate(['image'=>'fileSize:1048576|fileExt:xls'])
  10. ->check($files);
  11.  
  12. $savename = [];
  13. foreach($files as $file){
  14. $savename[] = \think\facade\Filesystem::disk('public')->putFile( 'billfile', $file,'md5');
  15. }
  16.  
  17. } catch (think\exception\ValidateException $e) {
  18. return json(['status' => '', 'message' => $e->getMessage()]);
  19. }
  20. //获取文件路径
  21. $filePath = ROOT_PATH().'/public/uploads/'.$savename[];
  22. $spreadsheet = IOFactory::load($filePath);
  23. $sheetData = $spreadsheet->getActiveSheet()->toArray(true, true, true, true,true);
  24. $row_num = count($sheetData);
  25.  
  26. $now_time = time();
  27. $import_data = []; //数组形式获取表格数据
  28. for ($i = ; $i <= $row_num; $i++) {
  29.  
  30. $bank_deal_no = $sheetData[$i]['A'];
  31. $account_name = $sheetData[$i]['B'];
  32. $bank_card = $sheetData[$i]['C'];
  33. $deal_money = $sheetData[$i]['D'];
  34. $deal_time = $sheetData[$i]['E'];
  35.  
  36. if(!empty($bank_deal_no) && !empty($account_name) && !empty($bank_card) && !empty($deal_money) && !empty($deal_time) ){
  37. $import_data[$i]['bank_deal_no'] = $bank_deal_no;
  38. $import_data[$i]['account_name'] = $account_name;
  39. $import_data[$i]['bank_card'] = $bank_card;
  40. $import_data[$i]['deal_money'] = $deal_money;
  41. $import_data[$i]['deal_time'] = $deal_time;
  42. $import_data[$i]['create_time'] = $now_time;
  43. $import_data[$i]['update_time'] = $now_time;
  44. }
  45. }
  46.  
  47. sort($import_data);
  48.  
  49. if (empty($import_data)) {
  50. return json(['status' => '', 'message' => '数据解析失败']);
  51. }
  52.  
  53. $total_num = count($import_data);
  54. if ($total_num > ) {
  55. return json(['status' => '', 'message' => '数据超出限制,最多100条']);
  56. }
  57.  
  58. //校验是否重复:交易流水号
  59. $data_array = array_column($import_data, 'bank_deal_no');
  60. $data_ids = implode(',', $data_array);
  61. $result_data = Db::name('user_bank_bill')
  62. ->field('bank_deal_no')
  63. ->where('bank_deal_no', 'in', $data_ids)
  64. ->select()
  65. ->toArray();
  66.  
  67. $error_message = '';
  68. if (!empty($result_data)) {
  69. $result_data_array = array_column($result_data, 'bank_deal_no');
  70. $result_data_ids = implode(',', $result_data_array);
  71. $error_message = '以下流水号有重复,已筛选出: '.$result_data_ids;
  72. foreach ($import_data as $key => $value) {
  73. if(in_array($value['bank_deal_no'],$result_data_array)){
  74. unset($import_data[$key]);
  75. }
  76. }
  77. }
  78.  
  79. if(!empty($import_data)){
  80. //将数据保存到数据库
  81. $res = Db::name('user_bank_bill')->insertAll($import_data);
  82. if ($res) {
  83. return json(['status' => '', 'message' => '操作成功','result'=>$error_message]);
  84. } else {
  85. return json(['status' => '', 'message' => '提交失败,请刷新重试']);
  86. }
  87. }
  88.  
  89. return json(['status' => '', 'message' => '数据错误','result' => $error_message]);
  90.  
  91. }

【PHP】使用phpoffice/phpspreadsheet导入导出数据的更多相关文章

  1. 【PHP】使用phpoffice/phpexcel导入导出数据

    本例以thinkphp5.1为例 包地址: https://packagist.org/packages/phpoffice/phpexcel 使用: composer require phpoffi ...

  2. CRL快速开发框架系列教程九(导入/导出数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. mysql导入导出数据中文乱码解决方法小结

    linux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqld ...

  4. Android开发笔记:SQLite导入导出数据

    SQLite是Android中最方便使用的数据库了,现在看下如何快速的在SQLite中导入导出数据. 首先由于是.NET项目转Android,原有数据库使用的是SQLSERVER,由于项目相同部分结构 ...

  5. 解决mysql导入导出数据乱码问题

    最近在linux上面用mysqldump导出数据,放在windows系统中导入就会出现中文乱码,然后就会导致出现: Unknown MySQL server host和Can't connect to ...

  6. [转]mysql导入导出数据中文乱码解决方法小结

    本文章总结了mysql导入导出数据中文乱码解决方法,出现中文乱码一般情况是导入导入时编码的设置问题,我们只要把编码调整一致即可解决此方法,下面是搜索到的一些方法总结,方便需要的朋友. linux系统中 ...

  7. oracle中导入导出数据备份数据库

    原文:oracle中导入导出数据备份数据库 数据库所在位置                         将数据导出到的文件名                    用户名 备份数据库 :exp c ...

  8. PLSQL导入/导出数据方法

    PLSQL导入/导出数据方法 PLSQL导入/导出数据方法 以前导数据库信息的时候,总是会先开启sql窗口,把自己手写的建表文件复制进去,然后再导入数据信息. 今天突然懒得去找以前的建表文件,而想用S ...

  9. oracle10g和oracle11g导入导出数据区别

    其中flxuser为用户名,flxuser为密码,file值为导入到数据库中的备份文件. oracle10g和oracle11g导入导出数据的命令方式大有不同: oracle10g导入数据: imp  ...

随机推荐

  1. Java SpringBoot 手记

    SpringBoot Git:https://github.com/spring-projects/spring-boot Maven (mvn)环境配置: 下载地址:http://maven.apa ...

  2. JavaSE理论篇

    将已学过的知识记录在此,既能便于以后温习又能方便知识共享,做到共同成长. 计算机语言发展简史 主要分为三个阶段 机器语言:打点机,有点表示1,没有表示0,打点计时器 低级语言:汇编语言 高级语言:Ja ...

  3. The 2016 ACM-ICPC Asia China-Final D. Ice Cream Tower 二分 + 贪心

    题目大意: 对于给出的n个冰激凌球的大小,满足下面的球的大小是上一个的至少2倍,对于给出的k(由k的冰激凌球才能算作一个冰激凌塔),问n个冰激凌球可以最多堆出多少个高度为k的冰激凌塔 题目分析: 对于 ...

  4. 使用django的MTV开发模式返回一个网页

    1.MTV开发模式介绍 M:Models 模型(数据) 与数据组织相关的功能.组织和存储数据的方法和模式,与数据模型相关的操作. T:Templates 模板(样式) 与表现相关的所有功能.页面展示风 ...

  5. 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 ...

  6. 为什么使用正则RegExp.test( )方法时第一次是 true,第二次是false?

    今天朋友问我一个问题,我现在需要多次匹配同一个内容,但是为什么我第一次匹配,直接是 true,而第二次匹配确实 false 呢? var s1 = "MRLP"; var s2 = ...

  7. JQuery系列(6) - jQuery设计思想

    jQuery是目前使用最广泛的javascript函数库. 据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库.微软公司甚至把jQuery作为他们的官方库. JQuery设计 ...

  8. js 递归 汉诺塔的例子

    程序调用自身的编程技巧称为递归. //汉诺塔的游戏,n为圆盘编号数量,编号,a,b,c代表的是三个柱子 var hanio=function(n,a,b,c){     if(n>0){    ...

  9. 学习:CMP/TEST比较指令

    cmp指令:比较 cmp指令,和sub指令的最大的不同点就是影响标志位 不储存结果 1.当前汇编指令为cmp ecx,edx 2.当前ecx寄存器中的地址为00000000,edx寄存器中的地址000 ...

  10. 通过日志解决问题的一个小例子-http换端口

    这个例子是将http服务的监听端口改为8999后重启服务报错: 此时查看日志/var/log/message,显示如下: 如红笔所示轨迹得到设置端口类型的命令:semanage port -a -t ...