public static Dictionary <string, FieldInfo> ReadYingShes(string YingSheFilePath, string ClassName) { Dictionary <string, FieldInfo> ExcelColNameYS = new Dictionary <string, FieldInfo>(); //string sql = string.Format("select * from [{0}]", ClassName); int SheetIndex = ExcelClass.FindSheetByName(YingSheFilePath, ClassName); if (SheetIndex == -1) { return(null); } DataTable pDataTable = ExcelClass.ReadExcelFile(YingSheFilePath, 0, 0, SheetIndex, true); foreach (DataRow pRow in pDataTable.Rows) { if (pRow[1].ToString().Trim() != string.Empty) { ExcelColNameYS.Add(pRow[0].ToString(), new FieldInfo() { ExcelName = pRow[1].ToString(), FieldName = pRow[0].ToString(), IsNeed = pRow[3].ToString().Equals("是"), FieldType = pRow[2].ToString() }); } } return(ExcelColNameYS); }
private void BtnOpenExcel_Click(object sender, EventArgs e) { OpenFileDialog pDialog = new OpenFileDialog(); pDialog.Filter = "Excel文件|*.xls;*.xlsx|所有文件(*.*)|*.*"; pDialog.Title = "选择入库文件"; if (pDialog.ShowDialog() == DialogResult.OK) { txbExcelPath.Text = pDialog.FileName; DataTable CurTable = ExcelClass.ReadExcelFile(pDialog.FileName, 0, 0, 0, true, 1); if (!CurTable.Columns.Contains("起点点号") || !CurTable.Columns.Contains("终点点号")) { MessageBox.Show("选择的表格不符合格式要求", "错误", MessageBoxButtons.OK, MessageBoxIcon.Stop); txbExcelPath.Clear(); } } }
private void PWork_DoWork(object sender, DoWorkEventArgs e) { //pProgressFrm.TopMost = true; pProgressFrm.ShowDialog(); WorkArgument pWorkArgument = e.Argument as WorkArgument; string ExcelPath = pWorkArgument.ExcelPath; string ExcelName = System.IO.Path.GetFileNameWithoutExtension(ExcelPath); //string ProjectName = pWorkArgument.ProjectName; string DwgPath = pWorkArgument.DwgSavePath; SysDBUnitiy.MDBPath = Path.GetDirectoryName(DwgPath) + string.Format("\\{0}.db", Path.GetFileNameWithoutExtension(DwgPath)); string TemplateDwg = SysDBUnitiy.RootDir + "\\Template\\template.dwg"; string TemplateMdb = SysDBUnitiy.RootDir + "\\Template\\Template.db"; AcadApplication AcadApp = (AcadApplication)System.Runtime.InteropServices.Marshal.GetActiveObject("AutoCAD.Application"); pWork.ReportProgress(0, "正在创建数据文件"); if (File.Exists(SysDBUnitiy.MDBPath)) { File.Delete(SysDBUnitiy.MDBPath); } if (!File.Exists(SysDBUnitiy.MDBPath)) { File.Copy(TemplateMdb, SysDBUnitiy.MDBPath, false); } if (File.Exists(DwgPath)) { try { File.Delete(DwgPath); } catch (System.Exception ex) { MessageBox.Show("删除旧dwg文件失败,请检查该文件是否被占用"); return; } } if (!File.Exists(DwgPath)) { File.Copy(TemplateDwg, DwgPath, false); } //List<TableConfig> LineTableName = new List<TableConfig>(); //List<TableConfig> PointTableName = new List<TableConfig>(); pWork.ReportProgress(0, "正在准备写入dwg文件数据"); Autodesk.AutoCAD.Interop.AcadDocument AcadDoc = AcadApp.Documents.Open(DwgPath); double MinX, MinY, MaxX, MaxY; //string[] MinPoint = System.Configuration.ConfigurationSettings.AppSettings["MinPoint"].Split(','); MinX = double.Parse(CIni.ReadINI("XYExtent", "MinX")); MinY = double.Parse(CIni.ReadINI("XYExtent", "MinY")); //string[] MaxPoint = System.Configuration.ConfigurationSettings.AppSettings["MaxPoint"].Split(','); MaxX = double.Parse(CIni.ReadINI("XYExtent", "MaxX")); MaxY = double.Parse(CIni.ReadINI("XYExtent", "MaxY")); pWork.ReportProgress(0, "正在读取表格数据"); DataTable PCTable = ExcelClass.ReadExcelFile(ExcelPath); DataTable CoordTable = ExcelClass.ReadExcelFile(pWorkArgument.CoordExcelpath); CoordTable.Columns[0].ColumnName = "ID"; //CoordTable.PrimaryKey = new DataColumn[] { CoordTable.Columns[0] }; DataRow FirstRow = CoordTable.Rows[0]; for (int j = 1; j < FirstRow.ItemArray.Length; j++) { string value = FirstRow.ItemArray[j].ToString(); double V_num = 0; if (double.TryParse(value, out V_num)) { if (V_num > MinX && V_num < MaxX) { CoordTable.Columns[j].ColumnName = "CO_X"; } else if (V_num > MinY && V_num < MaxY) { CoordTable.Columns[j].ColumnName = "CO_Y"; } else { CoordTable.Columns[j].ColumnName = "CO_Z"; } } } Dictionary <string, DataRow> CoordBHTable = new Dictionary <string, DataRow>(); foreach (DataRow pCoordRow in CoordTable.Rows) { string key = pCoordRow["ID"].ToString(); if (!CoordBHTable.ContainsKey(key)) { CoordBHTable.Add(key, pCoordRow); } } DataTable ErrorTable = PCTable.Clone(); if (!ErrorTable.Columns.Contains("错误消息")) { ErrorTable.Columns.Add("错误消息"); } #region 循环遍历表 //int SumCount = PCTable.Rows.Count; //int CurNum =0; DataTable PCTab2 = PCTable.Copy(); for (int i = 0; i < PCTable.Rows.Count; i++) { //CurNum++; DataRow pDataRow = PCTable.Rows[i]; try { pWork.ReportProgress(i * 100 / PCTable.Rows.Count, string.Format("正在导入第: {0}/{1}条", i + 1, PCTable.Rows.Count)); string ErrorMsg = string.Empty; string SPointID = GetValue(pDataRow, "起点点号"); if (string.IsNullOrEmpty(SPointID)) { ErrorMsg += "起点号不能为空;"; } IPipePoint SPoint = null; DataRow SPointRow = IsExistSURVEYID(SPointID); if (SPointRow == null) { if (!CoordBHTable.ContainsKey(SPointID)) { ErrorMsg += "起点对应的坐标不存在;"; } if (ErrorMsg != string.Empty) { goto a1; } //DataRow pCoordRow = CoordBHTable[SPointID]; SPoint = GetPipePoint(SPointID, pDataRow, CoordBHTable[SPointID]); SPoint.AddNew(); SPoint.DrawCADObject(AcadDoc); //CoordBHTable.ContainsKey(SPointID) CoordBHTable.Remove(SPointID); } else { //string ClassName = SPointRow["ClassName"].ToString(); //string ID = SPointRow["ID"].ToString(); SPoint = new PCPoint(); //string sql = string.Format("select * from Points where ID='{0}'" , ID); //DataTable pTable = SysDBUnitiy.OleDataBase.ExecuteQuery(sql).Tables[0]; //if (pTable.Rows.Count > 0) //{ SPoint.FillValueByRow(SPointRow); //} } string EPointID = GetValue(pDataRow, "终点点号"); if (EPointID == string.Empty) { goto a1; } IPipePoint EPoint = null; DataRow EPointRow = IsExistSURVEYID(EPointID); if (EPointRow == null) { EPointRow = FindRow(PCTable, EPointID, i + 1); if (EPointRow == null) { ErrorMsg += "终点对应的信息不存在;"; goto a1; } // DataRow[] ECoordRows = CoordTable.Select(string.Format("ID='{0}'", EPointID)); if (!CoordBHTable.ContainsKey(EPointID)) { ErrorMsg += "终点对应的坐标不存在;"; goto a1; } /* string EPointType = GetValue(EPointRow, "起点类型"); * if (EPointType == string.Empty) * { * ErrorMsg += "终点类型不能为空"; * } * string ClassName = GetTrueType(EPointType); * if (ClassName == string.Empty) * { * ErrorMsg += "终点类型无法识别"; * * } */ if (ErrorMsg != string.Empty) { goto a1; } EPoint = GetPipePoint(EPointID, EPointRow, CoordBHTable[EPointID]); EPoint.AddNew(); EPoint.DrawCADObject(AcadDoc); CoordBHTable.Remove(EPointID); } else { //string ClassName = EPointRow["ClassName"].ToString(); //string ID = EPointRow["ID"].ToString(); EPoint = new PCPoint(); //string sql = string.Format("select * from Points where ID='{0}'", ID); //DataTable pTable = SysDBUnitiy.OleDataBase.ExecuteQuery(sql).Tables[0]; //if (pTable.Rows.Count > 0) //{ EPoint.FillValueByRow(EPointRow); //} } string GJ = GetValue(pDataRow, "管径"); IPIPELine pPIPELine = new PIPELineClass(); if (!pPIPELine.isExistSURVEY_ID(SPointID, EPointID)) { pPIPELine.Width = GJ; pPIPELine.US_SURVEY_ID = SPointID; pPIPELine.DS_SURVEY_ID = EPointID; //pPIPELine.ID = pPIPELine.GetHead() + SPointID.Substring(2, 3) + pPIPELine.GetNextNO(); pPIPELine.ID = Guid.NewGuid().ToString("N"); pPIPELine.US_OBJECT_ID = SPoint.ID; pPIPELine.DS_OBJECT_ID = EPoint.ID; //pPIPELine.SYSTEM_TYPE = SPoint.SYSTEM_TYPE; double D_X = double.Parse(EPoint.X) - double.Parse(SPoint.X); double D_Y = double.Parse(EPoint.Y) - double.Parse(EPoint.Y); double Len = Math.Round(Math.Sqrt(D_X * D_X + D_Y * D_Y), 2); pPIPELine.Pipe_Length = Len.ToString(); //pPIPELine.US_POINT_INVERT_LEVEL = SPoint.INVERT_LEVEL; /* string US_NS = GetValue(pDataRow, "起点管口泥深"); * if (US_NS != string.Empty) * pPIPELine.US_INVERT_LEVEL = (double.Parse(SPoint.GROUND_LEVEL) - double.Parse(US_NS)/100).ToString("0.00"); * string DS_NS = GetValue(pDataRow, "终点管口泥深"); * if (DS_NS != string.Empty) * pPIPELine.DS_INVERT_LEVEL = (double.Parse(EPoint.GROUND_LEVEL) - double.Parse(DS_NS)/100).ToString("0.00"); */ pPIPELine.SEDIMENT_DEPTH = GetValue(pDataRow, "泥深"); pPIPELine.MATERIAL = GetValue(pDataRow, "材质"); pPIPELine.PRESSURE = GetValue(pDataRow, "管道形式"); pPIPELine.STATE = GetValue(pDataRow, "设施状态"); pPIPELine.ROAD_NAME = GetValue(pDataRow, "所在道路"); pPIPELine.Remark = GetValue(pDataRow, "线备注"); pPIPELine.WATER_LEVEL = GetValue(pDataRow, "泥深"); pPIPELine.WATER_QUALITY = GetValue(pDataRow, "水质"); pPIPELine.WATER_State = GetValue(pDataRow, "水体状态"); pPIPELine.Dirtcion = GetValue(pDataRow, "流向"); pPIPELine.AddNew(); pPIPELine.DrawCADObject(AcadDoc); } a1: if (ErrorMsg != string.Empty) { DataRow ErrorRow = ErrorTable.NewRow(); List <object> ItemList = new List <object>(); if (pDataRow.Table.Columns.Contains("错误消息")) { pDataRow["错误消息"] = ErrorMsg; ItemList.AddRange(pDataRow.ItemArray); } else { ItemList.AddRange(pDataRow.ItemArray); ItemList.Add(ErrorMsg); } ErrorRow.ItemArray = ItemList.ToArray(); ErrorTable.Rows.Add(ErrorRow); } //PCTable.Rows.RemoveAt(i); } catch (System.Exception ex) { DataRow ErrorRow = ErrorTable.NewRow(); List <object> ItemList = new List <object>(); if (pDataRow.Table.Columns.Contains("错误消息")) { pDataRow["错误消息"] = ex.Message; ItemList.AddRange(pDataRow.ItemArray); } else { ItemList.AddRange(pDataRow.ItemArray); ItemList.Add(ex.Message); } ErrorRow.ItemArray = ItemList.ToArray(); ErrorTable.Rows.Add(ErrorRow); } pWork.ReportProgress((i + 1) * 100 / PCTable.Rows.Count); } int n = 0; //pProgressFrm.SafeCallDisplayProgress(0); foreach (KeyValuePair <string, DataRow> CoordBH in CoordBHTable) { pWork.ReportProgress(n * 100 / CoordBHTable.Count, string.Format("正在导入第: {0}/{1}个多余点", n, CoordBHTable.Count)); n++; // pProgressFrm.SafeCallDisplayText(string.Format("正在导入第: {0}/{1}个多余点", n, CoordBHTable.Count)); IPCPoint pPCPoint = new PCPoint(); if (IsExistSURVEYID(CoordBH.Key) == null) { try { pPCPoint.ID = Guid.NewGuid().ToString("N"); pPCPoint.SURVEY_ID = CoordBH.Key; pPCPoint.X = CoordBH.Value["CO_X"].ToString(); pPCPoint.Y = CoordBH.Value["CO_Y"].ToString(); pPCPoint.GROUND_LEVEL = CoordBH.Value["CO_Z"].ToString(); pPCPoint.AddNew(); pPCPoint.DrawCADObject(AcadDoc); } catch (System.Exception ex) { } } pWork.ReportProgress(n * 100 / CoordBHTable.Count); // pProgressFrm.SafeCallDisplayProgress(n * 100 / CoordBHTable.Count); } //pProgressFrm.SafeCallCloseDialog(); MessageBox.Show(string.Format("总共导入{0}条管线数据,{3}个多余点,其中成功{1}条,失败{2}条。", PCTab2.Rows.Count, PCTab2.Rows.Count - ErrorTable.Rows.Count, ErrorTable.Rows.Count, CoordBHTable.Count ), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); if (ErrorTable.Rows.Count > 0) { string ReportXls = System.IO.Path.GetDirectoryName(pWorkArgument.DwgSavePath) + string.Format("\\未导入{0}.xls", DateTime.Now.ToString("MMddHHmm")); ExcelClass.ExpReport(ErrorTable, ReportXls); if (MessageBox.Show("已导出失败记录到输出目录,是否查看", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { System.Diagnostics.Process pExecuteEXE = new System.Diagnostics.Process(); pExecuteEXE.StartInfo.FileName = ReportXls; pExecuteEXE.Start(); } } #endregion }