需求:
上周用户又提了一个新需要,要求在维护页面增加导入功能,整体流程:首先下载模板,按照模板填写数据,之后上传导入到维护页面拼出来的table中,检查之后点击保存正式保存到数据库中。
1.先看导入模板,必填项都带有*号标识. 导入数据时,物资信息是根据编号查出来的,所以导入时对于物资编号有校验,如果物资编号不存在字典中,就提示重新检查导入。
2.导入模板,问题在于如何将excel中的数据传到JS拼出来的table中?借鉴了编辑数据时,将需要编辑的数据转成JSON串传到前台。
校验代码:
protected DataTable ValidateExcel(ref string strError) { string name = txtFile.PostedFile.FileName; string exName = name.Substring(name.LastIndexOf('.') + 1); if (exName != "xls") { strError = "您导入的不是excel格式!"; return null; } txtFile.PostedFile.SaveAs(Server.MapPath("../../../../UpFile/") + "调剂物资导入.xls"); string excelconnstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("../../../../UpFile/调剂物资导入.xls") + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\""; System.Data.OleDb.OleDbConnection excelconn = new System.Data.OleDb.OleDbConnection(excelconnstring); string sql = "select * from [调剂物资导入$]"; System.Data.OleDb.OleDbDataAdapter mycomm = new System.Data.OleDb.OleDbDataAdapter(sql, excelconn); DataSet ds = new DataSet(); try { mycomm.Fill(ds, "ss"); //if (ds.Tables[0].Rows[0].ItemArray.Length != 25) //新的格式 26列 //{ if (ds.Tables[0].Rows[0].ItemArray.Length != 14) { strError = "您导入的excel不是**信息导入模板!"; return null; } //} string strColumnNames = ""; //Excel表头是否正确 for (int i = 0; i < ds.Tables[0].Columns.Count; i++) { strColumnNames += ds.Tables[0].Columns[i].ColumnName.ToString().Trim(); } if (strColumnNames.Trim().ToUpper() != "地区仓库*~~编号*~~名称规格型号图号材质计量单位数量*单价(元)出厂日期制造厂家备注~~联系人*~~联系电话*".ToUpper()) { strError = "请使用标准的~~导入模板!"; return null; } } catch (Exception ex) { strError = "错误!" + ex.Message; return null; } return ds.Tables[0]; }
导入代码:
#region 导入 protected void btnIMP_Click(object sender, EventArgs e) { string strError = ""; DataTable dt = ValidateExcel(ref strError); if (dt==null) { Alert("模板中没有可导入的数据,请重新检查!"); } #region 将导入数据转化成list集合-2016-1-14 12:29:51 try { var result = ""; List<ModelRmadjAdjmatlinfo> listRmadjAdjmatlinfo = new List<ModelRmadjAdjmatlinfo>(); for (int i = 0; i < dt.Rows.Count; i++) { //~~表 ModelRmadjAdjmatlinfo enRmadj = new ModelRmadjAdjmatlinfo(); enRmadj.SMatlCode = dt.Rows[i]["~~编号*"].ToString(); //关联~~表-根据编号查询~~信息 ModelRmstatCatalogdt enCatadt=new ModelRmstatCatalogdt(); enCatadt.Smatlcode=dt.Rows[i]["~~编号*"].ToString(); ModelRmstatCatalogdt enRmadjmatl = _BLLRmadjAdjmatlinfo.GetByMatlCode(enCatadt); if (enRmadjmatl.Smatlname != null) { enRmadj.SMatlName = enRmadjmatl.Smatlname; enRmadj.SMatlpPcode = enRmadjmatl.Smatlpcode; enRmadj.SMatlRaw = enRmadjmatl.Smatlraw; enRmadj.SMatlType = enRmadjmatl.Smatltype; enRmadj.SMatlUnit = enRmadjmatl.Smatlunit; } else { result += "第" + i + "行导入~~编号不存在,请检查!\n"; } enRmadj.SPlantDepotName = dt.Rows[i]["~~仓库*"].ToString(); if (dt.Rows[i]["数量*"].ToString() != "") { enRmadj.NNum = Convert.ToDouble(dt.Rows[i]["数量*"].ToString()); } else { enRmadj.NNum = Convert.ToDouble("0.00"); } if (dt.Rows[i]["单价(元)"].ToString() != "") { enRmadj.NPrice = Convert.ToDouble(dt.Rows[i]["单价(元)"].ToString()); } else { enRmadj.NPrice = Convert.ToDouble("0.00"); } if (dt.Rows[i]["出厂日期"].ToString() != "") { enRmadj.DMadeDate =Convert.ToDateTime(dt.Rows[i]["出厂日期"].ToString()); } else { enRmadj.DMadeDate = Convert.ToDateTime("0001/1/1 0:00:00"); } if (dt.Rows[i]["制造厂家"].ToString() != "") { enRmadj.SFactory = dt.Rows[i]["制造厂家"].ToString(); } else { enRmadj.SFactory = " "; } if (dt.Rows[i]["备注"].ToString() != "") { enRmadj.SComments = dt.Rows[i]["备注"].ToString(); } else { enRmadj.SComments = " "; } enRmadj.SLinkman = dt.Rows[i]["~~联系人*"].ToString(); enRmadj.SContacts = dt.Rows[i]["~~联系电话*"].ToString(); listRmadjAdjmatlinfo.Add(enRmadj); } if (result != "") { Alert(result); return; } else { #region 采用json的形式 //绑定gridview if (listRmadjAdjmatlinfo.Count > 0) { txtMatlList.Value = JSONUtil.Serialize(listRmadjAdjmatlinfo); txtMatlList.Value = FarmatJsonString(txtMatlList.Value); HiddenStatus.Value = "add"; } else { this.txtMatlList.Value = ""; } ExecuteFunction("setListContent();"); ExecuteFunction("CreateTable();"); #endregion } } catch (Exception) { } #endregion }
3.在转化成JSON的之后,日期格式可能会被转化成一堆数字,可以再转成JSON之后,将日期类型的设置一下格式。
校验日期代码:
#region 格式化Json串--日期格式--2015-11-18 14:52:34 /// <summary> /// 根式化Json串 /// </summary> /// <param name="strJson">需要格式化的字符串</param> /// <returns>格式完成的字符串</returns> public static string FarmatJsonString(string strJson) { string tempJson = ""; if (!string.IsNullOrEmpty(strJson)) { tempJson = strJson; tempJson = Regex.Replace(tempJson, @"\\/Date\((\d+)\)\\/", match => { DateTime dt = new DateTime(1970, 1, 1); dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value)); dt = dt.ToLocalTime(); return dt.ToString("yyyy-MM-dd"); } ); tempJson = Regex.Replace(tempJson, @"\\/Date\((-\d+)\)\\/", match => { return ""; } ); } return tempJson; } #endregion
总结:
作为开发人员,目前最开心的事:1 测试说:bug回归完毕,可以发布;2 产品上线; 虽然上线之后可能用户还会有问题出来,但是看到努力之后的成果,就更有动力去解决问题O(∩_∩)O~
一步两步,进步ing~~