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