首页 > 其他分享 >Excel VSTO 查询重复项

Excel VSTO 查询重复项

时间:2023-10-26 10:59:55浏览次数:36  
标签:Excel 查询 cell range foreach var null VSTO

一、需求描述:EXCEL原有的重复项识别功能,在识别身份证号码上存在识别错误。非重复项也识别为重复项。

 

二、编写Excel VSTO外接程序

1.创建新项目-Excel VSTO 外接程序,项目名:Dedupe

 

 

2.右键项目-添加-新建项-Office/SharePoint-功能区-添加

 

 

3.添加功能按钮

 

4编写功能代码:

using Microsoft.Office.Tools.Ribbon;

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Linq;

using System.Text.RegularExpressions;

using System.Windows.Forms;

using Excel = Microsoft.Office.Interop.Excel;

 

namespace Dedupe

{

    public partial class Ribbon1

    {

        public static Excel.Application App => Globals.ThisAddIn.Application;

        public static Excel.Workbook Workbook => App.ActiveWorkbook;

        public static Excel.Worksheet Worksheet => Workbook.ActiveSheet;

        public static Excel.Range SelectRange => Worksheet.Application.Selection as Excel.Range;

        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)

        {

 

        }

 

        private void button1_Click(object sender, RibbonControlEventArgs e)

        {

            var range = SelectRange;

            if (range != null && range.Count > 1)

            {

                if (range.Count>1000000) {

                    MessageBox.Show("选中单元格数量过大,请分批处理") ;

                    return;

                }

                object[,] o = range.SpecialCells(Excel.XlCellType.xlCellTypeVisible).get_Value();

 

                List<string> listAll = new List<string>();

                List<string> listRepeat = new List<string>();

                foreach (var cell in o)

                {

                    if (cell != null)

                    {

                        listAll.Add(cell.ToString().Trim());

                    }

                }

                foreach (var cell in o)

                {

                    if (cell != null)

                    {

                        List<string> list = listAll.Where(q => q == cell.ToString().Trim()).ToList();

                        if (list != null && list.Count > 1)

                        {

                            if (!listRepeat.Contains(cell.ToString().Trim()))

                            {

                                listRepeat.Add(cell.ToString());

                            }

                        }

                    }

                }

                //标记重复数据

                if (listRepeat != null && listRepeat.Count > 0)

                {

                    foreach (var item in listRepeat)

                    {

                        foreach (Excel.Range cell in range.SpecialCells(Excel.XlCellType.xlCellTypeVisible))

                        {

                            int i = cell.Row;

                            int j = cell.Column;

                            if (cell.Value != null && (Convert.ToString(cell.Value)).Trim() == item)

                            {

                                cell.Interior.Color = ColorTranslator.ToOle(Color.OrangeRed);

                            }

                        }

 

                    }

                }

            }

            else

            {

                MessageBox.Show("请选择一个以上的单元格");

                return;

            }

        }

 

        private void button2_Click(object sender, RibbonControlEventArgs e)

        {

            var range = SelectRange;

 

            object[,] o = range.SpecialCells(Excel.XlCellType.xlCellTypeVisible).get_Value();

            if (o != null)

            {

                foreach (Excel.Range cell in range.SpecialCells(Excel.XlCellType.xlCellTypeVisible))

                {

                    cell.Interior.ColorIndex = 0;

                }

            }

            else

            {

                MessageBox.Show("请选择一个或以上的单元格");

                return;

            }

        }

 

        private void button3_Click(object sender, RibbonControlEventArgs e)

        {

            var range = SelectRange;

            if (range != null && range.Count > 0)

            {

                object[,] o = range.SpecialCells(Excel.XlCellType.xlCellTypeVisible).get_Value();

                if (o != null)

                {

                    List<string> listAll = new List<string>();

                    List<string> listError = new List<string>();

                    foreach (var cell in o)

                    {

                        if (cell != null)

                        {

                            listAll.Add(cell.ToString().Trim());

                        }

                    }

                    foreach (var cell in listAll)

                    {

 

                        if (!listError.Contains(cell))

                        {

                            if (!Regex.Match(cell, "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{4}$").Success)

                            {

                                listError.Add(cell);

                            }

                        }

 

                    }

                    //标记错误数据

                    if (listError != null && listError.Count > 0)

                    {

                        foreach (var item in listError)

                        {

                            foreach (Excel.Range cell in range.SpecialCells(Excel.XlCellType.xlCellTypeVisible))

                            {

                                int i = cell.Row;

                                int j = cell.Column;

                                if (cell.Value != null && (Convert.ToString(cell.Value)).Trim() == item)

                                {

                                    cell.Interior.Color = ColorTranslator.ToOle(Color.Yellow);

                                }

                            }

 

                        }

                    }

                }

                else

                {

                    MessageBox.Show("请选择一个或以上的单元格");

                }

            }

            else

            {

                MessageBox.Show("请选择一个或以上的单元格");

            }

        }

    }

}

 

