【ArcGIS Pro二次开发】(27):删除Excel表中指定列值为0的行

文章介绍了一个C#方法,用于删除Excel表格中特定列全部为0的行。方法从最后一行开始遍历,避免了删除行后索引变化的问题。通过传入列索引和起始行数作为参数,该函数能灵活处理不同情况。
摘要由CSDN通过智能技术生成

如题,要实现的功能描述比较绕口,如图如示:

我们在将汇总的面积填入准备好的Excel表模板后,某些行因为没有面积值(这里预先输入为0,方便计算),需要将行删除再进行输出。

更复杂一点,比如需要根据【现状面积】和【规划面积】2列一起判断,当2者都为0时,则删除当前行。

实现结果如下:

【茶园】行现状用地为0,但规划用地不为0,所以没有被删除。

方法及输入参数

        // 删除Excel表中的0值行【指定多个列】
        public static void Delete0Row(string excel_path, List<int> init_cols, int start_row = 1)
        {
            try
            {
                // 建立 Excel 应用程序对象
                Application excelApp = new Application();

                // 获取Excel文件名和表名
                List<string> files = DecomposeExcel(excel_path);
                string excel_name = files[0];
                string sheet_name = files[1];
                // 打开 Excel 文件
                Workbook workbook = excelApp.Workbooks.Open(excel_name);
                // 获取工作表
                Worksheet worksheet = workbook.Worksheets[sheet_name];

                // 打开Excel表格,从下往上进行判断
                for (int row = worksheet.UsedRange.Rows.Count; row >= start_row; row--)
                {
                    bool flag = true;   // 设定flag,是否都为0 
                    // 获取指定列的值
                    for (int i = 0; i < init_cols.Count; i++)
                    {
                        double in_value = double.Parse(worksheet.Cells[row, init_cols[i]].Value.ToString());
                        if (in_value != 0)
                        {
                            flag = false;         // 输入列中,只要有一个不为零,则不删除
                        }
                    }
                    // 如果全为0,则删除行
                    if (flag)
                    {
                        worksheet.Rows[row].Delete();
                    }
                }
                //  保存并关闭 Excel 文件和应用程序对象
                workbook.Close(true);
                excelApp.Quit();
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message + ee.StackTrace);
                throw;
            }
        }
// 方法调用
Delete0Row(exl_path, new List<int>() { 6, 8 }, 5);

参数说明:

【init_cols】是选择列的列表,【start_row】是考虑到一般都有表头,标题等,所以不从第1行开始计算起,而是指定从某1行起开始计算。

核心代码说明:

流程比较简单,打开Excel表格,找到指定的列,当所有列的值都为0时,则删除当前行。

这些内容在之前的文章中都有提到,不过这里有一个地方需要注意,因为流程中涉及到对行的删除,删除当前行后,后面的行会发生变化。比如,删除第5行,则第7行会变成第6行,在这个过程中,不断有行被删除,后面获取的当前会发生变化。

这个影响是很麻烦的,因为我们删除行:

worksheet.Rows[row].Delete();

就是通过获取当前行进行的,因此会产生错误。

所以这里采取了倒置的方式,就是从最后一行开始算起,从下往上删,完美的避免了以上问题,机智。

for (int row = worksheet.UsedRange.Rows.Count; row >= start_row; row--)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

规划GIS会

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

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

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

打赏作者

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

抵扣说明:

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

余额充值