Excel导入→JS拼出来的Table

需求:

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


评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值