4.右键项目发布(F5可以直接调试)

5.安装setup.exe

 

6.打开EXCEL,先打开EXCEL功能,勾选确认:文件-选项-自定义功能区-开发工具/加载项

 

 

7.加载项查看功能

 

8.开发工具里面卸载

 

 

 

三、实际效果

 

标签:Excel,查询,cell,range,foreach,var,null,VSTO
From: https://www.cnblogs.com/wenthing/p/17788882.html

相关文章

  • 在 Windows 11 中,你可以使用 PowerShell 命令 Get-WindowsCapability 来查询 Windows
    在Windows11中,你可以使用PowerShell命令Get-WindowsCapability来查询Windows组件功能。这个命令可以列出当前安装的所有Windows组件功能,以及它们的状态。以下是使用Get-WindowsCapability命令查询Windows组件功能的步骤:打开PowerShell终端:可以通过在任务栏中搜......
  • 在 Windows 7 中,你可以使用命令行工具 cmd 来查询 添加安装 卸载 Windows 组件功能。
    在Windows7中,你可以使用命令行工具cmd来查询Windows组件功能。你可以使用dism命令来列出当前安装的所有Windows组件功能。以下是使用dism命令查询Windows组件功能的步骤:打开命令提示符(cmd):可以通过在开始菜单中搜索"cmd"并打开它,或者按下Win+R组合键,输入"c......
  • Apache Presto:一个统一多数据源的SQL查询引擎
    ApachePresto是一个开源的分布式SQL查询引擎,它可以在大数据环境下进行交互式的数据分析。Presto允许用户使用熟悉的SQL语法在不同的数据源上进行查询,比如Hive、Cassandra、PostgreSQL、Kafka、MySQL、ElasticSearch等,让用户可以在不同数据源上进行统一查询。Presto的......
  • 在Windows10中 PowerShell ,你可以使用以下命令来查询 Windows 组件功能
    在Windows10中PowerShell,你可以使用以下命令来查询Windows组件功能:powershellGet-WindowsOptionalFeature-Online这个命令会列出当前已安装的Windows组件功能以及可用的但尚未安装的功能。如果你只想查看已安装的功能,可以使用以下命令:powershellGet-WindowsOptionalF......
  • Python合并多个Excel文件中的指定sheet
    本文将介绍一个用于合并多个Excel文件中指定sheet的Python代码。这个功能可以方便地整理和分析数据。我们将逐步解释代码的每个部分,并提供示例用法。导入库首先,我们导入了需要使用的三个库:os、pandas和time。这些库分别用于操作文件和文件夹、处理Excel文件以及计算程序执行时间......
  • 外键和多表建立 连表查询
    外键#简单的理解为该字段可以让你去到其他表中查找数据表与表之间的关系一对多多对多一对一没有关系#一对多的表关系"""如何判断表关系:换位思考法"""以员工表和部门表为例先站在员工表问:一个员工能否有多个部门?答:不能在站在部门表......
  • Mybatis,模糊查询
    一、首先还是在mapper中定义方法,并且在xml中实现,,,,传入一个字符串 二、xml实现注意:传值时缺少两个%会报错 要么在传入值的时候添加(比较安全),要么在xml的SQL语句中添加1 2 三、测试 要注意的是,这种方法是有bug的一旦输入1or1=1可能会出现问题例如b站搜索框......
  • ExcelPatternTool 开箱即用的Excel工具包现已发布!
    目录ExcelPatternTool功能特点:快速开始使用说明常规类型高级类型Importable注解Exportable注解IImportOption导入选项IExportOption导出选项单元格样式StyleMapping样式映射使用数据库作为数据源示例Sample1:不同类型字段导出Sample2:高级类型导入和导出Sample3:员工健康体检工具已知......
  • 浅谈关于羚通智能分析平台通道管理和告警查询的使用功能
    ​上期我们知道了如何使用羚通智能分析平台,今天我们来详细了解一下羚通智能分析平台的通道管理和告警查询的使用功能。因为羚通智能分析平台主要是做视频算法分析的,所以我们今天来看一看羚通智能分析平台的通道管理和告警查询两个部分的使用情况如何。上一期,我们了解了一下......
  • Excel XLL C API
    Capi真的强大紧靠Excel4V或者Excel12V操作Excel表格属性、方法、事件。 32位XLL 64位XLL......