1、前言
本文介绍ArcEngine
中将shp
文件属性表导出为Excel
的方法。由于微软自带的Office
组件效率太低,因此导出Excel
的相关操作借助NPOI
实现。
2、导出Excel
代码如下:
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using System;
using System.Data;
using System.Windows.Forms;
namespace App
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
/// <summary>
/// 读取属性表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Click(object sender, EventArgs e)
{
IFeatureClass pFeatureClass = GetFeatureClass(@"C:\Users\DSF\Desktop\data\world30.shp");
DataTable dataTable = GetAttributesTable(pFeatureClass);
ExportExcel(dataTable, @"C:\Users\DSF\Desktop\test.xlsx");
}
/// <summary>
/// 获取要素类
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
private 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 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 fieldCount = pFields.FieldCount;
// 写入字段名
DataTable dataTable = new DataTable();
for (int i = 0; i < fieldCount; 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 < fieldCount; 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 void ExportExcel(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());
}
}
// 写入Excel文件
using (System.IO.FileStream fileStream = new System.IO.FileStream(filePath, System.IO.FileMode.Create, System.IO.FileAccess.Write))
{
workbook.Write(fileStream);
workbook.Close();
}
}
}
}
运行结果如下图所示:导出31448
条要素属性耗时大约3.3s
。
3、结语
NPOI
这类无需客户端安装Office
的第三方组件更适合实际开发业务。