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

导入

    /*** 导入*/protected function import(){$this->model="调用数据表模型";$file = $this->request->request('file');if (!$file) {$this->error(__('Parameter %s can not be empty', 'file'));}$filePath = ROOT_PATH . DS . 'public' . DS . $file;if (!is_file($filePath)) {$this->error(__('No results were found'));}//实例化reader$ext = pathinfo($filePath, PATHINFO_EXTENSION);if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {$this->error(__('Unknown data format'));}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 = $this->model->getQuery()->getTable();$database = \think\Config::get('database.database');$fieldArr = [];$list = db()->query("SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?", [$table, $database]); foreach ($list as $k => $v) {if ($importHeadType == 'comment') {$fieldArr[$v['COLUMN_COMMENT']] = $v['COLUMN_NAME'];} else {$fieldArr[$v['COLUMN_NAME']] = $v['COLUMN_NAME'];}}//获取数据表的字段和注释信息组成新的数组 结束//加载文件$insert = [];try {if (!$PHPExcel = $reader->load($filePath)) {$this->error(__('Unknown data format'));}$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) {$this->error($exception->getMessage());}if (!$insert) {$this->error(__('No rows were updated'));}try {//导入数据$this->model->saveAll($insert);} catch (PDOException $exception) {$msg = $exception->getMessage();if (preg_match("/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is", $msg, $matches)) {$msg = "导入失败,包含【{$matches[1]}】的记录已存在";};$this->error($msg);} catch (Exception $e) {$this->error($e->getMessage());}$this->success();}

PhpSpreadsheet导入相关推荐

  1. PHPOffice / PhpSpreadsheet导入大量数据导致内存溢出

    内容分块读取 官方文档 https://phpspreadsheet.readthedocs.io/en/latest/topics/reading-files/#error-handling 建议解 ...

  2. php excel 导入2ge,风之涯技术博客 - 使用PhpSpreadsheet导入导出Excel简单描述

    最近做项目,遇到一个需要excel.word导出的功能案例,所以找到了PhpSpreadsheet进行导出,不要问我为什么不用PHPExcel,因为PHPExcel已经不更新了,对后面的扩展不太好.今 ...

  3. 使用PhpSpreadsheet 导入wps编辑过的excel文件内存溢出问题

    问题:用 office excel新建了一个.xlsx文件,发给客户后,客户用wps编辑过,导入系统出现内存溢出,导致整个系统崩溃. 注:一定要记得加 $reader->setReadDataO ...

  4. php导入excel到mysql的方法

    PhpSpreadsheet 实测 1. https://phpspreadsheet.readthedocs.io/en/latest/ 2 . 查看 phpinfo() 时,发现  php_zip ...

  5. 使用phpOffice导入excel和word

    项目中要用到通过phpexcel和word导入数据,这次使用了phpOffice,excel识别的很准确,导入的word中还能保留图片(会转成base64)非常好用. 首先使用composer安装 c ...

  6. PHPExcel大文件导入数据库

    PhpOffice\PhpSpreadsheet导入Excel保存数据库,数据量在几十万,上百万后,读取excel文件内容内存会严重不足,本地测试50M的Excel数据读取,16G内存会立马跑满. $ ...

  7. oracle 常用sql语句

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unloc ...

  8. 使用PhpSpreadsheet将Excel导入到MySQL数据库

    使用PhpSpreadsheet将Excel导入到MySQL数据库 日常开发中,我们经常遇到这样的场景,需要将一个Excel表格数据如客户信息.学生成绩表导入到系统数据库中,然后在系统中进行进一步操作 ...

  9. phpspreadsheet excel导入导出

    单个sheet页Excel2003版最大行数是65536行.Excel2007开始的版本最大行数是1048576行.Excel2003的最大列数是256列,2007以上版本是16384列. xlswr ...

最新文章

  1. 机器学习Python实践》——数据导入(CSV)
  2. Python Tensorflow神经网络实现股票预测
  3. 带有Spring Boot和Spring Cloud的Java微服务
  4. 前端学习(3267):js中this在类中的表现
  5. OpenJudge NOI 1.7 10:简单密码
  6. docker创建镜像之Dockerfile
  7. 编码的奥秘:存储器组织
  8. opensips服务端搭建
  9. “WFCF”数据安全及隐私保护声明
  10. 抖音很火的动态表白源码
  11. 手把手教你配置苹果APNS推送服务
  12. LeetCode报错:Line 1034:Char9
  13. 银屑病推荐益生菌摄入(持续更新中)
  14. 生产周期缩短42%,效率提升28%,申菱展示数据智能成绩单
  15. 苹果不允许 iOS 应用内置购买(IAP)使用第三方支付方式,那么跨平台的支付怎么解决这个问题?
  16. 自动获取cookie,爬取新浪微博热门评论
  17. Discuz!开发之判断蜘蛛(机器人)访问函数checkrobot()介绍
  18. ElasticSearcho从入门到放弃:(三)Beats
  19. A Crash Course on the Depths of Win32 Structured Exception Handling(文章翻译)
  20. 基于Arduinoros的温度控制器

热门文章

  1. kafka 修改分区_kafka的分区数设置
  2. 办公小贴士之:Excel奇偶行隔行填充颜色
  3. SAP 采购申请、采购订单的审批策略
  4. 电脑怎么找到tomcat端口_查看tomcat端口号(怎么看tomcat的端口号)
  5. vue路由传参 params传参不能传对象
  6. 力扣OJ 剑指 Offer(1-30)
  7. qq邮箱imtp收件服务器,qq邮箱代收outlook
  8. Mysql 新增分区,删除分区,合并分区
  9. SingleChildScrollView内容不超出屏幕时下拉回弹
  10. 金仓数据库KingbaseES ksql工具用户指南及参考--2. Ksql快速启动