存档2020-11-09

Npoi动态导入

  public mResult Import(HttpPostedFileBase file, string tabName)
        {
            mResult ret = new mResult();
            ret.Code = "200";
            ret.Msg = "操作成功!";
            try
            {
                var strPath = @"~/up/" + DateTime.Now.ToString("yyyyMMdd");
                if (!Directory.Exists(strPath))
                {
                    //需要注意的是,需要对这个物理路径有足够的权限,否则会报错 
                    DirectoryInfo di = Directory.CreateDirectory(strPath);
                }
                var thisFileName = Guid.NewGuid().ToString().Replace("-", "") + "." + file.FileName.Split('.').LastOrDefault();
                var thisFilePath = Server.MapPath(strPath) + thisFileName;
                file.SaveAs(thisFilePath);
                using (var fileStream = System.IO.File.Open(thisFilePath, FileMode.Open))
                {
                    //把xls文件中的数据写入wk中,根据不同的文件格式实例化不同的对象去操作文件
                    IWorkbook wk;
                    string filePathChoice = thisFileName.Substring(thisFileName.LastIndexOf('.') + 1);
                    if (filePathChoice.Equals("xlsx"))
                    {
                        wk = new XSSFWorkbook(fileStream);
                    }
                    else
                    {
                        wk = new HSSFWorkbook(fileStream);
                    }
                    var sheet = wk.GetSheetAt(0); //读取当前表数据,直接去第一个Sheet
                                                  //判断是否有除去标题行的一行数据
                    if (sheet.LastRowNum < 1)
                    {
                        ret.Msg = "无数据";
                    }

                    AssemblyResult assInfo = ah.GetClassInfo("DataCenters.DAL.dll", "DataCenters.DAL." + tabName);

                    List<object> list = new List<object>();
                    // 去掉第一行
                    for (var j = 3; j <= sheet.LastRowNum; j++) //LastRowNum 是当前表的总行数
                    {
                        var row = sheet.GetRow(j); //读取当前行数据
                        var titles = sheet.GetRow(2);//标题列字段
                        if (row != null)
                        {
                            var obj = Activator.CreateInstance(assInfo.ClassType);
                            for (var k = 0; k <= row.LastCellNum; k++) //LastCellNum 是当前行的总列数
                            {
                                var title = titles.GetCell(k).ToString().ToLower().Trim();//对应字段
                                var cell = row.GetCell(k); //当前表格
                                var field = assInfo.Properties.Any(w => w.ToLower().Trim() == title) ? assInfo.Properties.FirstOrDefault(w => w.ToLower().Trim() == title) : "";
                                var fieldType = assInfo.PropertyType[assInfo.Properties.IndexOf(field)];
                                if (field != "" && cell != null)
                                {
                                    Debug.WriteLine("field", field);
                                    Debug.WriteLine("fieldType", fieldType);

                                    if (fieldType.ToLower().Contains("decimal"))
                                    {
                                        obj.GetType().GetProperty(field).SetValue(obj, Convert.ToDecimal(cell.ToString()));
                                    }
                                    else if (fieldType.ToLower().Contains("int16"))
                                    {
                                        obj.GetType().GetProperty(field).SetValue(obj, Convert.ToInt16(cell.ToString()));
                                    }
                                    else if (fieldType.ToLower().Contains("int32"))
                                    {
                                        obj.GetType().GetProperty(field).SetValue(obj, Convert.ToInt32(cell.ToString()));
                                    }
                                    else if (fieldType.ToLower().Contains("double"))
                                    {
                                        obj.GetType().GetProperty(field).SetValue(obj, Convert.ToDouble(cell.ToString()));
                                    }
                                    else if (fieldType.ToLower().Contains("datetime"))
                                    {
                                        obj.GetType().GetProperty(field).SetValue(obj, Convert.ToDateTime(cell.ToString()));
                                    }
                                    else
                                    {
                                        obj.GetType().GetProperty(field).SetValue(obj, cell.ToString());
                                    }
                                }
                            }
                            list.Add(obj);
                        }
                    }
                    ret.Data = list;
                }
            }
            catch (Exception e)
            {
                ret.Code = "500";
                ret.Msg = e.Message;
                throw;
            }
            return ret;
        }

        public class mResult
        {
            public string Code { get; set; }
            public string Msg { get; set; }
            public object Data { get; set; }
        }