用 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數據。然后就可以進行下一步的數據處理了。