将Datatable一分为二
在订餐系统中,有一个需求就是批量导入充值表,对饭卡进行批量的充值,如果一张一张饭卡的充值,当员工多的时候会非常的繁琐。
这里的充值表是excel形式的,首先,充值的时候肯定要检索其中的用户信息,将信息符合要求的进行充值,不符合要求的会报错导出,并且整理到一个excel中全部导出。
首先,将excel导入的时候,全部读取到一个datatable中,然后,对其中的用户充值信息进行检索,如何信息符合要求会全部放到一个datatable中,如果不符合要求都会放到另一个datatable中。
将符合要求的datatable,传给充值过程进行批量的充值,将不符合要求的datatable导出到一个excel中,返回给操作员。
<span style="font-size:24px;">public void btnInput_Click(object sender, EventArgs e)
{
Stream stream = Request.Files[0].InputStream;
//判断是否选择文件
if (file.PostedFile.FileName.ToString().Trim() == string.Empty)
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('请选择要导入的Excel文件!');</script>");
return;
}
string FileName = Server.MapPath("~/") + Path.GetFileName(file.FileName);
//检查是否存在文件,存在删除
if (File.Exists(FileName))
{
File.Delete(FileName);
}
file.SaveAs(FileName); //上传文件到服务器
string path = FileName;//获取服务器文件路径
//读取excel文件数据
DataTable dt = new DataTable();
try
{
dt = ExcelToDataTable(path);
//判断数据是否为空
if (dt == null)
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('您选择的文件为空,请检查后再导入,谢谢!');</script>");
return;
}
#region 验证数据的有效性
//存放正确的数据
DataTable dtAccess = new DataTable();
//添加列
dtAccess.Columns.Add("cardID");
dtAccess.Columns.Add("ownerName");
dtAccess.Columns.Add("addCash");
dtAccess.Columns.Add("error");
//存放错误的数据
DataTable dtFail = new DataTable();
//添加列
dtFail.Columns.Add("cardID");
dtFail.Columns.Add("ownerName");
dtFail.Columns.Add("addCash");
dtFail.Columns.Add("error");
for (int i = 0; i < dt.Rows.Count; i++)
{
//获取卡号
string cardID = dt.Rows[i][0].ToString();
//获取姓名
string ownerName = dt.Rows[i][1].ToString();
//获取金额
string addCash = dt.Rows[i][2].ToString();
//验证卡号是否存在
bool blCard = card.CheckCardInfo(cardID);
//验证卡号物理地址
bool blMainCard = card.CheckMainCardInfo(cardID);
//验证卡号是否为员工
bool blOwnerName = card.CheckOwnerNameInfo(cardID);
//验证卡号是否正在使用
bool blStatus = card.CheckCardInfoStatus(cardID);
//验证金额是否为数字
bool blCash = IsNumber(dt.Rows[i][2].ToString().Trim());
//数据格式正确
if (blCard == true && blMainCard == true && blOwnerName == true && blStatus == true && blCash == true)
{
//添加数据
DataRow dr = dtAccess.NewRow();
dr["cardID"] = cardID;
dr["ownerName"] = ownerName;
dr["addCash"] = addCash;
dtAccess.Rows.Add(dr);
dtAccess.AcceptChanges();
}
//数据格式错误
else
{
//添加数据
DataRow dr = dtFail.NewRow();
dr["cardID"] = cardID;
dr["ownerName"] = ownerName;
dr["addCash"] = addCash;
dtFail.Rows.Add(dr);
dtFail.AcceptChanges();
}
}
#endregion
#region 导入格式正确的数据
//导入格式正确的数据
for (int i = 0; i < dtAccess.Rows.Count; i++)
{
CardBll cardbll = new CardBll();//实例化卡表
CardAddLog cardinfo = new CardAddLog();//实例化充值表
DataTable dtCard = new DataTable();//实例化datatable
//获取卡号
string cardID = dtAccess.Rows[i][0].ToString();
//获取卡号姓名
string ownerName = dtAccess.Rows[i][1].ToString();
//获取充值金额
string addCash = dtAccess.Rows[i][2].ToString();
//查询卡号信息
List<Card> Cardlist = card.QueryCardInfo(cardID);
cardinfo.mainCardId = Cardlist[0].mainCardId.ToString().Trim();//获取卡号物理地址
cardinfo.cardId = cardID;//获取卡号
cardinfo.ownerName = ownerName;//获取卡号姓名
cardinfo.realAddCash = Convert.ToDecimal(dtAccess.Rows[i][2].ToString().Trim());//获取充值金额
cardinfo.addCash = Convert.ToDecimal(dtAccess.Rows[i][2].ToString().Trim());//获取充值金额
cardinfo.addCashTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");//得到充值时间
cardinfo.isSubmit = "T";//获取样品
cardinfo.userId = Session["Admin"].ToString();//获取操作人
//更新卡表和充值记录
bool flagSuccss = cardbll.rechargebycardided(cardinfo);
if (flagSuccss == false)
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer> alert('批量充值失败,请联系管理员!');</script>");
}
}
#endregion
#region 导出错误格式的数据
if (dtFail.Rows.Count != 0)
{
NpoiExcel(dtFail, "导入失败数据");
}
#endregion
//删除服务器文件
if (File.Exists(FileName))
{
File.Delete(FileName);
}
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript'>alert('批量导入成功!'); </script>");
}
catch (Exception)
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer> alert('批量充值失败,请联系管理员!');</script>");
}
}
</span>