Excel文件处理Demo
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的更多相关文章
- python xlwt模块生成excel文件并写入数据 xlrd读取数据
python中一般使用 xlwt (excel write)来生成Excel文件(可以控制单元格格式),用 xlrd 来读取Excel文件,用xlrd读取excel是不能对其进行操作的. 1.xlrd ...
- java 读取Excel文件并数据持久化方法Demo
import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util ...
- ASP.NET导出Excel文件
第一种最常见,并且最简单的方式,直接把GridView导出,导出格式为文本表格形式. protected void btnSaveExcel_Click(object sender, EventArg ...
- Java 导入Excel文件到数据库
原文:http://www.jb51.net/article/44021.htm 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两 ...
- Apache POI 实现对 Excel 文件读写
1. Apache POI 简介 Apache POI是Apache软件基金会的开放源码函式库. 提供API给Java应用程序对Microsoft Office格式档案读和写的功能. 老外起名字总是很 ...
- 下载zip格式文件(压缩Excel文件为zip格式)
Mongodb配置文件参考这一篇:http://www.cnblogs.com/byteworld/p/5913061.html package util; import java.io.Buffer ...
- 使用Python xlwt写excel文件
如果需要使用Python写Excel文件,首先下载或者安装xlwt. pip install xlwt 下面的这些demo应该可以帮助开发者快速上手使用xlwt写Excel文件: 创建工作簿(work ...
- 在线读取Mongodb数据库下载EXCEL文件
版本:Mongodb2.4.8 通过页面下载Excel文件 jsp <%@ page language="java" contentType="text/html; ...
- python使用xlrd模块读写Excel文件的方法
本文实例讲述了python使用xlrd模块读写Excel文件的方法.分享给大家供大家参考.具体如下: 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi ...
随机推荐
- excel日期格式取年份
具体思路:先将日期格式更改为常规格式,再取常规格式的前4位数字 例如:A1==1981/12/22 第一步B1=TEXT(A1,"emd") 第二步C1=LEFT(B1,4) 结束
- bash 统计在线时长最长的十个玩/统计一天内一直处于不活跃状态的玩家的百分比
1.某游戏的客户端每隔5分钟会向服务端报告一次玩家的账户积分,如果两次报告的时间间隔不大于5分钟,认为该玩家在这5分钟内在线,假设报告数据的格式如下: IP Dat ...
- Java中的数据类型和引用
JAVA数据类型分primitive数据类型和引用数据类型. Java中的primitive数据类型分为四类八种.primitive也不知道怎么翻译比较贴切, 暂且叫他基本数据类型吧, 其实直接从英文 ...
- 文件上传下载,命令之wget / curl / which / sort / uniq / cut / wc /tr /sed
目录 命令 1.文件的上传下载 2.从外网下载文件wget 3.curl文件下载 4.查找命令which 5.字符处理命令-排序sort 6.字符处理-去重uniq 7.字符处理-截取cut 8.字符 ...
- 创建sql作业(JOB)
在SQL Server日常需求处理中,会遇到定时执行或统计数据的需求,这时我们可以通过作业(JOB)来处理,从而通过代理的方式来实现数据的自动处理.一下为SQL Server中创建作业的脚本,供大家参 ...
- Leetcode 464.我能赢吗
我能赢吗 在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到 100 的玩家,即为胜者. 如果我们将游戏规则改为 ...
- Leetcode 436.寻找右区间
寻找右区间 给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的"右侧". 对于任何区间,你需要存储的满足条 ...
- 谈谈Python中对象拷贝
你想复制一个对象?因为在Python中,无论你把对象做为参数传递,做为函数返回值,都是引用传递的. 何谓引用传递,我们来看一个C++交换两个数的函数: void swap(int &a, in ...
- python学习笔记--python编程基础
一.一个隆重的仪式 我们在学习语言的时候,第一个写的程序肯定都是hello world.来写第一个程序吧,其实很简单,python的语法就是简单.优雅,一个print就搞定. 1 print('hel ...
- 用JS去掉前后空格或中间空格大全
1. 去掉字符串前后所有空格: -- js实现trim功能 //去除字符串前后所有空 function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g ...