Excel批量导入商品,遇到导入失败记录到另一个Excel中供下载查看

  1 /// <summary>
  2         ///     EXCEL批量导入
  3         /// </summary>
  4         /// <param name="filePath">文件路径</param>
  5         /// <param name="shop">店铺</param>
  6         /// <returns></returns>
  7         public string BatchUploadProduct(string filePath, Web_Shop shop)
  8         {
  9             #region 创建一个用于记录错误的新Excel
 10
 11             var workbook = new HSSFWorkbook();
 12             ISheet sheet0 = workbook.CreateSheet("sheet1");
 13             IRow rows = sheet0.CreateRow(0);
 14             rows.CreateCell(0).SetCellValue("分类ID");
 15             rows.CreateCell(1).SetCellValue("商品名称");
 16             rows.CreateCell(2).SetCellValue("售价");
 17             rows.CreateCell(3).SetCellValue("简单描述");
 18             rows.CreateCell(4).SetCellValue("重量");
 19             rows.CreateCell(5).SetCellValue("单位");
 20             rows.CreateCell(6).SetCellValue("现购库存");
 21             rows.CreateCell(7).SetCellValue("供应类型");
 22             rows.CreateCell(8).SetCellValue("收获时间");
 23             rows.CreateCell(9).SetCellValue("订购库存");
 24             rows.CreateCell(10).SetCellValue("错误消息");
 25
 26             #endregion
 27
 28             try
 29             {
 30                 using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
 31                 {
 32                     var book = new HSSFWorkbook(stream); //读出来用户上传的Excel
 33                     ISheet sheet = book.GetSheetAt(0); //拿到Excel中的第一个sheet
 34                     int rowCount = sheet.LastRowNum; //拿到sheet的行数
 35                     int errorCount = 0;
 36                     for (int i = sheet.FirstRowNum + 1; i < rowCount; i++)
 37                     {
 38                         IRow row = sheet.GetRow(i);
 39                         //row2.CreateCell(10).SetCellValue(row.GetCell(10).ToString());
 40
 41                         #region 中间变量
 42
 43                         string errMsg = string.Empty;
 44                         bool error = false;
 45                         int categoryId;
 46                         string proName;
 47                         decimal marketPrice;
 48                         string shortContent;
 49                         int weight;
 50                         string unit;
 51                         int storage; //现购库存
 52                         int canSupply; //可订购数量
 53                         int supplyType; //供应类型
 54                         DateTime harvestTime; //收获时间
 55
 56                         #endregion
 57
 58                         var pro = new Web_Product();
 59
 60                         #region 检测数据合法性
 61
 62                         if (!int.TryParse(row.GetCell(0).ToString(), out categoryId))
 63                         {
 64                             errMsg = "商品类型错误";
 65                             error = true;
 66                         }
 67                         proName = row.GetCell(1).ToString();
 68                         if (string.IsNullOrEmpty(proName))
 69                         {
 70                             errMsg = errMsg + ",商品名称不能为空";
 71                             error = true;
 72                         }
 73
 74                         if (!decimal.TryParse(row.GetCell(2).ToString(), out marketPrice))
 75                         {
 76                             errMsg = errMsg + ",商品价格错误";
 77                             error = true;
 78                         }
 79                         shortContent = row.GetCell(3).ToString();
 80                         if (string.IsNullOrEmpty(shortContent))
 81                         {
 82                             errMsg = errMsg + ",商品描述不能为空";
 83                             error = true;
 84                         }
 85                         if (!int.TryParse(row.GetCell(4).ToString(), out weight))
 86                         {
 87                             errMsg = errMsg + ",商品重量错误";
 88                             error = true;
 89                         }
 90                         unit = row.GetCell(5).ToString();
 91                         if (string.IsNullOrEmpty(unit))
 92                         {
 93                             errMsg = errMsg + ",商品单位错误";
 94                             error = true;
 95                         }
 96
 97                         if (!int.TryParse(row.GetCell(6).ToString(), out storage))
 98                         {
 99                             errMsg = errMsg + ",商品现购库存错误";
100                             error = true;
101                         }
102                         if (!int.TryParse(row.GetCell(7).ToString(), out supplyType))
103                         {
104                             errMsg = errMsg + ",商品供应类型错误";
105                             error = true;
106                         }
107                         if (!DateTime.TryParse(row.GetCell(8).DateCellValue.ToString("yyyy-MM-dd"), out harvestTime))
108                         {
109                             errMsg = errMsg + ",商品收获时间错误";
110                             error = true;
111                         }
112                         if (!int.TryParse(row.GetCell(9).ToString(), out canSupply))
113                         {
114                             errMsg = errMsg + ",商品订购库存错误";
115                             error = true;
116                         }
117
118                         #endregion
119
120                         #region 如果有错误,就把这一行给添加到新的Excel中
121
122                         if (error)
123                         {
124                             IRow row2 = sheet0.CreateRow(sheet0.LastRowNum + 1);
125                             row2.CreateCell(0).SetCellValue(row.GetCell(0).ToString());
126                             row2.CreateCell(1).SetCellValue(row.GetCell(1).ToString());
127                             row2.CreateCell(2).SetCellValue(row.GetCell(2).ToString());
128                             row2.CreateCell(3).SetCellValue(row.GetCell(3).ToString());
129                             row2.CreateCell(4).SetCellValue(row.GetCell(4).ToString());
130                             row2.CreateCell(5).SetCellValue(row.GetCell(5).ToString());
131                             row2.CreateCell(6).SetCellValue(row.GetCell(6).ToString());
132                             row2.CreateCell(7).SetCellValue(row.GetCell(7).ToString());
133                             row2.CreateCell(8).SetCellValue(row.GetCell(8).ToString());
134                             row2.CreateCell(9).SetCellValue(row.GetCell(9).ToString());
135                             row2.CreateCell(10).SetCellValue(errMsg);
136                             errorCount += 1;
137                         }
138
139                         #endregion
140
141                         #region 如果没有错误,把产品添加到数据库
142
143                         if (!error)
144                         {
145                             pro.Name = proName.TagReplace();
146                             pro.MarketPrice = marketPrice;
147                             pro.ShortContent = shortContent.TagReplace();
148                             pro.Weight = weight;
149                             pro.Unit = unit.TagReplace();
150                             pro.Storage = storage;
151                             pro.CanSupply = canSupply;
152                             pro.CategoryID = categoryId;
153                             pro.IsValidate = 0; //默认这个产品是没有经过验证的,不让它上架
154                             if (supplyType != 100) //只要不等于100,默认都给200
155                             {
156                                 supplyType = 200;
157                             }
158                             pro.SupplyType = supplyType;
159                             pro.ShopID = shop.ID;
160                             pro.HarvestTime = harvestTime;
161                             AddProduct(pro);
162                         }
163
164                         #endregion
165                     }
166                     string savePath = VirtualPaths.ErrorExcelSavePath + "/" + GetProductrNumberByDate() + ".xls";
167                         //生成错误Excel的文件
168                     if (errorCount > 0) //如果总的错误个数大于0,就吧错误的Excel写到文件中,否则不写。
169                     {
170                         using (var fs = new FileStream(savePath, FileMode.Create))
171                         {
172                             workbook.Write(fs); //保存
173                         }
174                         return savePath; //返回路径供下载
175                     }
176                     return "ok"; //表示上传成功,没有错误
177                 }
178             }
179             catch
180             {
181                 return "上传失败,请重试"; //遇到的未知的错误
182             }
183         }

