C# 两个DataTable合并
前不久小编遇到一个新需求,小编开发完毕后需要将两个EXcel导入数据库中的同一个表,大家有没有想明白该怎么做呢?没错了,方法其实有好多啦,先导入一个,第二个在导入的时候进行修改不就好了么,可惜的是,小编所做的系统中呢只有批量导入的功能,没有批量修改的功能,你想想13w的数据耶,我每搞错一次都会浪费半个小时以上的时间,痛则思痛,顿了好久一段时间,小编才想起如果两个DataTable能合并的话,那么只需要思考导入的不就可以了么?
来吧,展示代码
先将第一个Excel的数据储存起来
DataTable ly_AP_Datasdt = new();
/// <summary>
/// 导入带有的Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAPLYSizeImport_Click(object sender, EventArgs e)
{
try
{
MaskLayer.Show("数据匹配中...");
DataTable dt = NPOIHelper.ImportFromExcel("", "Sheet1", 0);
if (dt == null)
{
return;
}
if (dt.Rows.Count <= 0)
{
MsgBox.ShowInformation("表中无任何有效数据");
}
List<HjbxxbDto> ListAll = DAL.QueryList<HjbxxbDto>(@$"select Catalog_No,lyCatalog_No,nameCn,Drug_Names from HaoYuanSystem.dbo.hjbxxb where lyCatalog_No<>''");
//添加多个列,包括表头,以及数据类型
ly_AP_Datasdt.Columns.Add("ID", typeof(int));
ly_AP_Datasdt.Columns.Add("APCatalog_No", typeof(string));
ly_AP_Datasdt.Columns.Add("APProduct_name", typeof(string));
ly_AP_Datasdt.Columns.Add("LyCatalog_No", typeof(string));
ly_AP_Datasdt.Columns.Add("Purity", typeof(string));
ly_AP_Datasdt.Columns.Add("colorCn", typeof(string));
ly_AP_Datasdt.Columns.Add("Size", typeof(string));
ly_AP_Datasdt.Columns.Add("Remarks", typeof(string));
ly_AP_Datasdt.Columns.Add("UpdatePerson", typeof(string));
ly_AP_Datasdt.Columns.Add("UpdateTime", typeof(DateTime));
ly_AP_Datasdt.Columns.Add("APStockID", typeof(string));
for (int i = 0; i < dt.Rows.Count; i )
{
DataRow dr = dt.Rows[i];
if (dr["...."] == null || string.IsNullOrEmpty(dr["...."].ToString().Trim()))
{
continue;
}
if (dr["...."] == null || string.IsNullOrEmpty(dr["...."].ToString().Trim()))
{
continue;
}
//判断数据库中是否存在相同的....
if (ListAll.Find(x => x.lyCatalog_No == dr["...."].ToString().Trim()) == null)
{
continue;
}
if (ly_AP_Datasdt.AsEnumerable().Where(c => c.Field<string>("APCatalog_No").Equals(dr["...."].ToString().Trim())).Count() > 0) {
continue;
}
ly_AP_Datasdt.Rows.Add(0, dr["...."].ToString().Trim(), "", dr["...."].ToString().Trim(), "", "", dr["...."].ToString().Trim(), "", SystemInfo.UserName, DateTime.Now, 0);
}
MaskLayer.Close();
if (ly_AP_Datasdt.Rows.Count == 0)
{
MsgBox.ShowInformation("剔除已配置过....信息的产品,表中无任何有效数据!");
return;
}
MsgBox.ShowInformation("识别到有效数据:" ly_AP_Datasdt.Rows.Count "条!请导入....号和....ID的Excel!");
}
catch (Exception ex)
{
MsgBox.ShowInformation(ex.Message);
}
}
再将第二个Excel的数据存在另一个DataTable中,然后将两的DataTable合并成一个DataTable,这样就能一次批量导入两个Excel的有效数据了
/// <summary>
/// 导入带有....Id的Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAPLYStockIdImport_Click(object sender, EventArgs e)
{
try
{
MaskLayer.Show("数据匹配中...");
DataTable dt = NPOIHelper.ImportFromExcel("", "Sheet1", 0);
if (dt == null)
{
return;
}
if (dt.Rows.Count <= 0)
{
MsgBox.ShowInformation("表中无任何有效数据");
}
for (int i = 0; i < ly_AP_Datasdt.Rows.Count; i )
{
for (int j = 0;j < dt.Rows.Count; j ) {
DataRow dr = dt.Rows[j];
if (ly_AP_Datasdt.Rows[i]["APCatalog_No"].ToString().Trim() == dr["...."].ToString().Trim() && ly_AP_Datasdt.Rows[i]["LyCatalog_No"].ToString().Trim() == dr["...."].ToString().Trim()) {
ly_AP_Datasdt.Rows[i]["APStockID"] = dt.Rows[j]["库存ID"].ToString().Trim();
}
}
}
MaskLayer.Close();
if (MsgBox.ShowOKCancel("剔除已配置过....信息的产品,识别到有效数据:" ly_AP_Datasdt.Rows.Count "条!\r\n是否导入?") != DialogResult.OK)
{
return;
}
MaskLayer.Show("数据导入中...");
bool issussess = DAL.Table_Insert_Dt(ly_AP_Datasdt, "Ly_AP_NumCorrespondence");
MaskLayer.Close();
if (issussess)
{
MsgBox.ShowInformation("导入....信息成功!共" ly_AP_Datasdt.Rows.Count "条");
}
}
catch (Exception ex)
{
MsgBox.ShowInformation(ex.Message);
}
finally
{
GetAPLyAPNumCorrespondenceList();
}
}
补充一点,网上还有很多人在循环数据的时候将数据插入DataTable中的时候,经常在循环中写
DataRow dr = dt_temp.NewRow();
dr["id"] = Guid.NewGuid().ToString();
dr["name"] = "bgx";
dt_temp.Rows.Add(dr);
这样写的坏处就是每次都像是实例化了一次一样,小编起初也这样没想到添加一个Excel的时候居然会花一个小时,我这样子讲,你大概知道我有多么难以处理这13w的数据了吧,如果直接写
ly_AP_Datasdt.Rows.Add(0, dr["...."].ToString().Trim(), "", dr["...."].ToString().Trim(), "", "", dr["...."].ToString().Trim(), "", SystemInfo.UserName, DateTime.Now, 0);
就可以避免每次循环的时候都实例化了,如果大家没有那么大的数据量,那就当我没说,但是当数据量起来的时候,大家一定要思考该如何优化性能了
这几年里,身边的人总是在不断的发生变化,有的人早已买了车,有的人先准备买房,有的人已经结了婚甚至都有了小孩…,今天和一位朋友聊了一下,没想到他已经不做开发了,退居家乡,买了房,准备过几年结婚,小编起初还替他遗憾,没想到一下子(指时间短暂或动作迅速)(指时间短暂或动作迅速)到变成小编羡慕的对象了,大城市买房着实不容易,如果不靠自己父母,自己要打拼多久才能真正的拼出一个房子呢?哎,苦矣,人这一辈子有太多的身不由己,也许以自己喜欢的方式过完这一生也算一种不错的结局。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiegjja
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
excel图片置于文字下方的方法
PHP中文网 06-27 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信提示登录环境异常是什么意思原因
PHP中文网 04-09 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
微信人名旁边有个图标有什么用
PHP中文网 03-11