1.BLL业务逻辑代码

/// <summary>
/// 处理“店铺竞品销售数据”导入文件
/// </summary>
/// <param name="filePath">文件物理路径</param>
/// <param name="ownerId">品牌Id</param>
/// <param name="saleYM">竞品数据销售年月</param>
/// <param name="msg">处理过程中出现的错误消息</param>
/// <returns></returns>
public bool HandleImportExcel(string filePath, string ownerId, string saleYM, out string msg)
{
using (DaoTransactionScope ts = new DaoTransactionScope(true))
{
msg = ""; // 返回给UI层的错误消息 #region 1.0 设置连接Excel组件的连接字符串
// 获取导入文件的扩展名
string fileExt = Path.GetExtension(filePath).ToLower();
// Excel组件连接字符串
string excelConnStr = string.Empty;
if (fileExt.Equals(".xlsx"))
{
// "HDR=Yes;" 表示第一行是标题行, 不是数据。"HDR=No;" 则表示从第一行开始就是数据。
excelConnStr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=No;IMEX=1'", filePath);
}
else if (fileExt.Equals(".xls"))
{
excelConnStr = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=No;IMEX=1'", filePath);
}
else
{
// "不是Excel文件,请重新选择文件导入!";
msg = this.GetResourceString("NotExcelFile");
return false;
}
#endregion string loginUser = this.LoginUser;
// 总部营业日期
string hqAccountDate = Convert.ToDateTime(new BLSystemInfo().GetSysValue(, )).ToString("yyyyMM");
DLSalesOtherMakerSearch dal = new DLSalesOtherMakerSearch(); OleDbConnection oleConn = null; // 连接Excel文件的连接对象
DataSet ds = null;
DataTable dtExcel = null; // 存储Excel文件数据的内存表
DataTable dtInsert = null; // 存储处理后的Excel文件数据的内存表
try
{
#region 2.0 通过OleDbConnection对象从Excel文件中获取数据并存放在内存DataTable中(变量:dtExcel) oleConn = new OleDbConnection(excelConnStr);
oleConn.Open();
DataTable schemaTable = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
// 获取Excel中sheet名称
string tableName = string.Format("[{0}]", schemaTable.Rows[][].ToString().Trim());
string sql = string.Format("select * from {0}", tableName);
ds = new DataSet();
using (OleDbDataAdapter adapter = new OleDbDataAdapter(sql, oleConn))
{
adapter.Fill(ds, tableName);
} // 第1,2,3行都是标题行
dtExcel = ds.Tables[tableName];
if (dtExcel.Rows.Count <= )
{
// "选择的文件没有需要导入的数据,请重新选择文件导入!";
msg = this.GetResourceString("ExcelFileNoData");
return false;
} // 判断Excel中是否存在相同的店铺号,若存在则提示用户,不导入
// 根据店号进行分组
var storeList = from s in dtExcel.AsEnumerable()
where s.Field<string>() != null
group s by new { f = s.Field<string>().ToUpper() } into g
select new
{
StoreId = g.Key.f,
StoreCount = g.Count()
};
// 查出有多行店号的数据
storeList = storeList.Where(item => item.StoreCount > );
if (storeList.Count() > )
{
string storeIds = string.Empty;
storeList.ToList().ForEach(item => storeIds += item.StoreId + ",");
// [{0}]店铺存在多行销售数据,请删除多余行的数据,每个店铺只保留一行!
msg = this.GetResourceString("StoreSalesDataRepeated", storeIds.Substring(, storeIds.Length - ));
return false;
} #endregion #region 3.0 判断Excel表中的数据是否合法并转换存放在符合数据库表结构的内存表中(变量:dtInsert) // 创建要插入到数据库中的内存表dtInsert
dtInsert = dal.GetOtherMakerSaleTblScheme(); // Excel中的第三行是竞品品牌名称,故从第四行开始循环遍历dtExcel(注意下标为3)
DataRow rowExcel;
DataRow rowInsert; // 获取所有竞品品牌主档数据
List<OtherMakerMasTbl> otherMakerMasList = dal.GetOtherMakerMasList();
if (otherMakerMasList == null || otherMakerMasList.Count <= )
{
// 没有竞品品牌主档数据,请联系系统管理员重新导入!
msg = this.GetResourceString("OtherMakerMasDataNotExist");
return false;
} // 循环遍历Excel中的第三行竞品品牌名称,获取对应的竞品品牌代码,并替换掉竞品品牌名称
// 从第二列开始循环遍历竞品品牌
OtherMakerMasTbl otherMakerMasModel = null;
string notExistOtherMakerStr = string.Empty;
Dictionary<string, string> dicOtherMakerMas = new Dictionary<string, string>();
for (int j = ; j < dtExcel.Columns.Count; j++)
{
otherMakerMasModel = otherMakerMasList.SingleOrDefault(item => item.OtherMakerNm.Trim().Equals(dtExcel.Rows[][j].ToString().Trim()));
if (otherMakerMasModel == null)
{
// 在竞品品牌主档中未找到 {0} 该品牌对应的数据,请仔细核对数据重新导入!
//msg = this.GetResourceString("OtherMakerNotFound", dtExcel.Rows[2][j].ToString().Trim());
notExistOtherMakerStr += "[" + dtExcel.Rows[][j].ToString().Trim() + "],";
}
else
{
dicOtherMakerMas.Add(otherMakerMasModel.OtherMakerCd, otherMakerMasModel.OtherMakerNm.Trim());
dtExcel.Rows[][j] = otherMakerMasModel.OtherMakerCd;
}
}
if (!string.IsNullOrEmpty(notExistOtherMakerStr))
{
msg = this.GetResourceString("OtherMakerNotFound", notExistOtherMakerStr.Substring(, notExistOtherMakerStr.Length - ));
return false;
} for (int i = ; i < dtExcel.Rows.Count; i++)
{
rowExcel = dtExcel.Rows[i];
// 从第二列开始循环遍历竞品品牌
for (int j = ; j < dtExcel.Columns.Count; j++)
{
// 如果店号为空,则Continue
if (dtExcel.Rows[i][] == null || string.IsNullOrEmpty(dtExcel.Rows[i][].ToString()))
{
continue;
} // 如果金额数字为空,则Continue
if (dtExcel.Rows[i][j] == null || string.IsNullOrEmpty(dtExcel.Rows[i][j].ToString()))
{
continue;
}
rowInsert = dtInsert.NewRow();
rowInsert["OwnerId"] = ownerId;
rowInsert["CustomerCd"] = dtExcel.Rows[i][];
rowInsert["OtherMakerCd"] = dtExcel.Rows[][j].ToString();
rowInsert["OtherSaleYM"] = saleYM;
try
{
rowInsert["OtherSaleMoney"] = Convert.ToDecimal(dtExcel.Rows[i][j]);
}
catch (Exception)
{
// 店号为{0}的竞品品牌{1}填写的金额数字{2}有误,请重新导入
msg += this.GetResourceString("SaleAmoutError", dtExcel.Rows[i][], dicOtherMakerMas[dtExcel.Rows[][j].ToString()], dtExcel.Rows[i][j]) + "<br/>";
continue;
}
rowInsert["SCHInput"] = "";
rowInsert["DayEndNo"] = dtExcel.Rows[i][] + hqAccountDate;
rowInsert["BCCD"] = loginUser;
rowInsert["UpdateMan"] = loginUser;
rowInsert["UpdateTime"] = DateTime.Now;
rowInsert["Origsys"] = ""; dtInsert.Rows.Add(rowInsert);
} } if (!string.IsNullOrEmpty(msg))
{
return false;
} #endregion #region 4.0 创建数据库临时表#temp,并把dtInsert内存表中的数据插入到临时表,再判断数据有效性并导入到正式表中 msg = dal.InsertOtherMakerSaleToTempTable(dtInsert);
if (!string.IsNullOrEmpty(msg))
{
return false;
} #endregion }
catch (Exception)
{
throw;
}
finally
{
#region 资源释放
if (oleConn != null)
{
oleConn.Dispose();
oleConn.Close();
}
if (dtInsert != null)
{
dtInsert.Dispose();
}
if (dtExcel != null)
{
dtExcel.Dispose();
}
if (ds != null)
{
ds.Dispose();
}
#endregion
} ts.Complete();
return true;
}
}

2.DAO数据库操作代码

/// <summary>
/// 创建“竞品品牌销售数据临时表”,判断数据有效性,导入到正式表中
/// </summary>
/// <param name="dtInsert">店铺竞品品牌销售数据</param>
/// <returns></returns>
public string InsertOtherMakerSaleToTempTable(DataTable dtInsert)
{
string msg = "";
string tempTableName = "#OtherMakerSaleTemp";
StringBuilder sql = new StringBuilder();
// 1 先删除临时表
sql.AppendFormat(" if object_id(N'{0}',N'U') is not null drop table {1}", tempTableName, tempTableName).AppendLine();
this.DataAccessClient.ExecuteNonQuery(sql.ToString()); // 2 创建临时表
sql.Remove(, sql.Length);
sql.AppendFormat(" select * into {0} from OtherSaleMonthTbl where 1=0 ;", tempTableName).AppendLine();
// 2.1 为临时表添加主键
sql.AppendFormat(" alter table {0} add primary key(ownerid,customercd,othermakercd,othersaleym); ", tempTableName).AppendLine();
this.DataAccessClient.ExecuteNonQuery(sql.ToString()); // 3.往临时表中插入数据
#region DeleteCode
/*
string connString = Inf.DevLib.Data.DataAccess.DataAccessFactory.ConnectionString;
using (SqlConnection conn = new SqlConnection(connString))
{
if (conn.State != System.Data.ConnectionState.Open)
{
conn.Open();
} using (SqlBulkCopy bc = new SqlBulkCopy(conn))
{
bc.BulkCopyTimeout = 300;
bc.DestinationTableName = tempTableName;
bc.WriteToServer(dtInsert);
}
conn.Close();
}
*/
#endregion this.DataAccessClient.BatchInsert(dtInsert, tempTableName, null, ); // 4.判断临时表中的店号在ShopRelateMakerTBL表中是否存在,若不存在则给予提示并返回
sql.Remove(, sql.Length);
sql.AppendFormat("select distinct a.CustomerCd from {0} a", tempTableName).AppendLine();
sql.AppendLine("where not exists");
sql.AppendLine("(select b.CustomerCd from ShopRelateMakerTBL b where a.OwnerId = b.OwnerId and a.CustomerCd = b.CustomerCd )");
// 在商店别他品牌对应表(ShopRelateMakerTBL)中不存在的店号
DataTable notExistsTable = this.DataAccessClient.ExecuteDataTable(sql.ToString());
if (notExistsTable != null && notExistsTable.Rows.Count > )
{
foreach (DataRow row in notExistsTable.Rows)
{
msg += row[] + ",";
}
// 店号在商店别他品牌对应表中不存在,请仔细核对数据重新导入!
msg = this.GetResourceString("StoreIdNotExist", msg.Substring(, msg.Length - ));
return msg;
} // 5.判断临时表中店铺所有的竞品品牌在ShopRelateMakerTBL表中是否存在,若不存在则给予提示并返回
sql.Remove(, sql.Length);
sql.AppendLine("select t.*,mst.OtherMakerNm from ");
sql.AppendLine("(");
sql.AppendLine(" select omst.OwnerId, omst.CustomerCd,omst.OtherMakerCd");
sql.AppendFormat(" from {0} omst", tempTableName).AppendLine();
sql.AppendLine(" where not exists");
sql.AppendLine(" (select srmt.OtherMakerCd from ShopRelateMakerTBL srmt ");
sql.AppendLine(" where omst.OwnerId = srmt.OwnerId and omst.CustomerCd = srmt.CustomerCd and omst.OtherMakerCd = srmt.OtherMakerCd )");
sql.AppendLine(") t ");
sql.AppendLine("inner join OtherMakerMasTbl mst");
sql.AppendLine(" on t.OwnerId = mst.OwnerId");
sql.AppendLine(" and t.OtherMakerCd = mst.OtherMakerCd");
List<ShopRelateMakerTBL> errorOtherMakerMasList = new List<ShopRelateMakerTBL>();
this.DataAccessClient.FillQuery(errorOtherMakerMasList, sql.ToString());
if (errorOtherMakerMasList.Count > )
{
var q = from e in errorOtherMakerMasList
group e by new { e.OwnerId, e.CustomerCd } into g
select new
{
StoreId = g.Key.CustomerCd,
OtherMakerNm = string.Join(",", g.Select(i => i.OtherMakerNm.Trim()))
};
string str = string.Empty;
q.ToList().ForEach(item => str += string.Format("[{0}:{1}]", item.StoreId, item.OtherMakerNm) + ",");
// 店号{0}的竞品品牌主档数据在商店别他品牌对应表中不存在,请仔细核对数据重新导入!
msg = this.GetResourceString("StoreOtherMakerNotExist", str.Substring(, str.Length - ));
return msg;
} // 6.把临时表中的数据插入到正式表OtherSaleMonthTbl(先删再插)
sql.Remove(, sql.Length);
// 6.1 先删除 正式表中未确认的店铺精品销售数据
sql.AppendLine("delete A ");
sql.AppendLine("from OtherSaleMonthTbl A");
sql.AppendFormat("inner join {0} B", tempTableName).AppendLine();
sql.AppendLine(" on A.OwnerId = B.OwnerId");
sql.AppendLine(" and A.CustomerCd = B.CustomerCd");
sql.AppendLine(" and A.OtherSaleYM = B.OtherSaleYM");
sql.AppendLine(" where ( A.ConfirmFlg != '1' or A.ConfirmFlg is null) "); // 未确认
this.DataAccessClient.ExecuteNonQuery(sql.ToString()); // 6.2 再删除 临时表中在正式表中已确认过的店铺销售数据
sql.Remove(, sql.Length);
sql.AppendLine("delete B ");
sql.AppendFormat("from {0} B", tempTableName).AppendLine();
sql.AppendLine(" inner join OtherSaleMonthTbl A");
sql.AppendLine(" on A.OwnerId = B.OwnerId");
sql.AppendLine(" and A.CustomerCd = B.CustomerCd");
sql.AppendLine(" and A.OtherSaleYM = B.OtherSaleYM");
sql.AppendLine(" where A.ConfirmFlg = '1' "); // 已确认
this.DataAccessClient.ExecuteNonQuery(sql.ToString()); // 6.3 最后把临时表中的数据全部插入正式表
sql.Remove(, sql.Length);
sql.AppendLine("INSERT INTO OtherSaleMonthTbl");
sql.AppendLine("select * ");
sql.AppendFormat("from {0} ", tempTableName).AppendLine();
this.DataAccessClient.ExecuteNonQuery(sql.ToString()); // 7.删除临时表
sql.Remove(, sql.Length);
sql.AppendFormat("drop table {0}", tempTableName).AppendLine();
this.DataAccessClient.ExecuteNonQuery(sql.ToString()); return msg;
}

Excel文件处理Demo的更多相关文章

  1. python xlwt模块生成excel文件并写入数据 xlrd读取数据

    python中一般使用 xlwt (excel write)来生成Excel文件(可以控制单元格格式),用 xlrd 来读取Excel文件,用xlrd读取excel是不能对其进行操作的. 1.xlrd ...

  2. java 读取Excel文件并数据持久化方法Demo

    import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util ...

  3. ASP.NET导出Excel文件

    第一种最常见,并且最简单的方式,直接把GridView导出,导出格式为文本表格形式. protected void btnSaveExcel_Click(object sender, EventArg ...

  4. Java 导入Excel文件到数据库

    原文:http://www.jb51.net/article/44021.htm 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两 ...

  5. Apache POI 实现对 Excel 文件读写

    1. Apache POI 简介 Apache POI是Apache软件基金会的开放源码函式库. 提供API给Java应用程序对Microsoft Office格式档案读和写的功能. 老外起名字总是很 ...

  6. 下载zip格式文件(压缩Excel文件为zip格式)

    Mongodb配置文件参考这一篇:http://www.cnblogs.com/byteworld/p/5913061.html package util; import java.io.Buffer ...

  7. 使用Python xlwt写excel文件

    如果需要使用Python写Excel文件,首先下载或者安装xlwt. pip install xlwt 下面的这些demo应该可以帮助开发者快速上手使用xlwt写Excel文件: 创建工作簿(work ...

  8. 在线读取Mongodb数据库下载EXCEL文件

    版本:Mongodb2.4.8 通过页面下载Excel文件 jsp <%@ page language="java" contentType="text/html; ...

  9. python使用xlrd模块读写Excel文件的方法

    本文实例讲述了python使用xlrd模块读写Excel文件的方法.分享给大家供大家参考.具体如下: 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi ...

随机推荐

  1. LeetCode(287)Find the Duplicate Number

    题目 Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), ...

  2. ACM Changchun 2015 J. Chip Factory

    John is a manager of a CPU chip factory, the factory produces lots of chips everyday. To manage larg ...

  3. local search——配图

  4. 使用docker+tomcat部署jenkins

  5. Go语言学习03

    Go语言-数组类型 一个数组(Array)就是一个可以容纳若干类型相同的元素的容器.这个容器的大小(即数组的长度)是固定的,且是体现在数组的类型字面量之中的.比如,我们声明了一个数组类型: type ...

  6. python week08 并发编程之多线程--实践部分

    一. threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.pytho ...

  7. 剑指offer 面试题38

    面试题38:数字在排序数组中出现的次数 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 主要的思路是进 ...

  8. struts拦截器详解

    拦截器是Struts2最强大的特性之一,它是一种可以让用户在Action执行之前和Result执行之后进行一些功能处理的机制. 说到拦截器interceptor,就会想到过滤器filter: 过滤器f ...

  9. java8新特性lamda表达式在集合中的使用

    1.利用stream().forEach()循环处理List; List<String> list = Lists.newArrayList();//新建一个List 用的google提供 ...

  10. 【Luogu】P3356火星探险问题(费用流)

    题目链接 网络流一条边都不能多连?没道理呀? 不过单看这题的确是个sb题…… #include<cstdio> #include<algorithm> #include< ...