界址点成果表是地籍测绘中的一种表格,用于记录地块的界址点坐标和相关属性信息。
这个工具的目的就是为了将地块要素导出为界址点成果表。
一、要实现的功能
如上图所示,在【数据处理】组—【Excel相关】面板下,点击【界址点导出Excel】工具。
在弹出的工具框中,分别输入参数:
1、输入地块要素图层。
2、输入名称字段。这里的字段值是为了区分地块,以名称字段值作为标识,1个要素生成1个Excel表格。
3、导出Excel表格所在的文件夹。将导出的多个Excel表格放在文件夹里。
生成结果如下:
Excel内容如下:
目前工具只考虑到简单的面要素,多部件、带空洞的要素还不支持,后续工具继续更新在共享链接里。
二、实现流程
核心代码直接放上。
流程虽然不短,但都是一些基础操作,注释里已经说明,没有什么特别麻烦的地方,就不一一细说了。
其中一些对Excel表格的插入行,合并格等操作是基于Excel模板文件的必要操作,没有什么特别的意思。Excel模板文件也会一块放在共享链接里。
// 遍历面要素类中的所有要素
using (var cursor = featurelayer.Search())
{
while (cursor.MoveNext())
{
using (var feature = cursor.Current as Feature)
{
int rowIndex = 9; // 起始行
int pointIndex = 1; // 起始点序号
// 获取ID和名称
string oid = feature["OBJECTID"].ToString();
string feature_name = feature[in_field].ToString();
// 复制界址点Excel表
string excel_path = excel_folder + @$"\{oid} - {feature_name}界址点表.xlsx";
ToolManager.CopyResourceFile(@"CCTool.Data.Excel.【模板】界址点表.xlsx", excel_path);
// 建立 Excel 应用程序对象
Application excelApp = new Application();
// 打开 Excel 文件
Workbook workbook = excelApp.Workbooks.Open(excel_path);
// 获取工作表
Worksheet worksheet = workbook.Worksheets["Sheet1"];
worksheet.Application.DisplayAlerts = false; // 禁用警告提示
// 获取要素的几何
var geometry = feature.GetShape() as ArcGIS.Core.Geometry.Polygon;
if (geometry != null)
{
// 计算多边形的面积,并写入
double polygonArea = Math.Round(Math.Abs(geometry.Area)/10000, 3);
string areaStr = worksheet.Cells[5, 1].value.ToString();
worksheet.Cells[5, 1] = areaStr.Replace("ZDMJ", polygonArea.ToString());
// 获取面要素的所有折点(顶点)
var vertices = geometry.Points;
// 输出折点的XY值和距离到Excel表
double prevX = double.NaN;
double prevY = double.NaN;
foreach (var vertex in vertices)
{
// 插入新行
if (rowIndex > 13)
{
Range copyRange = worksheet.Range["A13:E14"]; // 选择要复制的单元格范围
copyRange.Copy(); // 复制单元格范围到剪贴板
Range pasteRange = worksheet.Range[$"A{rowIndex}"]; // 选择要粘贴的单元格
// 将剪贴板中的内容粘贴到指定单元格
pasteRange.PasteSpecial(XlPasteType.xlPasteAll, XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);
}
// 写入序号和点号
worksheet.Cells[rowIndex, 1] = pointIndex.ToString();
worksheet.Cells[rowIndex, 2] = $"J{pointIndex}";
double x = vertex.X;
double y = vertex.Y;
// 写入折点的XY值
worksheet.Cells[rowIndex, 3] = x;
worksheet.Cells[rowIndex, 4] = y;
// 计算当前点与上一个点的距离
if (!double.IsNaN(prevX) && !double.IsNaN(prevY))
{
double distance = Math.Sqrt(Math.Pow(x - prevX, 2) + Math.Pow(y - prevY, 2));
worksheet.Cells[rowIndex - 1, 5] = distance;
}
// 合并距离单元格
if (rowIndex > 9)
{
Range mergeRange = worksheet.Range[$"E{rowIndex - 1}:E{rowIndex}"]; // 获取要合并的单元格范围
mergeRange.Merge(); // 合并单元格
// 设置文字居中
mergeRange.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
mergeRange.VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
}
prevX = x;
prevY = y;
rowIndex += 2;
pointIndex++;
}
}
// 整理表格
for (int row = 9; row <= worksheet.UsedRange.Rows.Count; row++)
{
worksheet.Rows[row].RowHeight = 7.5; // 设置行高
if (row == worksheet.UsedRange.Rows.Count)
{
Range rangeEnd = worksheet.Range[$"E{row}"];
//worksheet.Cells[row, 5] = "";
rangeEnd.Value = ""; // 清除空距离值
rangeEnd.Borders.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbBlack; // 设置边框
}
}
// 保存并关闭 Excel 文件和应用程序对象
workbook.Close(true);
excelApp.Quit();
}
}
}
三、工具文件分享
我把工具都集合成工具箱,不再单独放单个工具,可以到这里下载完整工具箱,会不断更新:
【ArcGIS Pro二次开发】:CC工具箱https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。