Layui使用Execl導入數據


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM