【ArcGIS Pro二次开发】(56):界址点导出Excel

news2025/1/11 2:36:58

界址点成果表是地籍测绘中的一种表格,用于记录地块的界址点坐标和相关属性信息。

这个工具的目的就是为了将地块要素导出为界址点成果表。


一、要实现的功能

如上图所示,在【数据处理】组—【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文件直接安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/835946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

话费充值系统源码话费直充快充慢充系统源码

话费充值系统/话费直充/快充慢充系统/话费直充系统

seaborn绘制热力图

目录 1、普通绘制热力图 2、坐标轴标签太多&#xff0c;自定义标签显示 3、不显示热图的网格 1、普通绘制热力图 # -*- coding:utf-8 _*- import numpy as np import seaborn as sns import matplotlib.pyplot as plt# 创建数据 data np.random.random((7,12)) # 计算相关…

Shell脚本学习-循环的控制命令

break continue exit对比&#xff1a; 示例1&#xff1a;break命令跳出整个循环。 [rootabc scripts]# cat break1.sh #!/bin/bashfor((i0;i<5;i)) doif [ $i -eq 3 ]thenbreakfiecho $i done echo "ok"[rootabc scripts]# sh break1.sh 0 1 2 ok可以看到i等于3及…

NetMizer 日志管理未授权访问+FTP登录

漏洞描述 北京灵州网络技术有限公司NetMizer日志管理系统存在目录遍历漏洞&#xff0c;由于 /data 控制不严格&#xff0c;攻击者可利用该漏洞获取敏感信息。 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#…

Visual Studio Code中对打开的脚本格式统一

什么是Language Server Protocol (LSP)? Language Server Protocol&#xff08;语言服务器协议&#xff0c;简称LSP&#xff09;是微软在2016年提出的一套统一的通讯协议方案。LSP定义了一套编辑器或者IDE与语言服务器&#xff08;Language Server&#xff09;之间使用的协议&…

openlayers渲染rgb三波段cog时达到类似rgba的效果(去掉黑底)

图是arcgis渲染成rgb的&#xff0c;由于没有透明度波段&#xff0c;底下是黑的。 为了能在前端显示透明效果&#xff0c;之前是用python处理数据&#xff0c;给它加个透明度波段 后来研究了一下ol的样式表达式&#xff0c;可以直接在前端去掉黑底 样式设置代码如下 const s…

Vue读取本地静态.md并侧边栏导航跳转、展示.md文件

vue markdown 侧边栏导航跳转 类似锚点跳转 - 灰信网&#xff08;软件开发博客聚合&#xff09; Vue使用mavon-editor插件解析markdown编辑预览_onpine的博客-CSDN博客 vue组件直接读取.md文档展示_vue项目中读取readme文件_小蒜瓣的博客-CSDN博客vue中使用mavonEditor(markd…

华秋亮相2023世界汽车制造技术暨智能装备博览会,推动汽车产业快速发展

洞悉全球汽车产业格局&#xff0c;前瞻业界未来趋势。2023年7月27日-30日&#xff0c;时隔三年&#xff0c;重聚武汉国际博览中心&#xff0c;2023世界汽车制造技术暨智能装备博览会盛大开幕。深耕汽车行业多年的世界汽车制造技术暨智能装备博览会&#xff0c;掀起行业热点新高…

如何获取最新的底图边线数据(高德)

由于近期的大屏项目需要地图的边界线的数据&#xff0c;找了很多方式&#xff0c;都有局限性&#xff0c;就是不能保证是最新的&#xff0c;所以使用高德地图提供的边线数据&#xff0c;那就肯定是最新的了&#xff0c;之前仔细看文档&#xff0c;现在仔细看了&#xff0c;才发…

# 关于Linux下的parted分区工具显示起始点为1049kB的问题解释

关于Linux下的parted分区工具显示起始点为1049kB的问题解释 文章目录 关于Linux下的parted分区工具显示起始点为1049kB的问题解释1 问题展示&#xff1a;2 原因3 修改为KiB方式显示4 最后 1 问题展示&#xff1a; kevinTM1701-b38cbc23:~$ sudo parted /dev/nvme1n1 GNU Part…

