Excel导入→JS拼出来的Table

来源:互联网 发布:mac os x10.10.5下载 编辑:程序博客网 时间:2024/05/01 20:42

需求:

     上周用户又提了一个新需要,要求在维护页面增加导入功能,整体流程:首先下载模板,按照模板填写数据,之后上传导入到维护页面拼出来的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~~


1 0