DAL层

时间: 2024-07-31 14:34:46

Excel批量导入商品,遇到导入失败记录到另一个Excel中供下载查看的相关文章

Excel批量导入数据之数据校验

最近,工作上接到Excel批量导入数据的需求.在这里,小编想分享的是数据校验那些事,至于如何读取Excel数据,大家可以百度下. 一般而言,Excel批量导入数据,我们都会给客户提供一个固定的模板以输入我们期望的数据.然而,客户的操作,我们是无法预料的,他们有可能增加一列或者删除一列,有可能去掉Excel某个字段的输入限制等等. Excel模板,有可能只有一个,有可能若干个.各个模板的数据列,或交叉相同,或存在个性化列. 同一个模板,也许因某列数据的不同,而需要填充不同数据列. ...... 面

JAVA实现Excel批量导入

一.模板下载: 先将模板放在项目WebRoot下的download文件夹下: /** * @Title: downloadFile * @Description: 模板下载 (网络地址) * @param @param id * @param @param url * @param @param fileName * @param @param response * @param @param request * @param @throws Exception * @return void *

bos 第4 (区域excel批量导入、区域通用分页查询、分区的添加、分区多条件分页查询、分区导出excel)

BOS项目笔记 第4天 今天内容安排: 1.区域批量导入功能 jQuery OCUpload(一键上传插件).apache POI.pinyin4j 2.实现区域的分页查询 3.对分页代码重构 4.添加分区(combobox下拉框) 5.分区的组合条件分页查询 6.分区数据导出功能 1. 区域数据批量导入功能 1.1 一键上传插件使用 ajax不能做文件上传. 第一步:在jsp页面中引入插件的js文件 <script type="text/javascript" src=&quo

利用OLEDB+SqlClient实现EXCEL批量导入数据

以下是几个自己写的类 /// <summary> /// 取得Excel对象 /// </summary> /// <param name="strConn">OLEDB连接字符串</param> /// <param name="sql">SQL语句</param> /// <returns></returns> public static DataTable GetE

poi excel批量导入 解决各类型的数据

String value=this.getValue((HSSFCell) row.getCell(position)) 数字类型  时间类型 字符串类型验证没问题, 数字类型如果是1234.0会将其变成1234  如果是1234.5保存仍然保持小数位1234.5,用来解决电话号码和普通数字问题 时间类型将其格式化成了 2015-12-09 12:13:12这种格式便于保存数据库 //解决类型问题,获得数值 public String getValue(HSSFCell cell) { Stri

使用SqlBulkCopy实现Excel批量导入数据库

引言: 导入Excel数据时候,因为数据量大,使用 linq 操作插入的时候,很慢.考虑使用ado.net操作数据库方式导入数据.由于数据量比较大使用SqlBulkCopy来实现批量导入. 一.代码解释: 1.将要导入的excel上传保存到服务器. 2.使用OleDbDataAdapter获取excel中的数据插入tab中. 3.在内存中创建一个表newDT,将tab表做修改后更新到newDT中. 4.使用SqlBulkCopy批量将newDT内存表数据插入到数据库表Sys_StuUser中.

JEPLUS平台Excel批量导入的操作配置——JEPLUS软件快速开发平台

JEPLUS平台Excel批量导入的操作配置 JEPLUS平台支持Excel数据的批量导入,但是很多客户不明白批量导入怎么配置,今天这个笔记就简单说一下JEPLUS的Excel数据批量导入怎么来配置. 一.效果展示 二.Excel数据批量导入操作的配置过程 1.添加Excel数据批量导入操作需要的按钮 找到目标功能,添加业务需求说需要的按钮,操作如图: 2.为新添加的按钮编写业务所需要的JS事件 Excel数据批量导入时应该按照平台规定的模板来添加,首先还是为"下载模板"这个按钮添加J

mysql数据库导入导出 查询 修改表记录

mysql数据导入导出: 导入: 把系统的文件的内容,保存到数据库的表里 导入数据的基本格式:mysql> load data infile "文件名" into table 表名 fields terminated by '分隔符' lines terminated by '\n'; 实例:把系统用户信息保存到hydra01库下的userinfo表里 mysql> create table userinfo(name char(20),password char(1),u

Sqlite嵌入式数据库的安装、建库、建表、更新表结构以及数据导入导出等等详细过程记录

简介: SQLite 是实现了SQL 92标准的一个大子集的嵌入式数据库.其以在一个库中组合了数据库引擎和接口,能将所有数据存储于单个文件中而著名.我觉得SQLite的功能一定程度上居于MySQL 和PostgreSQL之间.尽管如此,在性能上面,SQLite常常快2-3倍 (甚至更多).这利益于其高度调整了的内部架构,因为它除去了服务器端到客户端和客户端到服务器端的通信. 而令人印象深刻的特点是你可将你的整个数据库系统放在其中.利用非常高效的内存组织,SQLite只需在很小的内存中维护其很小的