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