【Java Web基础】mvn命令、Maven的安装与配置

本文极大程度上来自Maven安装(超详解)&#xff0c;但是担心安的过程中遇到什么不一样的问题&#xff0c;顺便加深印象&#xff0c;所以还是打算自己弄一篇。 目录 第一步&#xff1a;Download Maven第二步&#xff1a;解压与安装2.1 解压2.2 安装 第一步&#xff1a;Download …

这么好用的ai绘画软件,你不会还不知道吧?

AI绘画成为了我最近热衷的一项活动。在使用AI绘画过程中&#xff0c;我得到了许许多多美妙的图片。 虽然网上有很多AI绘画软件可以让我们选择&#xff0c;但其中的大多数软件需要收费&#xff0c;而且生成的图片质量良莠不齐&#xff0c;我之前就是因为随便乱用AI绘画软件&…

表单控件拖拽,简单又灵活,办公效率高!

当前&#xff0c;很多企业的业务量在不断攀升中&#xff0c;采用传统的办公模式是无法提高办公协作效率的。低代码技术平台的应用是当前的潮流&#xff0c;既简单又灵活&#xff0c;维护也便利&#xff0c;深得客户心声。在线表单控件拖拽是其中一个重要的功能&#xff0c;能提…

(小球游戏王子闯闸门解题思路和源码)CSDN竞赛第68期编程题解+参赛感悟

2023年8月1日中午&#xff0c;正在排队等着购买午饭&#xff0c;手机弹出一条推送“CSDN比赛… …”&#xff0c;心中一亮&#xff0c;参加&#xff01; 2023年8月2日18&#xff1a;50&#xff0c;带着空空的肚子&#xff0c;坐在电脑前&#xff0c;等待开赛。&#xff08;为什…

07_Vue生命周期

Vue3生命周期 配置项的方式写Vue3生命周期 组合式API的方式写生命周期&#xff1a;写在setup里 如果同时用两种方式写生命周期钩子函数&#xff0c;组合式API里边的生命周期要比用配置项写的快一点。 注意&#xff1a;一般用一种方式即可。

人工智能生成内容扑面来袭 低质量内容充斥网络?

自从去年年底ChatGPT火爆上市以来&#xff0c;大批AI生成内容扑面来袭&#xff0c;文本、图片甚至视频都可以在数秒之内由人工智能模型自动生成。AI虽然智能&#xff0c;但它创造的内容也会有错误&#xff0c;而且这些错误很难被发现&#xff0c;它生成的误导信息非常“狡猾”&…

公文内容,可以采用图表、图示等辅助工具来展示信息

在处理复杂的公文内容时&#xff0c;可以采用图表、图示等辅助工具来展示信息&#xff0c;以增强表达效果&#xff0c;提高公文的可读性和理解性。 具体来说&#xff0c;可以采用以下几种方式来展示信息&#xff1a; 1.图表&#xff1a;使用图表可以将复杂的数据和信息以图表形…

Java并发系列之五:ReentranLock

首先尝试用一句话对ReeentrantLock进行概括&#xff1a; ReentrantLock基于AQS&#xff0c;它实现了公平锁和非公平锁&#xff0c;在开发中可以用它对共享资源进行同步。此外&#xff0c;和synchronized一样&#xff0c;ReentrantLock支持可重入&#xff0c;但ReentrantLock在调…

通话降噪算法在手机和IOT设备上的应用和挑战

随着电子产品的升级换代&#xff0c;用户对通话质量的要求也越来越高。通话降噪算法对通话质量起到了关键核心的作用。计算资源的提升使得深度学习模型在便携式的低功耗芯片上面跑起来了&#xff0c;器件成本降低让IoT设备开始使用骨导传感器&#xff0c;&#xff0c;那怎么样才…

提升制造业智能化水平——免费MES系统的领航者

随着工业4.0的持续推进和数字化转型的浪潮涌现&#xff0c;制造业正面临着前所未有的机遇与挑战。在这个数字化时代&#xff0c;企业需要更高效、智能、灵活地管理生产流程&#xff0c;以应对日益激烈的市场竞争。而制造执行系统&#xff08;MES&#xff09;无疑成为了实现这一…