using Autodesk.Revit.DB; using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Windows.Forms; using OfficeOpenXml; using System.IO; using System.Linq; namespace uBIM_EarthTools { class ExcelHelper { /// /// 读取地质数据 /// 原数据单位为M,转换为MM /// /// 文件路径 /// public static List GetDataFromXls(string filePath) { List boreholeList = new List(); Microsoft.Office.Interop.Excel.Workbook wb = null; Microsoft.Office.Interop.Excel.Worksheet ws = null; object missing = System.Reflection.Missing.Value; Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//lauch excel application excel.DisplayAlerts = false; if (excel != null) { excel.Visible = false; excel.UserControl = true;// 以只读的形式打开EXCEL文件 wb = excel.Workbooks.Open(filePath, missing, true, missing, missing, missing, missing, missing, missing, true, missing, missing, missing, missing, missing); ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.Item[1]; Dictionary typeList = new Dictionary(); for (int i = 1; i < ws.UsedRange.Rows.Count + 1; i++) { typeList.Add(ws.Cells[i, 1].Text, ws.Cells[i, 2].Text); } ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.Item[2]; //取得总记录行数(包括标题列) int rowsint = ws.UsedRange.Rows.Count; //得到行数 //int rowsint = begin_row + 2*10; int columnsint = ws.UsedRange.Columns.Count;//得到列数 for (int i = 1; i <= rowsint; i += 2) { Borehole borehole = new Borehole(); borehole.Name = ws.Cells[i, 1].Text; double x = double.Parse(ws.Cells[i, 2].Text) * 1000 / 304.8; double y = double.Parse(ws.Cells[i, 3].Text) * 1000 / 304.8; for (int j = 4; j <= columnsint; j++) { if (null == ws.Cells[i + 1, j].Text || ws.Cells[i + 1, j].Text == "") break; else { string type = string.Empty; try { type = "地质" + ws.Cells[i, j].Text + "-" + typeList[ws.Cells[i, j].Text] + "层"; } catch (Exception e) { MessageBox.Show(i.ToString() + "," + j.ToString()); throw; } double z = double.Parse(ws.Cells[i + 1, j].Text) * 1000 / 304.8; XYZ xyz = new XYZ(x, y, z); GeologyLayer geologyLayer = new GeologyLayer(type, xyz); borehole.ValueList.Add(geologyLayer); } } boreholeList.Add(borehole); } } KillProcess(excel); return boreholeList; } public static List GetDataFromExcel(string filePath) { List boreholeList = new List(); using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (ExcelPackage excelPackage = new ExcelPackage(fs)) { Dictionary typeList = GetGeologyType(filePath); ExcelWorksheet excelWorksheet = excelPackage.Workbook.Worksheets[2]; int endRowNumber = excelWorksheet.Dimension.End.Row; int endColumn = excelWorksheet.Dimension.End.Column; for (int i = 1; i <= endRowNumber; i += 2) { Borehole borehole = new Borehole(); borehole.Name = excelWorksheet.Cells[i, 1].Text; double x = double.Parse(excelWorksheet.Cells[i, 2].Text) * 1000 / 304.8; double y = double.Parse(excelWorksheet.Cells[i, 3].Text) * 1000 / 304.8; for (int j = 4; j <= endColumn; j++) { if (string.IsNullOrEmpty(excelWorksheet.Cells[i, j].Text) || string.IsNullOrEmpty(excelWorksheet.Cells[i + 1, j].Text)) { break; } else { string type = string.Empty; try { type = "地质" + excelWorksheet.Cells[i, j].Text + "-" + typeList[excelWorksheet.Cells[i, j].Text] + "层"; } catch (Exception e) { MessageBox.Show(i.ToString() + "," + j.ToString() + ":" + excelWorksheet.Cells[i, j].Text); throw; } double z = double.Parse(excelWorksheet.Cells[i + 1, j].Text) * 1000 / 304.8; z = z - 7.8 * 1000 / 304.8;//临时7.8m等于正负0 XYZ xyz = new XYZ(x, y, z); GeologyLayer geologyLayer = new GeologyLayer(type, xyz); borehole.ValueList.Add(geologyLayer); } } boreholeList.Add(borehole); } } } return boreholeList; } public static Dictionary GetGeologyType(string filePath) { Dictionary typeList = new Dictionary(); using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (ExcelPackage excelPackage = new ExcelPackage(fs)) { ExcelWorksheet excelWorksheet = excelPackage.Workbook.Worksheets[1]; int endRowNumber = excelWorksheet.Dimension.End.Row; int endColumn = excelWorksheet.Dimension.End.Column; for (int i = 1; i <= endRowNumber; i++) { typeList.Add(excelWorksheet.Cells[i, 1].Text, excelWorksheet.Cells[i, 2].Text); } } } return typeList; } #region 结束excel进程 [DllImport("User32.dll", CharSet = CharSet.Auto)] private static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); private static void KillProcess(Microsoft.Office.Interop.Excel.Application excel) { IntPtr t = new IntPtr(excel.Hwnd); int k = 0; GetWindowThreadProcessId(t, out k); System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); p.Kill(); } #endregion } }