[C#] [ArcGIS] [Engine] NPOI 实现将属性表导出为Excel文档(提供插件链接)

目录

1.Intro

2.Details

3.Environment

4.Source

(1) 将要素类存储为DataTable

(2) 生成Excel文档

5.Conclusion


1.Intro

偶尔翻到了去年上半年写的项目,觉得这个方法不错,拿出来共享一下。为了便于属性提取,写了个导出成Excel的函数,用到了NPOI控件的方法,具体实现很简单,先获取要导出属性表的要素类,然后将要素类的属性表转换为DataTable,再导出就方便很多了。

2.Details

首先将要素类的属性表转化为DataTable类型的数据存储,这里使用了DevExpress的GridControl控件进行数据源关联,

// dataTable为要素类属性表转化的DataTable类型的对象
this.gridControl.DataSource = dataTable;

然后就可以显示属性表,比微软自带的DataGridView方便很多,功能也强大很多,同时可以在属性表中自定义右键事件,能够删除列和行(不会对原始的属性数据造成修改),从而便捷的定义要导出的数据。注意,在绑定数据源之后,由于GridControl的数据源是和DataTable对象双向关联的,所以对任何一个造成修改,都会影响另一个。

导出效果。

3.Environment

Environment:Windows 7及以上

Language:C#

IDE:Visual Studio 2012

SDK:ArcGIS Engine 10.2

4.Source

(1) 将要素类存储为DataTable

        /// <summary>
        /// 获取要素属性表
        /// </summary>
        /// <param name="pFeatureClass">要素类对象</param>
        /// <returns>返回DataTable对象</returns>
        public static DataTable Get_AttributesTable(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;
        }

 

(2) 生成Excel文档

        /// <summary>
        /// 生成Excel文件
        /// </summary>
        /// <param name="dataTable">数据表对象</param>
        /// <param name="filePath">输出路径</param>
        private 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);
            fileStream.Close();
        }

5.Conclusion

NPOI 2.0.1.0 破解版

百度网盘链接:https://pan.baidu.com/s/104FAoGPGjoYSFFXm57fzwg

提取码:7hry

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dr_Asada

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值