目录
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