1. 程式人生 > >ArcEngine匯出shp屬性表至Excel

ArcEngine匯出shp屬性表至Excel

開發環境:VS2013 + NPOI + ArcEngine 10.4
鑑於VS自帶的Office匯出Excel速度太慢,因此採用NPOI實現~(NPOI真TM快!!!)

/// <summary>
        /// 獲取要素類
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        private static IFeatureClass GetFeatureClass(string
filePath) { IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory(); IWorkspaceFactoryLockControl pWorkspaceFactoryLockControl = pWorkspaceFactory as IWorkspaceFactoryLockControl; if (pWorkspaceFactoryLockControl.SchemaLockingEnabled) { pWorkspaceFactoryLockControl.DisableSchemaLocking(); } IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(filePath), 0
); IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace; IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(System.IO.Path.GetFileName(filePath)); return pFeatureClass; } /// <summary> /// 獲取要素屬性表 /// </summary>
/// <param name="pFeatureClass"></param> /// <returns></returns> private static DataTable GetAttributesTable(IFeatureClass pFeatureClass) { string geometryType = string.Empty; if (pFeatureClass.ShapeType == esriGeometryType.esriGeometryPoint) { geometryType = "點"; } if (pFeatureClass.ShapeType == esriGeometryType.esriGeometryMultipoint) { geometryType = "點集"; } if (pFeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline) { geometryType = "折線"; } if (pFeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon) { geometryType = "面"; } // 欄位集合 IFields pFields = pFeatureClass.Fields; int fieldsCount = pFields.FieldCount; // 寫入欄位名 DataTable dataTable = new DataTable(); for (int i = 0; i < fieldsCount; i++) { dataTable.Columns.Add(pFields.get_Field(i).Name); } // 要素遊標 IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, true); IFeature pFeature = pFeatureCursor.NextFeature(); if (pFeature == null) { return dataTable; } // 獲取MZ值 IMAware pMAware = pFeature.Shape as IMAware; IZAware pZAware = pFeature.Shape as IZAware; if (pMAware.MAware) { geometryType += " M"; } if (pZAware.ZAware) { geometryType += "Z"; } // 寫入欄位值 while (pFeature != null) { DataRow dataRow = dataTable.NewRow(); for (int i = 0; i < fieldsCount; i++) { if (pFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry) { dataRow[i] = geometryType; } else { dataRow[i] = pFeature.get_Value(i).ToString(); } } dataTable.Rows.Add(dataRow); pFeature = pFeatureCursor.NextFeature(); } // 釋放遊標 System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor); return dataTable; } /// <summary> /// 生成Excel檔案 /// </summary> /// <param name="dataTable"></param> /// <param name="filePath"></param> private static void CreateExcelFile(DataTable dataTable, string filePath) { NPOI.SS.UserModel.IWorkbook workbook = null; if (System.IO.Path.GetExtension(filePath) == ".xls") { workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(); } else { workbook = new NPOI.XSSF.UserModel.XSSFWorkbook(); } // 建立行 NPOI.SS.UserModel.ISheet sheet = workbook.CreateSheet("屬性表"); NPOI.SS.UserModel.IRow row = sheet.CreateRow(0); NPOI.SS.UserModel.ICell cell = null; // 寫入列名 int columnCount = dataTable.Columns.Count; for (int i = 0; i < columnCount; i++) { cell = row.CreateCell(i); cell.SetCellValue(dataTable.Columns[i].ColumnName); } // 寫入列值 int rowCount = dataTable.Rows.Count; for (int i = 0; i < rowCount; i++) { row = sheet.CreateRow(i + 1); for (int j = 0; j < columnCount; j++) { cell = row.CreateCell(j); cell.SetCellValue(dataTable.Rows[i][j].ToString()); } } // 寫入檔案 System.IO.FileStream fileStream = new System.IO.FileStream(filePath, System.IO.FileMode.Create); workbook.Write(fileStream); workbook.Close(); fileStream.Close(); } /// <summary> /// 建立Excel /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnCreateExcelFile_Click(object sender, EventArgs e) { IFeatureClass pFeatureClass = GetFeatureClass(@"C:\Users\DSF\Desktop\data\ZD.shp"); DataTable dataTable = GetAttributesTable(pFeatureClass); CreateExcelFile(dataTable, @"C:\Users\DSF\Desktop\test.xls"); }

執行結果:匯出31448條要素屬性耗時大約3.3s
這裡寫圖片描述