我们都知道admin管理员,在很多时候需要直接从外面导入excel表格的数据内容,昨天刚刚解决了这个问题,在次给大家分享一下,我们先从前台开始吧。
前台要解决的问题时,如何上传文件,如何获取文件后缀名,基本就这些内容。
上传我知道的有两种,一种是通过表单提交的形式,一种是使用ajax的方式。两种我都写了,第一种,存在一个比较棘手的form表单提交会跳转页面的问题,也有解决的办法,不过比较麻烦。所以推荐使用ajax的方式。
前端
1,html页面内容
<div class="lend_into_c hide">
<h2 style="padding-top: 20px;">选择文件</h2>
<div class="col-sm-10">
<p class="form-control-static">
<input type="file" id="inputfile" name="fileTrans"/>
</p>
</div>
<div class="cz_lend">
<button class="lend_save btn btn-default">保存</button>
<button class="lend_q btn btn-default">取消</button>
</div>
</div>
2,js内容
//使用ajax上传文件
alert("请选择文件");
}else{
var files_name=files[0].name;//获取文件名称
var zh=(/[^\.]+$/);
var files_name=files_name.match(zh);//中正则获取后缀名称
//console.log(files_name[0]);
if(files_name[0]!=='xls'){//拦截不是excel表格的文件
alert("请选择excel表格");
}else{
var formData = new FormData();//提交文件
//为FormData对象添加数据
$.each(files, function(i, files) {//一定要见数据加入进去
formData.append('upload_file', files);
});
//console.log(formData);//可以先打印出来看看,有数据了在让发送ajax请求
$.ajax({
type:"post",
url:"/admin/lend_in",
data:formData,
dataType: 'JSON',
contentType:false,//必须false才能自动加上正确的 content-type
processData:false,// 必须false才会避开jQuery对 formdata 的默认处理 XMLHttpRequest会对 formdata 进行正确的处理
success: function(data){
// console.log(data);
alert("上传成功!");
}
});
}
}
});
前端差不多就这样了,如果有问题大家可以问我,form表单提交的我就,不写了,中在对excel表格的处理
后端
首先要做的是下载插件 node-xlsx
可以在命令窗口下载 npm install node-xlsx
也可以去这里下载,我传上去的,地址https://download.csdn.net/download/www_share8/10343171
首先来看一下我的整个服务器的目录结构
首先你的服务器上得引入文件插件
const multer=require('multer');//上传文件
const multerObj=multer({dest:'./static/upload'});
server.use(multerObj.any());//上传任何文件
这样上传的文件就可以到指定的位置了。
我自己个人的服务器是这样写的,先开一个控制器
//设置学生管理的控制器
var student_manage=require('./route/admin/stu_manage.js');//引入学生管理的 控制器
然后在开一个路由
server.post('/admin/lend_in',student_manage.lend_in);//从外部导入excel表格数据
然后就是具体的服务程序了
//导入开模块
exports.lend_in=function(req,res){
var orr=1;
var newFileName=req.files[0].filename;//获取转码后的文件名称
//read from a file
var filename='./static/upload/'+newFileName; //获取文件所在的位置
var obj = xlsx.parse(filename);//这里就是引入的插件
var file_data=obj[0].data;//拿到自己想要的数据
//console.log(file_data);
for(var i=1;i<file_data.length;i++){//剩下的就是将数据传入数据库中
//console.log(file_data[i][2]);
db.query(`INSERT INTO student_table(s_num) VALUE('${file_data[i][0]}')`,(err,data)=>{
if(err){
console.log(err);
res.status(500).send("database error").end();
orr==0;
}
});
}
if(orr){
res.json({"result":{message:"文件上传成功!"}});//给前台一个反馈
}else{
res.json({"result":{message:"文件上传失败!"}});
}
}
最后总结一下,首先不足,上传文件那里,仅仅限制了上传的类型为.xls,但里面的内容并没有做相应的改进。解决方法有两个,第一个,你个用户一个使用的模板,具体让他知道,数据库里都需要那些内容。这个比较推荐。
第二个,就是每次用户上传完后,从用户上传的内容中提取数据库想要的数据,(前提,上传是内容大于数据库想要提取的内容信息)。如果上传内容信息少于,服务器做出相应的提示(不太推荐)
初步解决,文章一上来所提的两个问题,导入excel表格,和文件上传的问题。
导入和导出有相通的地方,下面是别所写的导出的部分代码
/* GET export excel test. */
router.get('/exportExcel', function(req, res, next) {
// write
var data = [[1,2,3],[true, false, null, 'sheetjs'],['foo','bar',new Date('2014-02-19T14:30Z'), '0.3'], ['baz', null, 'qux']];
var buffer = xlsx.build([{name: "mySheetName", data: data}]);
fs.writeFileSync('b.xlsx', buffer, 'binary');
res.send('export successfully!');
最后,这个代码我已经验证过了,可以实现功能。如果大家有什么不懂的可以留言问我,我一定会回答大家的。希望有什么写的不对的地方,大家能留言告诉我,我一定会改进的。谢谢。