用 input type=file的标签获取到文件,传到后台时只有一个文件名称,没有对应的路径,
后面上百度各种查,有的让设置这设置那个,后面找了一些脚本获取文件的绝对路径,最终都无功而返,浪费时间。
获取到的路径都是c:\fakepath\文件名称,这是出于安全的原因导致的。
所以后面借助第三方插件NPIO在后端获取到相应的路径;
视图页面代码 :
这种是直接唤起选择文件对话框:选中之后直接上传至指定接口
upload.render({ elem: '#btnImport', url: '/Ajax/AjaxIOSDataInfo.ashx?type=ExeclImportData', data: { type: "Import" }, exts: 'xls', before: function (data) { loadIndex = layer.load(2); }, done: function (res) { layer.close(loadIndex); if (res.code < 0) { table.reload('table1'); return layer.alert('导入失败<br/>' + res.msg, { icon: 2 }); } $("#btnSearch").click(); table.reload('table1'); return layer.alert('导入成功<br/>' + res.msg, { icon: 1 }); }, error: function (err) { debugger layer.alert('导入出现异常', { icon: 2 }); } });
elem: '#btnImport' 为触发按钮的ID
<button class="layui-btn layui-btn-sm lay_bnt_border " id="btnImport">Execl导入</button>

url: '/Ajax/AjaxIOSDataInfo.ashx?type=ExeclImportData' 是后端负责处理数据的接口
layui需要先声明 upload类型:var upload = layui.upload;
后端接口方法:ExeclImportData
需要导入第三方插件 NOPI
HttpPostedFile files = context.Request.Files[0]; if (!files.FileName.IsEmpty()) { string exName = System.IO.Path.GetExtension(files.FileName); //得到扩展名 if (exName != ".xls") { //响应导入失败, ajaxMsg = PubUserIsLogin.RetunJsonMsg("只支持后缀为.xls的文件", -1,0, null, ""); context.Response.Write(new JavaScriptSerializer().Serialize(ajaxMsg)); return ; } } DataTable dt = CommMethod.RenderDataTableFromExcel(files.InputStream, 0, 0); //这里获取到的为一个table数据
RenderDataTableFromExcel 方法:
/// <summary> /// 获取Execl内容 /// </summary> /// <param name="excelFileStream"></param> /// <param name="sheetIndex"></param> /// <param name="headerRowIndex"></param> /// <returns></returns> public static DataTable RenderDataTableFromExcel(Stream excelFileStream, int sheetIndex, int headerRowIndex) { DataTable table = new DataTable(); HSSFWorkbook workbook = new HSSFWorkbook(excelFileStream); ISheet sheet = workbook.GetSheetAt(sheetIndex); IRow headerRow = sheet.GetRow(headerRowIndex); int cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i < cellCount; i++) { DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } for (int i = (sheet.FirstRowNum + 1); i < sheet.LastRowNum + 1; i++) { IRow row = sheet.GetRow(i); DataRow dataRow = table.NewRow(); for (int j = 0; j < cellCount; j++) { if (row.GetCell(j) != null) { var cellVale = row.GetCell(j).ToString(); dataRow[j] = cellVale; } } table.Rows.Add(dataRow); } excelFileStream.Close(); return table; }
这里的处理方式只支持后缀为.xls的文件 ,如果是xlsx,直接改后缀名可能还是会出现报错的情况,这时就需要将 xlsx的另存为一份 xls后缀的文件。
考虑到Execl里面可能有重复数据,这样DataTable里面的数据就可能有重复的,可以通过Linq语句进行过滤重复的数据,如下根据 platName 字段进行排重:
DataTable dt_temp = dt.AsEnumerable().Cast<DataRow>().GroupBy(p => p.Field<string>("platName")).Select(p => p.FirstOrDefault()).CopyToDataTable();
到此已经获取到了相应的Execl数据。然后就可以进行下一步的数据处理了。