using LumenWorks.Framework.IO.Csv; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Web; using WX.CRM.Common; using WX.CRM.Model.Entity; namespace WX.CRM.WebHelper.ExcelImport { public abstract class CsvComUploadTool : ComUploadTool { /// /// excel类型转换 /// /// /// /// public object GetObjectValue(object cell, string type) { string cellStr = cell.ToString().Trim(); object obj = new object(); switch (type) { case "System.String": obj = cellStr; break; case "System.Decimal": obj = cellStr.GetDecimal(0); break; case "System.Boolean": obj = Convert.ToBoolean(cellStr); break; case "System.DateTime": obj = cellStr.GetObjectByDateTime(); break; default: obj = cellStr; break; } return obj; } #region CreateDataTable (生成待批量入库的DataTable) /// /// 生成待批量入库的DataTable /// /// 上传的文件对象 /// 数据文件类型,枚举 /// 错误信息 /// public override DataTable CreateDataTable(HttpRequestBase Request, out ValidationErrors errMsg, decimal isNew) { //1、缓存中读取此datatype对应的数据字典,创建datatable //2、根据数据字典的关键字,找出每一列对应的excel中字段的序号 //3、循环生成每一条datarow记录 errMsg = new ValidationErrors(); DataTable tab = new DataTable(); HttpPostedFileBase file = Request.Files["uploadFile"]; Dictionary excelDic = new Dictionary();//存储excel 的列 和对应索引 try { using (CsvReader csv = new CsvReader(new StreamReader(file.InputStream, Encoding.GetEncoding("gb2312")), true)) { csv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty; int fieldCount = csv.FieldCount; string[] headers = csv.GetFieldHeaders(); List modelList = DataCacheHelper.GetCache().GetList_ExcelImportDict(ExcelDataType);//字典 //--------------------------表头-------------------------- for (int i = 0; i < headers.Length; i++) { string head = headers[i].Trim(); excelDic.Add(head, i); } foreach (BAS_EXCELIMPORTDICT model in modelList) { for (int i = 0; i < headers.Length; i++) { string head = headers[i].Trim(); if (head == model.EXCEL_COLNAME.Trim()) { model.ColumnIndex = i; break; } else if (head.Contains(model.EXCEL_COLNAME.Trim())) { model.ColumnIndex = i; continue; } } DataColumn column = new DataColumn(); column.Caption = model.EXCEL_COLNAME; column.ColumnName = model.DB_COLNAME; if (!string.IsNullOrEmpty(model.COLTYPE)) column.DataType = Type.GetType(model.COLTYPE); tab.Columns.Add(column); } List noColumnIndexList = modelList.Where(m => m.ISPRIMARY == 1 && m.ColumnIndex == -1).ToList(); if (noColumnIndexList.Count > 0) { string erromessage = "excel中找不到列:"; foreach (var model in noColumnIndexList) { erromessage += "[" + model.EXCEL_COLNAME + "]"; } errMsg.Add(erromessage); return tab; } //--------------------------数据-------------------------- while (csv.ReadNextRecord()) { DataRow dataRow = tab.NewRow(); for (int i = 0; i < modelList.Count; i++) { BAS_EXCELIMPORTDICT model = modelList[i]; object colvalue = new object(); if (model.ColumnIndex != -1) { var cell = csv[model.ColumnIndex].Trim(); if (model.VALUEFUNCTION == null || model.VALUEFUNCTION != "CUSTOMFORMATCOLNUM") colvalue = GetObjectValue(cell, model.COLTYPE);//根据引获取值 else colvalue = cell; } if (model.ColumnIndex == -1) colvalue = DBNull.Value; if (!string.IsNullOrWhiteSpace(model.VALUEFUNCTION)) { if (model.VALUEFUNCTION == "CREATERESID")//--------------创建客户ID { colvalue = CreateResId(colvalue.ToString()); } else if (model.VALUEFUNCTION == "CUSTOMFORMATCOLNUM")//--特殊格式化函数 { colvalue = CustomFormatColnum(modelList, csv, model, excelDic); } else if (model.VALUEFUNCTION == "FORMDATAFORMAT")//---从上传界面获取的 数据 { colvalue = FormDataFormat(Request, model); } } dataRow[i] = colvalue; } tab.Rows.Add(dataRow); } RemoveCacheData();//先移除缓存 SaveToCache(tab); return tab; } } catch (Exception ex) { errMsg.Add(ex.ToString()); return tab; } } #endregion #region 子类可重写的实现 /// /// 单元格数据格式化(供子类重写的格式化计算函数) /// /// 表字典 /// 这行excel数据 /// 该单元格字典对象 /// 存储excel 的列 和对应索引 /// protected virtual object CustomFormatColnum(List dictList, CsvReader rowReader, BAS_EXCELIMPORTDICT dictModel, Dictionary excelDic) { return rowReader[dictModel.ColumnIndex]; } #endregion } }