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 ...
随机推荐
- 如何提高UDP的可靠性
TCP是通过确认机制和超时重传机制实现可靠传输 UDP UDP它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频.视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数 ...
- Good Bye 2017
太菜了啊,一不小心就goodbye rating了 A. New Year and Counting Cards time limit per test 1 second memory limit p ...
- 【Luogu】P3203弹飞绵羊(分块)
题目链接 正解是LCT但我不会呀蛤蛤蛤蛤蛤 (分块我也没想出来 把区间分成根n个块,每个块内记录两个东西,就是该位置弹多少次能够弹出这个块,以及该位置弹到最后弹出去了之后能够弹到哪里. 然后查询就一个 ...
- [解决方案]Window 2008 R2 + IIS7.5 + VS2013 错误代码 0x80070002
HTTP 错误 404.0 - Not Found 您要找的资源已被删除.已更名或暂时不可用.详细错误信息模块 IIS Web Core通知 MapRequest Handler处理程序 Static ...
- bzoj 1003 [ZJOI2006]物流运输(最短路+dp)
[ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8973 Solved: 3839[Submit][Status][Di ...
- jenkins发送html测试报告
jenkins发送html测试报告 https://blog.csdn.net/galen2016/article/details/77975965/ <!DOCTYPE html> & ...
- 浅谈Linux下的五种I/O模型 两篇别人的博客
http://blog.csdn.net/sinat_34990639/article/details/52778562 http://www.cnblogs.com/chy2055/p/5220 ...
- <编程精粹:编写高质量C语言代码> 读书笔记
0.规则<The Elements of Programming Style><The Elements of Style> 1.假想的编译程序(1)使用编译器提供的所有的可选 ...
- hdu 6021 MG loves string
MG loves string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others ...
- Linq技巧3——何时及怎么使用预先加载
通常情况在你的应用程序中,一旦你要查询完数据的的时候,你知道使用实体来做什么. 假如你打印一份订单给顾客,你知道不包括组成订单的Items和Products信息,打印的信息是不完整的,所以查询时也需要 ...