/// <summary> /// 导入DT /// </summary> /// <param name="importid">0:导入旧数据库模板 1:导入新数据库模板</param> /// <param name="fileAddress"></param> /// <returns></returns> private DataTable OpenExcelToDataTable(int importid, string fileAddress) { //定义EXCEL列数 var colnum = 0; IWorkbook wk; //创建表标题 var dt = new DataTable(); dt = importid == 0 ? dtList.Get_ImportOldtempdt() : dtList.Get_ImportNewtempdt(); using (var fsRead = File.OpenRead(fileAddress)) { wk = new XSSFWorkbook(fsRead); //获取第一个sheet var sheet = wk.GetSheetAt(0); //获取第一行 //var hearRow = sheet.GetRow(0); //创建完标题后,开始从第二行起读取对应列的值 for (var r = 1; r <= sheet.LastRowNum; r++) { var result = false; var dr = dt.NewRow(); //获取当前行(注:只能获取行中有值的项,为空的项不能获取;即row.Cells.Count得出的总列数就只会汇总"有值的列"之和) var row = sheet.GetRow(r); if (row == null) { continue; } colnum = importid == 0 ? 15 : 4; //读取每列 for (var j = 0; j < colnum /*row.Cells.Count*/; j++) { //循环获取行中的单元格 var cell = row.GetCell(j); var cellValue = GetCellValue(cell); if (cellValue == string.Empty) { continue; } else { dr[j] = cellValue; } //全为空就不取 if (dr[j].ToString() != "") { result = true; } } if (result == true) { //把每行增加到DataTable dt.Rows.Add(dr); } } } return(dt); }
/// <summary> /// 运算 /// </summary> /// <param name="sourceolddt">旧数据库导入DT</param> /// <param name="sourcenewdt">新数据库导入DT</param> /// <returns></returns> public DataTable GenerateTemp(DataTable sourceolddt, DataTable sourcenewdt) { var resultdt = new DataTable(); try { //获取新数据完整模板(导出时需要) resultdt = dtList.ExportNewtempdt(); //获取新数据模板(数据比较时使用) var newdt = dtList.Get_ImportNewtempdt(); //获取旧数据模板(数据比较时使用) var olddt = dtList.Get_ImportOldtempdt(); //获取旧数据模板 作用:保存需要进行删除的旧记录DT var delolddt = dtList.Get_ImportOldtempdt(); //先循环整理新数据库导入的DT(注:若‘制造商’列为空的话,就不用将数据插入至newdt内) foreach (DataRow rows in sourcenewdt.Rows) { if (Convert.ToString(rows[0]) == "") { continue; } var newrow = newdt.NewRow(); newrow[0] = rows[0]; //制造商 newrow[1] = rows[1]; //标准色号 newrow[2] = rows[2]; //色母编码 newrow[3] = Math.Round(Convert.ToDouble(rows[3])); //色母量 newdt.Rows.Add(newrow); } //循环整理新数据库导入的DT(注:若‘车厂’列为空的话,就不用将数据插入至olddt内) for (var i = 0; i < sourceolddt.Rows.Count; i++) { if (Convert.ToString(sourceolddt.Rows[i][1]) == "") { continue; } var newrow = olddt.NewRow(); for (var j = 0; j < sourceolddt.Columns.Count; j++) { //将‘量’转换取整 newrow[j] = j == 13 ? Math.Round(Convert.ToDouble(sourceolddt.Rows[i][j]), 0) : sourceolddt.Rows[i][j]; } olddt.Rows.Add(newrow); } //将olddt与newdt进行相关列比较,若相同,即记录,并最后将sourceolddt相关行删除(重) //对比条件:制造商(新):车厂(旧) 标准色号(新):颜色代码(旧) 色母编码(新):色母(旧) 色母量(KG)(新):量(克)(旧) 之间的对比 //注:在使用Select函数时,在其内的条件名称不要带(),如:"量(克)" foreach (DataRow rows in newdt.Rows) { var row = olddt.Select(@"车厂='" + Convert.ToString(rows[0]) + "' and 颜色代码 ='" + Convert.ToString(rows[1]) + "' and 色母 ='" + Convert.ToString(rows[2]).Substring(3) + "' and 量 ='" + Convert.ToDecimal(rows[3]) + "'"); //若存在相同,即将其保存至delolddt内 for (var i = 0; i < row.Length; i++) { var newrow = delolddt.NewRow(); for (var j = 0; j < delolddt.Columns.Count; j++) { newrow[j] = row[i][j]; } delolddt.Rows.Add(newrow); } } //循环将delolddt中的‘ID’作为条件,并放到sourceolddt进行删除 //(注:要删除DataTable内的数据,应该采用倒序循环DataTable.Rows.因为正序删除时索引会发生变化.程式发生异常,很难预料后果.) for (var i = sourceolddt.Rows.Count - 1; i >= 0; i--) { var row = delolddt.Select("ID='" + sourceolddt.Rows[i][0] + "'"); if (row.Length > 0) { sourceolddt.Rows[i].Delete(); } } //当使用Delete()进行行删除时,需继续使用AcceptChanges()方法来提交修改 sourceolddt.AcceptChanges(); //最后将整结过来的sourceolddt添加至resultdt内(注:以新模板方式导出) foreach (DataRow rows in sourceolddt.Rows) { var newrow = resultdt.NewRow(); newrow[0] = rows[1]; //制造商 newrow[1] = rows[4]; //车型 newrow[2] = rows[6]; //涂层 newrow[3] = rows[3]; //颜色描述 newrow[4] = ""; //二维码 newrow[5] = ""; //内部色号 newrow[6] = rows[7]; //主配方色号(差异色) newrow[7] = ""; //颜色组别 newrow[8] = rows[2]; //标准色号 newrow[9] = ""; //RGBValue newrow[10] = rows[9]; //版本日期 newrow[11] = ""; //层 newrow[12] = "EW-" + rows[11]; //色母编码 newrow[13] = rows[12]; //色母名称 newrow[14] = rows[13]; //色母量(KG) newrow[15] = rows[14]; //累积量(KG) newrow[16] = rows[10]; //制作人 resultdt.Rows.Add(newrow); } } catch (Exception) { resultdt.Columns.Clear(); resultdt.Rows.Clear(); } return(resultdt); }