thinkphp的把excel导入数据库,element-ui上传

引语:
我自己早上从开始了解到完成,走了很多坑,上传的bug,找参差不齐的资料筛选,后台接收问题等。。最后完成了,希望能给其他人以帮助,珍惜生命。

一、工具介绍
phpspreadsheet:
excel包使用phpspreadsheet,php就是用这个,phpexcel已经不维护了,他们建了这个新分支用来操作excel,所以使用他吧。
thinkphp6:
thinkphp6,5区别不大,都可以使用,6更好,主要区别是6的写法用静态调用。5的话不行,连接数据库有点区别,除此之外本demo其他代码兼容。
element-ui:
前端上传使用的ui框架,现在尽量别写原生代码,找个框架使用吧。
二、代码部分
前端

<el-upload
      class="upload-demo"
       :auto-upload="false"
       ref="upload"
      :on-change="handleChange"
      :show-file-list="false"
       accept=".xlsx"
       :action= url //url需要你定义
    >
      导入
      <!-- <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> -->
    </el-upload> 
handleChange(file, fileList) {
	  var fileData = new FormData()
      this.$refs.upload.action=this.url  // "填写你的url"
      this.$refs.upload.submit();
    }

后端php接收
使用composer下载phpspreadsheet

composer require phpoffice/phpspreadsheet

首先注意导包

use think\facade\Request;
use PhpOffice\PhpSpreadsheet\IOFactory;
use think\facade\Session;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use think\facade\Db;
use think\facade\Filesystem;
 public function importData()
     {
        $file= request()->file('file');
         $user_id=Request::get('id');
         // 上传到本地服务器
         $savename =  \think\facade\Filesystem::disk('public')->putFile( 'temp', $file);
         
         $reader = IOFactory::createReader('Xlsx');
         $reader->setReadDataOnly(TRUE);
         $spreadsheet = $reader->load('storage/'.$savename); //载入excel表格
 
         $worksheet = $spreadsheet->getActiveSheet();
         $highestRow = $worksheet->getHighestRow(); // 总行数
         $highestColumn = $worksheet->getHighestColumn(); // 总列数
         $highestColumnIndex = Coordinate::columnIndexFromString($highestColumn);
         $lines = $highestRow - 1;
         if ($lines <= 0) {
             exit('Excel表格中没有数据');
         }
         $sql = "INSERT INTO `t_student` (`name`, `age`
         ) VALUES ";
        
         for ($row = 2; $row <= $highestRow; ++$row) {
             $name= $worksheet->getCellByColumnAndRow(1, $row)->getValue();
             $age= $worksheet->getCellByColumnAndRow(2, $row)->getValue();
            // 这里可以处理数据
             $sql .= "('$name','$age'),";
         }
         $sql = rtrim($sql, ",");
         Db::query($sql);
         return json(['code' => 20000, 'message' => '导入成功']);
     }
     

上面的代码第一行我必须说明一下

request()->file('file');

这个file的方法是获取表单的数据,如果你用的是formdata来传输的话,估计会遇到问题,后台一直取不到。我暂时没解决,这个方法是识别form表单的name,然后取这个input的value的。如果你有取得办法,欢迎告诉我,谢谢。

数据库sql。

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_student
-- ----------------------------
DROP TABLE IF EXISTS `t_student`;
CREATE TABLE `t_student`  (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',
  `age` int(6) NOT NULL DEFAULT 0 COMMENT '年龄',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

然后假设你要导入数据是
在这里插入图片描述

后来想了下,其实根据业务的需求,用thinkphp的模型来弄更好,因为这是简单的插入,不是什么复杂的sql,模型处理不来,所以仔细思考下你的sql是不是非拼接不可。

做个教程不为别的,就是希望帮助大家少走一点坑 !

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值