Excel导入
首先是前端页面
导入首先需要选择文件,这时会出现第一个易错问题:不同的浏览器保护机制,会将选择文件的路径进行保护,类似”C:\\fakepath\\文件名“,这样的文件路径肯定是不能获取正确的文件进行操作。
当然也有一些骚操作进行规避,比如:
1.调整浏览器的浏览器安全设置(亲测费神费力不见得好用,不同电脑使用你得疯)。
2.修改文件夹路径(这个咋说呢,真是个小机灵鬼--直接将保护路径设置成要导入的文件路径)
3.上代码(好用、通用)
HTML
<a class="easyui-linkbutton" onclick="select_file()" iconCls="icon-excel">导入</a>
<input type="file" name="file" id="file" onchange="fileUpload();return false;" style="display:none"/>
一个按钮和一个文件输入框。
JS
function select_file() {$("#file").trigger("click");}function fileUpload() {if (IsNullOrEmpty($('#file')[0].files[0]))//IsNullOrEmpty 这个方法自己写的 具体的自己判断下return false;// 创建formdata对象var formData = new FormData();// 给formData对象添加<input>标签,注意与input标签的ID一致formData.append('file', $('#file')[0].files[0]);$.ajax({url: "/**/***", //这里写你的urltype: 'POST',data: formData,contentType: false, // 当有文件要上传时,此项是必须的,否则后台无法识别文件流的起始位置processData: false, // 是否序列化data属性,默认true(注意:false时type必须是post)dataType: 'json', //这里是返回类型,一般是json,text等clearForm: true, //提交后是否清空表单数据success: function (data) { //提交成功后自动执行的处理函数,参数data就是服务器返回的数据。 //成功后自己业务操作 比如加载什么的},error: function (data, status, e) { //提交失败自动执行的处理函数。console.error(e);}});$('#file').val(null);}
获取文件路径搞定了,接下来将获取到的文件保存到服务器上,再然后将服务器上文件导入系统进行业务上的需求操作。
public ActionResult onloadFile() //导入文件{string retStr = "上传成功";int retCode = 1;HttpRequest request = System.Web.HttpContext.Current.Request;HttpFileCollection FileCollect = request.Files;string path = "";//文件的完整路径//文件保存目录路径string imgPathName = DateTime.Now.ToString("yyyyMMdd");//以日期为文件存放的上层文件夹名string savePath = "upload\\file\\" + imgPathName + "\\";//文件存放的完整路径savePath = Server.MapPath("~\\") + savePath;if (!Directory.Exists(savePath)) //定义允许上传的文件扩展名{Directory.CreateDirectory(savePath);}Hashtable extTable = new Hashtable();extTable.Add("file", "xls,xlsx");if (FileCollect.Count > 0)//如果集合的数量大于0,多文件上传情况 {HttpPostedFile imgFile = FileCollect[0];//用key获取单个文件对HttpPostedFile string fileName = imgFile.FileName;//获取文件名string fileExt = Path.GetExtension(fileName).ToLower();//获取文件后缀名//判断文件类型是否正确//判断是否为IE浏览器的文件名int unixSep = fileName.LastIndexOf('/');int winSep = fileName.LastIndexOf('\\');int pos = (winSep > unixSep ? winSep : unixSep);if (pos != -1) fileName = fileName.Substring(pos + 1);if (Array.IndexOf(((string)extTable["file"]).Split(','), fileExt.Substring(1).ToLower()) == -1){retStr = "文件类型不正确";retCode = 2;}else{string imgPath = savePath + fileName;//构造文件保存路径 imgFile.SaveAs(imgPath);//将上传的东西保存 path = imgPath;//调用NPOI 方法对Excel进行处理DataTable dt = new DataTable();if(fileName.EndsWith("xls"))dt = NPOIExcelHelper.Import(path);else if (fileName.EndsWith("xlsx"))dt = NPOIExcelHelper.ImportFxlsx(path);//将获取到的数据dt进行操作//。。。。。。}}var ret = new { code = retCode, message = retStr };string jsonStr = JsonConvert.SerializeObject(ret);return Content(jsonStr);}
后台这边使用了NPOI 对EXCEL文件进行读写操作,详情就懒得写了,后台这边处理的根据自己需求来,主要是个思路。
留下个痕迹方便以后走弯路的时候回头看看。