基于node.js服务器-完整的-前后端的Excel导入,ajax文件的上传

我们都知道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!');  

最后,这个代码我已经验证过了,可以实现功能。如果大家有什么不懂的可以留言问我,我一定会回答大家的。希望有什么写的不对的地方,大家能留言告诉我,我一定会改进的。谢谢。

 

 

 

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页