平时我们用Asp.net导入用户,一般是提供一个用户Excel表的模板,实际导入数据时并非有些人愿意按你的模版制表,因此对Asp.net导入功能进行加强,可以导入非模版化的Excel数据,并且支持一次处理多个Sheet表,方便的录入人员。
第一步、上传Excel:
代码略。
第二步、读取Excel数据到DataSet:
具体怎么读取Excel数据,网上到处都有,代码略。
第三步、处理DataSet数据并导入到库
平时这一步,一般都是取默认Excel的第一个sheet,由于采用的模板化,字段名与数据库字段相匹配,直接导入即可。
如今,为了方便处理非模板化的Excel,就要让录入人员可以自行匹配对应的列,加强工作就从这里开始:
先看哈操作界面和Excel表的结构:
↑导入界面
↑原始数据表
↑上传Excel,选择要导入的Sheet表
↑对应选择匹配内容
部分主要代码:
/// <summary>
/// 上传Excel 按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnUpload_Click(object sender, EventArgs e)
{
//检测是否Excel文件、创建服务器临时目录(如果目录不存在)、上传文件到服务器 代码略
// ……………………………………
dsExcel = new DataSet();
DataSet ds = GetExcelData(uploadFilePath);//将Excel数据全部读入DataSet GetExcelData 参考网上现有代码即可。
if(ds==null)return;
//清除空sheet 只保留有数据的sheet
for (int i = 0; i < ds.Tables.Count; i++)
{
DataTable dt = ds.Tables[i].Copy();//必须复制表才能添加到新的DataSet
try
{
if (dt.Columns[0].ColumnName == "F1" && dt.Rows[0][0].ToString() == "")
{
//ds.Tables.Remove(dt);
}
else
{
dsExcel.Tables.Add(dt);
}
}
catch
{
// ignored
}
}
ViewState["dsExcel"] = dsExcel;
ddlExcelSheets.DataSource = dsExcel.Tables;
ddlExcelSheets.DataBind();
dtUsers = dsExcel.Tables[0];
usersCount.InnerText = dtUsers.Rows.Count + "条记录";
BindTableColumnName();
ViewState["dtUsers"] = dtUsers;
}
/// <summary>
/// 切换Excel sheet数据表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ddlExcelSheets_SelectedIndexChanged(object sender, EventArgs e)
{
if (dsExcel == null && ViewState["dsExcel"] != null)
{
dsExcel = (DataSet)ViewState["dsExcel"];
}
if (dsExcel != null)
{
dtUsers = dsExcel.Tables[ddlExcelSheets.SelectedValue];
usersCount.InnerText = dtUsers.Rows.Count + "条记录";
//切换sheet表后,重新绑定各选择项
BindTableColumnName();
ViewState["dtUsers"] = dtUsers;
}
}
/// <summary>
/// 切换Excel sheet表后,重新绑定各选择项
/// </summary>
private void BindTableColumnName()
{
ddlUserNameTitle.Items.Clear();
ddlUserNameTitle.DataSource = dtUsers.Columns;
ddlUserNameTitle.DataBind();
ddlUserNameTitle.Items.Insert(0, new ListItem("选择对应列", ""));
…………………………………………
}
/// <summary>
/// 提交确认按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnSub_Click(object sender, EventArgs e)
{
if (dtUsers == null && ViewState["dtUsers"] != null)
{
dtUsers = (DataTable)ViewState["dtUsers"];
}
if (dtUsers == null || dtUsers.Rows.Count < 1)
{
MessageBox.Show(this, "无可用数据!");
return;
}
if (string.IsNullOrEmpty(ddlUserNameTitle.SelectedValue))
{
MessageBox.Show(this, "请设置用户名!");
return;
}
//其它检测工作
//………………………………
DataTable dtExistUsers = dtUsers.Clone();//添加失败记录,包括已经存在用户
DataTable dtAddUsers = dtUsers.Clone();//添加成功记录
var bp = new Bll();
var mp = new Modle();
//遍历用户表、处理用户数据
foreach (DataRow dr in dtUsers.Rows)
{
mp.UserID = dr[ddlUserNameTitle.SelectedValue].ToString();
if (bp.Exist(mp.UserID))
{
//已经存在同名用户
dtExistUsers.ImportRow(dr);
}
else
{
//关键就在类似 “ddlUserTrueNameTitle.SelectedValue” 进行值的匹配
mp.userTrueName = dr[ddlUserTrueNameTitle.SelectedValue].ToString();
mp.StudentNumber = dr[ddlUserNumTitle.SelectedValue].ToString();
//其它属性参数
//……………………
if (bp.Add(mp))
{
dtAddUsers.ImportRow(dr);
}
else
{
if (!dtExistUsers.Rows.Contains(dr))
{
dtExistUsers.ImportRow(dr);
}
}
}
}
string errorUsers = "";
foreach (DataRow dr in dtExistUsers.Rows)
{
errorUsers += dr[ddlUserNameTitle.SelectedValue] + ";";
}
string msg = "执行操作完毕:成功导入" + dtAddUsers.Rows.Count + "条;失败导入" + dtExistUsers.Rows.Count + "条。";
if (dtExistUsers.Rows.Count > 0)
{
msg += " 失败名单:" + " " + errorUsers;
}
MessageBox.Show(this, msg);
}
补充:用到的两个关键变量
/// <summary>
/// 从Excel导入的全部Sheet表数据
/// </summary>
private DataSet dsExcel = null;
/// <summary>
/// 选中要处理的用户表数据
/// </summary>
private DataTable dtUsers = null;
以上是部分主要核心代码,其它代码可以参考网上现有代码。如有问题可以留言讨论学习。