using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using GThinking.N_MISPRO; using GThinking.N_MISPRO.Data; using GThinking.N_MODEL.Page; using GThinking.N_WORKFLOW; using GThinking.N_MODEL.Dialog; using GThinking.N_PUBLIC; using GThinking.N_MISPRO.Utility; using GThinking.N_CONTROL; using System.IO; using System.Data.OleDb; using System.Data.Common; using System.Collections.Generic; using System.Text.RegularExpressions; using GThinking.N_MISPROAS; using NPOI.HSSF.UserModel; using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; namespace GThinking.N_XLXSBJ { public partial class DRJGBYZZ1_AXJGZDR : SingleCardBase { protected void Page_Load(object sender, EventArgs e) { this.UMID = 100860017; this.UMName = "按型号规格电压等级标准调表价"; base.CurMaster = Master; this.PageHeight = 200; this.PageWidth = 480; Master.EnableAttachBtn = false; Master.EnableCancelBtn = false; Master.EnableCopyBtn = false; Master.EnableDeleteBtn = false; Master.EnableEditBtn = false; Master.EnableInsertBtn = false; Master.EnablePrintBtn = false; Master.EnableRefreshBtn = false; Master.EnableSaveBtn = false; fupdPost.FileSaveType = gtAsyncFileUpload.DFileSaveType.SaveToPath; fupdPost.Filter = "XLS,XLSX"; base.InitPage(); if (!IsPostBack) { txtJGBID.Value = PageParam.GetRTrimString("JGBID"); txtYZID.Value = PageParam.GetRTrimString("sYZID"); txtYZMC.Text = GetYZMC(txtYZID.Value.Trim()); } } #region 控件事件 protected void btnQD_Click(object sender, EventArgs e) { if (fupdPost.FilePath.Equals("")) { ShowMessage("请选择需要导入的文件!"); return; } if (txtYZID.Value.Trim().Equals("")) { ShowMessage("调价因子为空,请从正确入口打开!"); return; } TDatabase dberp = TContextDatabases.GetDatabase("DBERP"); TSQL sSQL = new TSQL(dberp); try { lblTitle.Text = "正在导入数据,请稍后..."; dberp.BeginTrans(); DataSet aDataExcel = new DataSet(); Mac.MacLog.TraceFormat("DR0 ReadAllSheets Start"); string sMessage = ""; aDataExcel = ReadAllSheets(fupdPost.FilePath, 0, true, ref sMessage); if (!sMessage.Trim().Equals("")) { throw new Exception("文件读取失败!具体原因:" + sMessage); } Mac.MacLog.TraceFormat("DR0.1 ReadAllSheets Done TablesCount={0}", aDataExcel.Tables.Count); ExcelColumnValid(aDataExcel); int iImportCount = InsertYZZ1(dberp, sSQL, aDataExcel); SaveExcelToServer(aDataExcel); dberp.CommitTrans(); string sMsg = "成功导入 " + iImportCount.ToString() + " 条数据!"; Mac.MacLog.TraceFormat("DR_SUCCESS: {0}", sMsg); lblTitle.Text = sMsg; ShowMessage(sMsg); //执行完毕后关闭当前页面 DialogOperationScript dos = new DialogOperationScript(this); dos.ClickOwnerButton(PageParam.GetRTrimString("btnRefresh1CID")); dos.CloseSelf(); dos.Execute(); } catch (Exception ex) { Mac.MacLog.TraceFormat("DR_ERR: {0}", ex.Message); lblTitle.Text = ""; dberp.RollbackTrans(); ShowMessage(ex.Message); } } protected void btnQX_Click(object sender, EventArgs e) { CloseWindow(); } #endregion #region 自定义事件 private string GetYZMC(string sYZID) { string sYZMC = ""; if (sYZID.Equals("")) return sYZMC; sYZMC = XLBJDUtils.GetYZXXByYZID(sYZID).XLXSTZYZ_YZMC; return sYZMC; } private void SaveExcelToServer(DataSet dsExcel) { if (dsExcel == null || dsExcel.Tables.Count < 2) return; string sUploadPath = HttpContext.Current.Server.MapPath("~/work/temp/外径盘具金额/"); if (!Directory.Exists(sUploadPath)) Directory.CreateDirectory(sUploadPath); string sTargetPath = Path.Combine(sUploadPath, "外径盘具金额.xlsx"); if (File.Exists(sTargetPath)) File.Delete(sTargetPath); DataSet dsSheet2 = new DataSet(); dsSheet2.Tables.Add(dsExcel.Tables[1].Copy()); string sError = ""; TExcelData.CreateExcel_NPOI(sTargetPath, dsSheet2, ref sError); if (!sError.Equals("")) throw new Exception("保存第二个sheet到服务器失败:" + sError); } private int InsertYZZ1(TDatabase dberp, TSQL sSQL, DataSet ds) { Mac.MacLog.TraceFormat("DR1.6 InsertYZZ1Entered"); //第二个sheet:外径->普通线盘金额、大芯线盘金额 Dictionary dicPTXP = new Dictionary(); Dictionary dicDXXP = new Dictionary(); Dictionary dicZXJM = new Dictionary(); DataTable dtSheet2 = ds.Tables[1]; Mac.MacLog.TraceFormat("DR1.7 Sheet2Rows={0}", dtSheet2.Rows.Count); for (int i = 0; i < dtSheet2.Rows.Count; i++) { Mac.MacLog.TraceFormat("DR1.8 Sheet2Row[{0}]", i); string sWJ = sGetCellText(dtSheet2.Rows[i], 0); if (sWJ.Equals("")) continue; double dPTXP = CMISproConvert.StrToFloat(sGetCellText(dtSheet2.Rows[i], 1), 0); double dDXXP = CMISproConvert.StrToFloat(sGetCellText(dtSheet2.Rows[i], 2), 0); if (!dicPTXP.ContainsKey(sWJ)) dicPTXP.Add(sWJ, dPTXP); if (!dicDXXP.ContainsKey(sWJ)) dicDXXP.Add(sWJ, dDXXP); } Mac.MacLog.TraceFormat("DR1.9 Sheet2Processed PTXP={0} DXXP={1}", dicPTXP.Count, dicDXXP.Count); Mac.MacLog.TraceFormat("DR2"); //矿物电缆基本型号 string[] arrBaseModels = new string[] { "BTLY", "BTTRZ", "BTTVZ", "BTTYRZ", "BTTYZ", "BTTZ", "RTTVZ", "RTTYZ", "RTTZ", "YTTW", "YTTWG", "YTTWV", "YTTWY", "YTTWZ", "BTTVQ", "BTTYQ" }; DataTable dtSheet1 = ds.Tables[0]; string sJGBID = txtJGBID.Value.Trim(); string sYZID = txtYZID.Value.Trim(); int iInsertCount = 0; //A|× B|* string sXLJGU007 = GetOption(102579000, "XLJGU007"); string sDefaultXLBZID = XLBJDUtils.GetDefaultXLBZID(); Dictionary dicDRMXBZ = new Dictionary(); dicDRMXBZ.Clear(); sSQL.Clear(); sSQL.Add("select XLBZ_XLBZID,XLBZ_XLBZLXMC from XLBZ where 1 = 1 "); DataSet dsXLBZ = dberp.OpenDataSet(sSQL); if (dsXLBZ.Tables[0].Rows.Count > 0) { for (int k = 0; k < dsXLBZ.Tables[0].Rows.Count; k++) { dicDRMXBZ.Add(dsXLBZ.Tables[0].Rows[k]["XLBZ_XLBZID"].ToString().Trim(), dsXLBZ.Tables[0].Rows[k]["XLBZ_XLBZLXMC"].ToString().Trim()); } } Mac.MacLog.TraceFormat("DR3"); for (int i = 0; i < dtSheet1.Rows.Count; i++) { string sXLXHID = sGetCellText(dtSheet1.Rows[i], 0); string sXLGGID = sGetCellText(dtSheet1.Rows[i], 1); string sXLBZID = sGetCellText(dtSheet1.Rows[i], 2); string sDYDJID = sGetCellText(dtSheet1.Rows[i], 3); string sWJ = sGetCellText(dtSheet1.Rows[i], 4); string sLB = sGetCellText(dtSheet1.Rows[i], 5); string sDW = sGetCellText(dtSheet1.Rows[i], 6); if (sXLXHID.Equals("")) { Mac.MacLog.TraceFormat("DR_SKIP 第{0}行型号为空", i + 2); continue; } if (sXLGGID.Equals("")) { Mac.MacLog.TraceFormat("DR_SKIP 第{0}行规格为空", i + 2); continue; } if (sDYDJID.Equals("")) { Mac.MacLog.TraceFormat("DR_SKIP 第{0}行电压等级为空", i + 2); continue; } if (sWJ.Equals("")) { Mac.MacLog.TraceFormat("DR_SKIP 第{0}行外径为空", i + 2); continue; } if (sXLJGU007.Equals("A")) { sXLGGID = sXLGGID.Replace("x", "X").Replace("X", "*").Replace("*", "×"); } else if (sXLJGU007.Equals("B")) { sXLGGID = sXLGGID.Replace("x", "X").Replace("X", "*").Replace("×", "*"); } sXLBZID = XLBJDUtils.GetBZXLZBZID(sXLBZID, sDefaultXLBZID, dicDRMXBZ); if (sXLBZID.Equals("")) sXLBZID = " "; //规则1:所有产品,包装要求按扎为单位的,均不考虑计算装盘数据 //if (sDW.Contains("扎")) // continue; //bool bIsCable = sLB.Contains("电缆"); //bool bIsWire = sLB.Contains("电线"); //bool bNeedCalc = false; //if (bIsCable) //{ // //规则3:所有归类于电缆产品的各型号规格的产品,均默认需计算装盘数据 // bNeedCalc = true; //} //else if (bIsWire) //{ // //规则2:归类于电线类产品,规格在16平方(含)及以下,按米为单位的,均不考虑计算装盘数据;25平方(含)规格以上的产品,则需要计算装盘数据 // if (sDW.Contains("米") || sDW.ToUpper().Contains("M")) // { // double dMaxMM = 0; // if (dicZXJM.ContainsKey(sXLGGID)) // dMaxMM=dicZXJM[sXLGGID]; // else // { // Dictionary dicXLGGB = XLBJDUtils.GetXXJGIDByXLGGID(sXLGGID, sXLXHID); // string fZXJM = dicXLGGB["ZXJM"]; // dMaxMM = CMISproConvert.StrToFloat(fZXJM); // dicZXJM[sXLGGID] = dMaxMM; // } // if (dMaxMM >= 25) // bNeedCalc = true; // } //} //if (!bNeedCalc) // continue; //规则4:基本型号及矿物电缆算大芯盘 bool bUseDXXP = false; string sUpperXLXHID = sXLXHID.ToUpper(); for (int j = 0; j < arrBaseModels.Length; j++) { if (sUpperXLXHID.Contains(arrBaseModels[j])) { bUseDXXP = true; break; } } double dAmount = 0; if (bUseDXXP) { if (!dicDXXP.ContainsKey(sWJ)) { Mac.MacLog.TraceFormat("DR_SKIP 第{0}行外径[{1}]在第二个sheet中未找到对应大芯线盘金额", i + 2, sWJ); continue; } dAmount = dicDXXP[sWJ]; } else { if (!dicPTXP.ContainsKey(sWJ)) { Mac.MacLog.TraceFormat("DR_SKIP 第{0}行外径[{1}]在第二个sheet中未找到对应普通线盘金额", i + 2, sWJ); continue; } dAmount = dicPTXP[sWJ]; } Mac.MacLog.TraceFormat("DR4"); if (!CMISproDataBase.ExistsRecord("DBERP", string.Format("select 1 from XLXSJGBYZZ1 where XLXSJGBYZZ1_JGBID='{0}' and XLXSJGBYZZ1_XLXHID='{1}' and XLXSJGBYZZ1_XLGGID='{2}' and XLXSJGBYZZ1_DYDJID='{3}' and XLXSJGBYZZ1_XLBZID='{4}' and XLXSJGBYZZ1_YZID='{5}'", sJGBID, sXLXHID, sXLGGID, sDYDJID, sXLBZID, sYZID))) { sSQL.Clear(); sSQL.Add("insert into XLXSJGBYZZ1(XLXSJGBYZZ1_JGBID,XLXSJGBYZZ1_XLXHID,XLXSJGBYZZ1_XLGGID,XLXSJGBYZZ1_DYDJID,XLXSJGBYZZ1_XLBZID,XLXSJGBYZZ1_YZID,XLXSJGBYZZ1_YZZ,XLXSJGBYZZ1_TJDH,XLXSJGBYZZ1_WHR,XLXSJGBYZZ1_WHRID,XLXSJGBYZZ1_WHSJ)"); sSQL.Add(" values(:XLXSJGBYZZ1_JGBID,:XLXSJGBYZZ1_XLXHID,:XLXSJGBYZZ1_XLGGID,:XLXSJGBYZZ1_DYDJID,:XLXSJGBYZZ1_XLBZID,:XLXSJGBYZZ1_YZID,:XLXSJGBYZZ1_YZZ,:XLXSJGBYZZ1_TJDH,:XLXSJGBYZZ1_WHR,:XLXSJGBYZZ1_WHRID,:XLXSJGBYZZ1_WHSJ)"); sSQL.ParamByName("XLXSJGBYZZ1_JGBID").Value = sJGBID; sSQL.ParamByName("XLXSJGBYZZ1_XLXHID").Value = sXLXHID; sSQL.ParamByName("XLXSJGBYZZ1_XLGGID").Value = sXLGGID; sSQL.ParamByName("XLXSJGBYZZ1_DYDJID").Value = sDYDJID; sSQL.ParamByName("XLXSJGBYZZ1_XLBZID").Value = sXLBZID; sSQL.ParamByName("XLXSJGBYZZ1_YZID").Value = sYZID; sSQL.ParamByName("XLXSJGBYZZ1_YZZ").Value = dAmount; sSQL.ParamByName("XLXSJGBYZZ1_TJDH").Value = " "; sSQL.ParamByName("XLXSJGBYZZ1_WHR").Value = tSession.UserName; sSQL.ParamByName("XLXSJGBYZZ1_WHRID").Value = tSession.UserId; sSQL.ParamByName("XLXSJGBYZZ1_WHSJ").Value = DateTime.Now; dberp.ExecSQL(sSQL); } else { sSQL.Clear(); sSQL.Add("update XLXSJGBYZZ1 set XLXSJGBYZZ1_YZZ=:XLXSJGBYZZ1_YZZ,XLXSJGBYZZ1_TJDH=:XLXSJGBYZZ1_TJDH,XLXSJGBYZZ1_WHR=:XLXSJGBYZZ1_WHR,XLXSJGBYZZ1_WHRID=:XLXSJGBYZZ1_WHRID,XLXSJGBYZZ1_WHSJ=:XLXSJGBYZZ1_WHSJ"); sSQL.Add(" where XLXSJGBYZZ1_JGBID=:XLXSJGBYZZ1_JGBID"); sSQL.Add(" and XLXSJGBYZZ1_XLXHID=:XLXSJGBYZZ1_XLXHID"); sSQL.Add(" and XLXSJGBYZZ1_XLGGID=:XLXSJGBYZZ1_XLGGID"); sSQL.Add(" and XLXSJGBYZZ1_DYDJID=:XLXSJGBYZZ1_DYDJID"); sSQL.Add(" and XLXSJGBYZZ1_XLBZID=:XLXSJGBYZZ1_XLBZID"); sSQL.Add(" and XLXSJGBYZZ1_YZID=:XLXSJGBYZZ1_YZID"); sSQL.ParamByName("XLXSJGBYZZ1_JGBID").Value = sJGBID; sSQL.ParamByName("XLXSJGBYZZ1_XLXHID").Value = sXLXHID; sSQL.ParamByName("XLXSJGBYZZ1_XLGGID").Value = sXLGGID; sSQL.ParamByName("XLXSJGBYZZ1_DYDJID").Value = sDYDJID; sSQL.ParamByName("XLXSJGBYZZ1_XLBZID").Value = sXLBZID; sSQL.ParamByName("XLXSJGBYZZ1_YZID").Value = sYZID; sSQL.ParamByName("XLXSJGBYZZ1_YZZ").Value = dAmount; sSQL.ParamByName("XLXSJGBYZZ1_TJDH").Value = " "; sSQL.ParamByName("XLXSJGBYZZ1_WHR").Value = tSession.UserName; sSQL.ParamByName("XLXSJGBYZZ1_WHRID").Value = tSession.UserId; sSQL.ParamByName("XLXSJGBYZZ1_WHSJ").Value = DateTime.Now; dberp.ExecSQL(sSQL); } iInsertCount++; } if (iInsertCount == 0) { Mac.MacLog.TraceFormat("DR_WARN 没有符合计算规则的数据可导入"); } return iInsertCount; } private double GetMaxSpecMM(string sXLGGID) { double dMax = 0; MatchCollection mc = Regex.Matches(sXLGGID, @"\d+(\.\d+)?"); for (int i = 0; i < mc.Count; i++) { double d = CMISproConvert.StrToFloat(mc[i].Value, 0); if (d > dMax) dMax = d; } return dMax; } private void ExcelColumnValid(DataSet ds) { Mac.MacLog.TraceFormat("DR1"); Mac.MacLog.TraceFormat("DR1.1 TablesCount={0}", ds.Tables.Count); if (ds.Tables.Count < 2) throw new Exception("导入文件必须包含两个sheet!"); Mac.MacLog.TraceFormat("DR1.2 Sheet1Columns={0} Sheet2Columns={1}", ds.Tables[0].Columns.Count, ds.Tables[1].Columns.Count); string[] arrSheet1Cols = new string[] { "型号", "规格", "标准", "电压等级", "外径", "类别", "单位" }; for (int i = 0; i < arrSheet1Cols.Length; i++) { Mac.MacLog.TraceFormat("DR1.3 Sheet1Col[{0}]={1}", i, ds.Tables[0].Columns[i].ColumnName); if (i == 4) // 第5列兼容"外径"或"线径" { string colName = ds.Tables[0].Columns[i].ColumnName.Trim(); if (!colName.Equals("外径") && !colName.Equals("线径")) throw new Exception("导入文件第一个sheet栏目格式不正确,第5列应为:外径或线径!"); } else { if (!ds.Tables[0].Columns[i].ColumnName.Trim().Equals(arrSheet1Cols[i])) throw new Exception("导入文件第一个sheet栏目格式不正确,依次为:型号、规格、标准、电压等级、外径/线径、类别、单位!"); } } string[] arrSheet2Cols = new string[] { "外径", "普通线盘金额", "大芯线盘金额" }; for (int i = 0; i < arrSheet2Cols.Length; i++) { Mac.MacLog.TraceFormat("DR1.4 Sheet2Col[{0}]={1}", i, ds.Tables[1].Columns[i].ColumnName); if (i == 0) // 第1列兼容"外径"或"线径" { string colName = ds.Tables[1].Columns[i].ColumnName.Trim(); if (!colName.Equals("外径") && !colName.Equals("线径")) throw new Exception("导入文件第二个sheet栏目格式不正确,第1列应为:外径或线径!"); } else { if (!ds.Tables[1].Columns[i].ColumnName.Trim().Equals(arrSheet2Cols[i])) throw new Exception("导入文件第二个sheet栏目格式不正确,依次为:外径/线径、普通线盘金额、大芯线盘金额!"); } } Mac.MacLog.TraceFormat("DR1.5 ExcelColumnValidDone"); } private void ReadWJ(string sPath, ref DataSet aDataExcel) { string sMessage = ""; aDataExcel = ReadAllSheets(sPath.Trim(), 0, true, ref sMessage); if (!sMessage.Trim().Equals("")) { throw new Exception("文件读取失败!具体原因:" + sMessage); } } private DataSet ReadAllSheets(string filePath, int fromRowIndex, bool hasHeaderRow, ref string errorMessage) { try { DataSet ds = new DataSet(); string ext = System.IO.Path.GetExtension(filePath).ToLowerInvariant(); IWorkbook wk = null; using (FileStream fs = File.OpenRead(filePath)) { if (ext == ".xlsx") wk = new XSSFWorkbook(fs); else wk = new HSSFWorkbook(fs); } for (int k = 0; k < wk.NumberOfSheets; k++) { ISheet sheet = wk.GetSheetAt(k); if (sheet == null) continue; string SheetName = sheet.SheetName; if (ds.Tables.Contains(SheetName)) continue; else ds.Tables.Add(SheetName); int minCellNum = -1;//最小有效列数 int maxCellNum = -1;//最大有效列数 for (int i = sheet.FirstRowNum; i <= sheet.LastRowNum; i++) { IRow iRow = sheet.GetRow(i); if (iRow != null && iRow.Cells.Count > 0) { if (minCellNum == -1) minCellNum = iRow.FirstCellNum; else { if (iRow.FirstCellNum < minCellNum) minCellNum = iRow.FirstCellNum; } if (maxCellNum == -1) maxCellNum = iRow.LastCellNum; else { if (iRow.LastCellNum > maxCellNum) maxCellNum = iRow.LastCellNum; } } } IRow headerRow = sheet.GetRow(fromRowIndex); //添加列 for (int i = minCellNum; i < maxCellNum; i++) { if (i < headerRow.FirstCellNum || i >= headerRow.LastCellNum) { DataColumn column = new DataColumn("F" + Convert.ToString(i + 1)); ds.Tables[SheetName].Columns.Add(column); } else { if (hasHeaderRow)//第一行为标题行 { DataColumn column = new DataColumn(headerRow.GetCell(i) == null ? " " : headerRow.GetCell(i).StringCellValue); ds.Tables[SheetName].Columns.Add(column); } else { DataColumn column = new DataColumn("F" + Convert.ToString(i + 1)); ds.Tables[SheetName].Columns.Add(column); } } } //添加行 int iFirstLine = fromRowIndex; if (hasHeaderRow) iFirstLine = fromRowIndex + 1; for (int i = iFirstLine; i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); DataRow dataRow = ds.Tables[SheetName].NewRow(); if (row != null && row.Cells.Count > 0) { for (int j = row.FirstCellNum; j < row.LastCellNum; j++) { if (row.GetCell(j) != null) dataRow[j] = TExcelData.GetCellValue(row.GetCell(j)); } } ds.Tables[SheetName].Rows.Add(dataRow); } } return ds; } catch (Exception ex) { errorMessage = ex.Message; return null; } } private string sGetCellText(DataRow Row, int ColumnIndex) { return Row[ColumnIndex].ToString().Trim().Replace("\r\n", "").Replace("\n", ""); } #endregion } }