使用netcore编写对比excel差异

news/2024/7/21 6:34:02 标签: excel

一、新建项目Vlook项目

using MiniExcelLibs;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.IO;

namespace Vlook
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var dir = AppContext.BaseDirectory;
            Console.WriteLine("请输入对比的Excel源:");
            var fileName1 = Console.ReadLine();
            var path1 = Path.Combine(dir, fileName1);
            Console.WriteLine("请输入对比的Exce2源:");
            var fileName2 = Console.ReadLine();
            var path2 = Path.Combine(dir, fileName2);

            var rows1 = MiniExcel.Query(path1);
            var rows2 = MiniExcel.Query(path2);

            var equalColumns = new List<string>();
            Console.WriteLine("请输关联列,输入0退出:");
            while (true)
            {
                var column = Console.ReadLine();
                if (column.ToString().ToLower() == "0")
                {
                    break;
                }
                equalColumns.Add(column);
            }

            var compareColumns = new List<string>();

            Console.WriteLine("请输对比的列,输入0退出:");
            while (true)
            {
                var column = Console.ReadLine();
                if (column.ToString().ToLower() == "0")
                {
                    break;
                }
                compareColumns.Add(column);
            }

            var moreDatas = new List<object>();
            var lessDatas = new List<object>();
            var diffDatas = new List<object>();
            var sameDatas = new List<object>();

            var tuple = CompareCore(rows1, rows2, equalColumns, compareColumns);
            moreDatas.AddRange(tuple.moreDatas);
            diffDatas.AddRange(tuple.diffDatas);
            sameDatas.AddRange(tuple.sameDatas);

            var tuple2 = CompareCore(rows2, rows1, equalColumns, compareColumns);
            lessDatas.AddRange(tuple2.moreDatas);

            var compareResultPath= Path.Combine(dir, DateTime.Now.ToString("yyyy-MM-dd HH_mm_ss").ToString()+"_对比结果.xlsx");
            var sheets = new Dictionary<string, object>
            {
                ["moreDatas"] = moreDatas,
                ["lessDatas"] = lessDatas,
                ["diffDatas"] = diffDatas,
                ["sameDatas"] = sameDatas
            };
            MiniExcel.SaveAs(compareResultPath, sheets);

            Console.WriteLine("Done");
        }

        private static (List<object> moreDatas, List<object> diffDatas, List<object> sameDatas) CompareCore(IEnumerable<dynamic> rows1, IEnumerable<dynamic> rows2, List<string> equalColumns, List<string> compareColumns)
        {
            var moreDatas = new List<object>();
            var diffDatas = new List<object>();
            var sameDatas = new List<object>();

            var i = 0;
            foreach (var row1 in rows1)
            {
                if (i == 0)
                {
                    i++;
                    continue;
                }
                var equalColumnValue1 = GetEqualColumnValue(row1, equalColumns);
                var exist = false;
                dynamic row2Temp = null;
                var j = 0;
                foreach (var row2 in rows2)
                {
                    if (j == 0)
                    {
                        j++;
                        continue;
                    }
                    var equalColumnValue2 = GetEqualColumnValue(row2, equalColumns);
                    if (equalColumnValue1 == equalColumnValue2)
                    {
                        exist = true;
                        row2Temp = row2;
                        break;
                    }
                    j++;
                }
                if (exist)
                {
                    var compareColumnValue1 = GetCompareColumnValue(row1, compareColumns);
                    var compareColumnValue2 = GetCompareColumnValue(row2Temp, compareColumns);
                    if (compareColumnValue1 == compareColumnValue2)
                    {
                        sameDatas.Add(row1);
                    }
                    else
                    {
                        diffDatas.Add(row1);
                    }
                }
                else
                {
                    moreDatas.Add(row1);
                }
                i++;
            }

            return ( moreDatas,  diffDatas,sameDatas);
        }

        private static string GetEqualColumnValue(dynamic row, List<string> equalColumns)
        {
            var str = "";
            foreach (var equalColumn in equalColumns)
            {
                str += ((IDictionary<string, object>)row)[equalColumn];
            }
            return str;
        }

        private static string GetCompareColumnValue(dynamic row, List<string> compareColumns)
        {
            var str = "";
            foreach (var compareColumn in compareColumns)
            {
                str += ((IDictionary<string, object>)row)[compareColumn];
            }
            return str;
        }
    }
}

二、首先我们准备两个Products1.xlsx和Products2.xlsx,并给出差异

Products1.xlsx

Products2.xlsx

 

执行程序:

 


http://www.niftyadmin.cn/n/5269262.html

相关文章

idea__SpringBoot微服务11——整合Druid数据源(新依赖)(新注解)

整合JDBC 一、导入依赖二、配置Druid————————创作不易&#xff0c;如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢谢~~ 接着 第10的 新注解&#xff1a; ConfigurationProperties ConfigurationPropert…

成功解决 Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found

Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found的解决方案&#xff0c;亲测可用&#xff01; 方法一&#xff1a;清理IDEA的缓存 File -> Invalidate Caches 方法二&#xff1a;添加版本号 先看自己当前的版本号 首先打开pom.xml文件进行查看C…

JavaEE之多线程编程:2.创建线程及Thread类常见方法(超全!!!)

一、创建线程 Java中创建线程的写法有很多种&#xff01;&#xff01;&#xff01;这里介绍其中5种。 方法1&#xff1a;继承Thread类&#xff0c;重写run 创建一个类&#xff0c;让这个类继承自Thread父类&#xff0c;再重写我们的run方法就可以了。 使用Thread类&#xff…

独孤思维:阴险狡诈的项目,千万别碰

阴险狡诈&#xff0c;可以赚钱&#xff0c;但是不能持续赚钱。 所以&#xff0c;千万别碰。 上个星期各地的分公司都收到了一个奇怪的包裹&#xff0c;到付298。 很多分公司的前台都误以为是非常重要的文件&#xff0c;所以签收了。 没想到打开一看竟是一堆废纸。 这么老套…

TCP/IP详解——HTTP 协议

文章目录 1. HTTP 协议1.1 URL 的格式1.2 请求报文分析1.2.1 请求行1.2.2 请求头 1.3 响应报文分析1.3.1 状态行1.3.2 响应报头 1.4 HTTP 工作原理1.5 Request 消息1.6 Request 包解码1.7 Response 消息1.8 HTTP 协议抓包分析1.8.1 CSNAS 抓包查看1.8.2 Wireshark 抓包查看1.8.…

知识付费小程序开发:技术实践示例

随着知识付费小程序的兴起&#xff0c;让我们一起来看一个简单的示例&#xff0c;使用Node.js和Express框架搭建一个基础的知识付费小程序后端。 首先&#xff0c;确保你已经安装了Node.js和npm。接下来&#xff0c;创建一个新的项目文件夹&#xff0c;然后通过以下步骤创建你…

为什么要用 top_p 做文本生成采样

上一篇文章介绍了在大模型生成文本时&#xff0c;一个可以控制的参数 Temperature 的作用&#xff1a;查看温度参数与 softmax&#xff0c;今天继续来看另一个同样可以控制文本输出效果的参数。 或许你在使用 OpenAI 的接口时&#xff0c;会碰到这个参数&#xff0c;那就是 to…

【话题】低代码123

目录 一、什么是低代码 二、低代码的优缺点 三、你认为低代码会替代传统编程吗&#xff1f; 四、有哪些低代码工具和框架 4.1 国外的平台 4.2 国内的平台 五、未来的软件研发 低代码&#xff0c;听着就过瘾的一个词。而且不是无代码&#xff0c;这说明&#xff0c;低代码…