引语:
我自己早上从开始了解到完成,走了很多坑,上传的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是不是非拼接不可。
做个教程不为别的,就是希望帮助大家少走一点坑 !