Excel 导入并导出结果集
2015-09-24 09:33
399 查看
1、controler代码:
2.BLL层代码
(1)处理Excel文件:
(2)Excel列存入model实体类
3.导出导入结果集
(1)固定列最后加一列导入结果列
(2)动态列(不固定列)导入导出结果集
/// <summary> /// 导入预归类意见书 /// </summary> /// <param name="uploadfile"></param> /// <returns></returns> [HttpPost] [ValidateAntiForgeryToken] public FileResult INPUTExcel(IEnumerable<HttpPostedFileBase> uploadfile) { string strvalue = string.Empty; byte[] fileContents = Encoding.Default.GetBytes("暂无数据!"); SsoIdentity identity = this.User.Identity as SsoIdentity; try { string SavePath = string.Empty; bool bResult = false; #region<<将Excel文件保存到服务器>> foreach (var file in uploadfile) { string FileName = Path.GetFileName(file.FileName); string PathR = Server.MapPath("~/UpLoadFile/PreClassified/"); bResult = FileHelper.IsExistDirectory(PathR); if (!bResult) { FileHelper.CreateDirectory(PathR); } SavePath = Path.Combine(PathR, FileName); file.SaveAs(SavePath); } #endregion if (!string.IsNullOrWhiteSpace(SavePath)) { LoginInfo loginInfo = new LoginInfo(); UserHelper.GetUserInfo(false, ref loginInfo, identity); //如果存在已存在数据选择是否覆盖的预归类意见书列表 bResult = _ibll.InputClassificationLabDecision(SavePath, ref fileContents,loginInfo.CustomCode); //FileHelper.UnLockFile(SavePath); System.IO.File.Delete(SavePath);//添加导入完成之后在服务器端删除上传到服务器的EXCEL文件 strvalue = string.Format("三统一帐号{0} 执行预归类意见书管理子系统中预归类意见书 ", loginInfo.LoginName); if (!bResult) { UserOperateLogHelper.WriteOperateLog(strvalue, EnumActionOperatonType.InPut, (int)EnumActionExecutedStatus.Error, identity, (int)EnumSysFlags.PreClassification); } UserOperateLogHelper.WriteOperateLog(strvalue, EnumActionOperatonType.InPut, (int)EnumActionExecutedStatus.Success, identity, (int)EnumSysFlags.PreClassification); } } catch(Exception ex) { LogHelper.Write(ex); } return File(fileContents, "application/ms-excel", "ImportPerBooksResult.xls"); }
2.BLL层代码
(1)处理Excel文件:
/// <summary> /// 导入预归类意见书 /// </summary> /// <param name="fileName"></param> /// <param name="btyBytes"></param> /// <returns></returns> public bool InputClassificationLabDecision(string fileName, ref byte[] btyBytes, string CGAC_CO) { IWorkbook workbook = null; List<PreClassificationOpBook> lst = new List<PreClassificationOpBook>(); FileStream fs = null; List<string> lstresult = null; //string sheetName = null; bool bResult = true; ISheet sheet = null; string filename = string.Format("MyClassificationLabDecision{0}.xls", DateTime.Now.ToString("HHmmssfff")); int startRow = 0; try { using (fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { if (fileName.IndexOf(".xlsx") > 0) // 2007版本 { workbook = new XSSFWorkbook(fs); } else if (fileName.IndexOf(".xls") > 0) // 2003版本 { workbook = new HSSFWorkbook(fs); } if (workbook != null) { sheet = workbook.GetSheetAt(0); if (sheet != null) { IRow firstRow = sheet.GetRow(0); int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数 startRow = sheet.FirstRowNum + 1; //最后一列的标号 int rowCount = sheet.LastRowNum; List<bool> lstdate = new List<bool>(); for (int i = startRow; i <= rowCount; ++i) { bool IsNullRow = true; PreClassificationOpBook mdl = new PreClassificationOpBook(); IRow row = sheet.GetRow(i); if (row == null) continue; //没有数据的行默认是null for (int j = row.FirstCellNum; j < cellCount; ++j) { bool ibresult = false; var cellValue=row.GetCell(j); var rowValue = cellValue == null?"":cellValue.ToString(); if (!string.IsNullOrWhiteSpace(rowValue) || !IsNullRow) { mdl = AddModelField(j, mdl, rowValue, ref ibresult); if (j == 12)//如果列为生效日期列 { lstdate.Add(ibresult); } IsNullRow = false; } } if (!IsNullRow) { lst.Add(mdl); } } //不采取全部一起提交的方式 每一条执行一次SaveChanage AddModelList(lst, lstdate, ref lstresult,CGAC_CO); } } } } catch (IOException ex) { LogHelper.Write(ex); bResult = false; } catch (SqlException ex) { LogHelper.Write(ex); bResult = false; } finally { if (fs != null) { fs.Dispose(); } //导出结果集 Dictionary<string, string> Dic = GETMATCHUP(); Dic["CGAC_CO"] = "关区代码"; Dic.Remove("IsEffect"); FileHelper.ExExcelDouble<PreClassificationOpBook>(lst, filename, ref btyBytes, Dic, lstresult); } return bResult; }
(2)Excel列存入model实体类
/// <summary> /// 向Model中添加字段值 /// </summary> /// <param name="i"></param> /// <param name="mdl"></param> /// <param name="row"></param> /// <param name="ibresult"></param> /// <returns></returns> private PreClassificationOpBook AddModelField(int i, PreClassificationOpBook mdl, string rowValue, ref bool ibresult) { switch (i) { //case 0://第一行为流水号 // { // mdl.SEQ_NO = rowValue; // break; // } case 0://预归类意见书编号 { mdl.PCS_NO_S = rowValue; break; } case 1://经营单位(委托方)名称 { mdl.TRADE_NAME = rowValue; break; } case 2://经营单位(委托方)企业代码 { mdl.TRADE_CO = rowValue; break; } case 3://商品名称(中文) { mdl.G_NAME = rowValue; break; } case 4://规格型号 { mdl.G_MODEL = rowValue; break; } case 5://商品名称(英文名称) { mdl.G_NAME_ENG = rowValue; break; } case 6://商品名称(其他名称) { mdl.G_NAME_OTR = rowValue; break; } case 7://商品描述(货物型号、规格、成份及用途) { mdl.G_DESCRIPTION = rowValue; break; } case 8://归类结论 { mdl.CODE_TS = rowValue; break; } case 9://归类依据或理由 { mdl.NOTE = rowValue; break; } case 10://预归类单位名称 { mdl.AGENT_NAME = rowValue; break; } //case 11://预归类数据导入单位名称 // { // mdl.AGENT_INPUT_NAME = rowValue; // break; // } case 11://联系电话 { mdl.AGENT_TEL = rowValue; break; } //case 13://关区代码 // { // mdl.CGAC_CO = rowValue; // break; // } case 12://生效日期 { DateTime dt = DateTime.Now; bool bResult = ToolsHelper.CheckTime(rowValue.Replace("月", ""), ref dt); if (bResult) { mdl.EFFECTIVE_DATE = dt; } ibresult = bResult; break; } } return mdl; }
3.导出导入结果集
(1)固定列最后加一列导入结果列
/// <summary> /// 将一组对象导出成EXCEL /// </summary> /// <typeparam name="T">要导出对象的类型</typeparam> /// <param name="objList">一组对象</param> /// <param name="fileName">导出后的文件名</param> /// <param name="columnInfo">列名信息</param> /// <param name="btyBytes"></param> public static bool ExExcelDouble<T>(List<T> objList, string fileName, ref byte[] btyBytes, Dictionary<string, string> columnInfo = null, List<string> lststring = null) where T : class { bool bResult = false; try { //if (objList.Count > 50000) //{ // btyBytes = new byte[] { }; // bResult = ExExcel<T>(objList, fileName, ref btyBytes, columnInfo, lststring); // return bResult; //} HSSFWorkbook workbook = new HSSFWorkbook(); //在工作薄中建立工作表 HSSFSheet sheet = workbook.CreateSheet() as HSSFSheet; sheet.SetColumnWidth(0, 30 * 256); if (columnInfo != null && columnInfo.Count == 0) { return false; } //生成EXCEL的HTML string excelStr = ""; Type myType = null; if (objList.Any()) { myType = objList[0].GetType(); //根据反射从传递进来的属性名信息得到要显示的属性 List<PropertyInfo> myPro = new List<PropertyInfo>(); PropertyInfo[] properties = myType.GetProperties(); int m = 0; if (columnInfo != null) { var rowheader = sheet.CreateRow(0); rowheader.Height = 20 * 20; foreach (string cName in columnInfo.Keys) { PropertyInfo p = myType.GetProperty(cName); if (p != null) { myPro.Add(p); rowheader.CreateCell(m).SetCellValue(columnInfo[cName]); m++; } } if (lststring != null) { rowheader.CreateCell(myPro.Count).SetCellValue("导入提示"); } } //如果没有找到可用的属性则结束 if (myPro.Count == 0) { return bResult; } int i = 1;//lststring 计数 foreach (T obj in objList) { int n = 0; if (sheet != null) { var sheetrow = sheet.CreateRow(i); sheetrow.Height = sheetrow.Height = 20 * 20; foreach (PropertyInfo p in myPro) { dynamic val = p.GetValue(obj, null) ?? ""; string valtype = val.GetType().ToString(); if (valtype.ToLower().IndexOf("decimal", StringComparison.Ordinal) > -1) { val = Convert.ToDouble(val); } else if (valtype.ToLower().IndexOf("datetime", StringComparison.Ordinal) > -1) { val = val.ToString("yyyy-MM-dd HH:mm:ss"); if (val.Equals("0001-01-01 00:00:00")) { val = ""; } } sheetrow.CreateCell(n).SetCellValue(val); n++; } if (lststring != null) { sheetrow.CreateCell(n).SetCellValue(lststring[i - 1]); } } Thread.Sleep(10); i++; } } else { if (sheet != null) sheet.CreateRow(0).CreateCell(0).SetCellValue("暂无数据!"); } using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); if (btyBytes != null) { btyBytes = ms.ToArray(); } else { btyBytes = ms.ToArray(); HttpResponse rs = System.Web.HttpContext.Current.Response; rs.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); rs.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName,System.Text.Encoding.UTF8)); rs.ContentType = "application/ms-excel"; rs.BinaryWrite(btyBytes); rs.End(); } ms.Flush(); ms.Position = 0; workbook = null; } //输出EXCEL bResult = true; } catch (Exception ex) { LogHelper.Write(ex); } return bResult; }
(2)动态列(不固定列)导入导出结果集
/// <summary> /// 同义词导入 /// </summary> /// <typeparam name="T">要导出对象的类型</typeparam> /// <param name="objList">一组对象</param> /// <param name="fileName">导出后的文件名</param> /// <param name="columnInfo">列名信息</param> /// <param name="MaxColNum">最大列数</param> /// <param name="btyBytes"></param> public static bool ExRandomColExcel<T>(List<T> objList, string fileName, ref byte[] btyBytes, Dictionary<string, string> columnInfo = null, List<string> lststring = null, int MaxColNum = 0) where T : class { bool bResult = false; try { HSSFWorkbook workbook = new HSSFWorkbook(); //在工作薄中建立工作表 HSSFSheet sheet = workbook.CreateSheet() as HSSFSheet; sheet.SetColumnWidth(0, 30 * 256); if (columnInfo != null && columnInfo.Count == 0) { return false; } //生成EXCEL的HTML Type myType = null; if (objList.Any()) { CellType cellType = new CellType(); myType = objList[0].GetType(); //根据反射从传递进来的属性名信息得到要显示的属性 List<PropertyInfo> myPro = new List<PropertyInfo>(); PropertyInfo[] properties = myType.GetProperties(); int m = 0; if (columnInfo != null) { var rowheader = sheet.CreateRow(0); rowheader.Height = 20 * 20; if (lststring != null) { rowheader.CreateCell(myPro.Count).SetCellValue("导入提示"); } for (int i = 0; i < MaxColNum; i++) { m++; PropertyInfo p = myType.GetProperty(columnInfo.ElementAtOrDefault(i > columnInfo.Count - 1 ? columnInfo.Count - 1 : i).Key); if (p != null) { myPro.Add(p); rowheader.CreateCell(m).SetCellValue( columnInfo.ElementAtOrDefault(i > columnInfo.Count - 1 ? columnInfo.Count - 1 : i).Value); } } } //如果没有找到可用的属性则结束 if (myPro.Count == 0) { return bResult; } int rowCount = 1;//lststring 计数 foreach (T obj in objList) { PropertyInfo[] pro = obj.GetType().GetProperties(); int n = 0; if (sheet != null) { var sheetrow = sheet.CreateRow(rowCount); sheetrow.Height = sheetrow.Height = 20 * 20; //导入结果 if (lststring != null) { sheetrow.CreateCell(n).SetCellValue(lststring[rowCount - 1]); } for (int j = 0; j < MaxColNum; j++) { n++; dynamic value = ""; dynamic val = pro[j > pro.Length - 1 ? pro.Length - 1 : j].GetValue(obj, null); string listtype = val.GetType().ToString(); if (listtype.ToLower().IndexOf("list", StringComparison.Ordinal) > -1) { foreach (var item in val) { j++; value = item; string valtype = value.GetType().ToString(); if (valtype.ToLower().IndexOf("decimal", StringComparison.Ordinal) > -1) { value = Convert.ToDouble(value); } else if (valtype.ToLower().IndexOf("datetime", StringComparison.Ordinal) > -1) { value = value.ToString("yyyy-MM-dd HH:mm:ss"); } sheetrow.CreateCell(n).SetCellValue(value); n++; } if (j > pro.Length - 1) { break; } } else { value = pro[j].GetValue(obj, null); string valtype = value.GetType().ToString(); if (valtype.ToLower().IndexOf("decimal", StringComparison.Ordinal) > -1) { value = Convert.ToDouble(value); } else if (valtype.ToLower().IndexOf("datetime", StringComparison.Ordinal) > -1) { value = value.ToString("yyyy-MM-dd HH:mm:ss"); } sheetrow.CreateCell(n).SetCellValue(value); } } } Thread.Sleep(10); rowCount++; } } else { if (sheet != null) sheet.CreateRow(0).CreateCell(0).SetCellValue("暂无数据!"); } using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); if (btyBytes != null) { btyBytes = ms.ToArray(); } else { btyBytes = ms.ToArray(); HttpResponse rs = System.Web.HttpContext.Current.Response; rs.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); rs.AppendHeader("Content-Disposition", "attachment;filename=" + fileName); rs.ContentType = "application/ms-excel"; rs.BinaryWrite(btyBytes); rs.End(); } ms.Flush(); ms.Position = 0; workbook = null; } //输出EXCEL bResult = true; } catch (Exception ex) { LogHelper.Write(ex); } return bResult; }
相关文章推荐
- 2015年秋季阅读计划
- C# 之 Math取整
- [sicily]1029. Rabbit
- WPF: 实现带全选复选框的列表控件
- checkbox选中并记住状态(分页)
- 测试用例模板
- jquery对出错图片的处理
- Binary Search 总结
- AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- 使用::before和::after来完成尖角效果
- Nmcli 网络管理命令行工具基础
- java集合类中的迭代器
- mysql中root用户的密码修改和消除
- SimpleDateFormat使用详解 java
- $.AJAX参数提交及后台获取方式
- JSP 静态生成html的原理
- UI界面传值
- WPF数据绑定
- intellijidea连接spark集群
- Nmcli 网络管理命令行工具基础