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(260) Single Number III

    题目 Given an array of numbers nums, in which exactly two elements appear only once and all the other ...

  2. Mysql之查看数据库版本

    Mysql版本: 登入数据库的时候: select @@version; select version(); mysql> select @@version; +-----------+ | @ ...

  3. 枚举进程——暴力搜索内存(Ring0)

    上面说过了隐藏进程,这篇博客我们就简单描述一下暴力搜索进程. 一个进程要运行,必然会加载到内存中,断链隐藏进程只是把EPROCESS从链表上摘除了,但它还是驻留在内存中的.这样我们就有了找到它的方法. ...

  4. Apache ant 配置

    ANT_HOME C:\Program Files(D)\apache-ant-1.10.1Path %ANT_HOME%/binant -v

  5. 融合RocksDB, Pregel, Foxx & Satellite Collections 怎样使数据库性能提升35%?

    经过数月的研发测评,开源多模型数据库ArangoDB 终于发布了其 3.2 正式版,该版本消除了两个重大的障碍,添加了一个期待已久的功能,还集成了一个有趣的功能.此外,官方团队表示新版本将 Arang ...

  6. [python学习篇][廖雪峰][1]高级特性--列表生成式

    >>> import os >>> [d for d in os.listdir(r"d:\temp")] ['0.png', '0.xml', ...

  7. acmer之ubuntu下安装Eclipse

    ubuntu是acmer常用的系统,配置起CB还是比较简单的三行命令就OK了 //Current stable version of Code::Blocks IDE (16.01) //To ins ...

  8. java EE技术体系——CLF平台API开发注意事项(3)——API安全访问控制

    前言:提离职了,嗯,这么多年了,真到了提离职的时候,心情真的很复杂.好吧,离职阶段需要把一些项目中的情况说明白讲清楚,这篇博客就简单说一下在平台中对API所做的安全处理(后面讲网关还要说,这里主要讲代 ...

  9. JSON之解析

    JSON之解析通过TouchJSON\SBJSON\JSONKit\NSJSONSerialization JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式 ...

  10. HDU2013 蟠桃记【递推】

    Problem Description 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!什么问题?他研究的问题是蟠桃一共有多少 ...