使用netcore编写对比excel差异

一、新建项目Vlook项目

cs 复制代码
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

执行程序:

相关推荐
asdzx671 小时前
使用 Python 为 Excel 添加各类数据验证规则
开发语言·python·excel
足球中国3 小时前
.net DataExcel控件 2.11.1.53版发布
c#·.net·excel
程序员贺加贝3 小时前
列表导出不够用-SaaS-ERP-单据详情导出的-Provider-模板与文档型-Excel-设计
java·后端·设计模式·架构·excel
城数派3 小时前
1901-2025年中国省市县三级逐月平均气温数据(Shp/Excel格式)
excel
一晌小贪欢3 小时前
Python办公16:PDF 强力缝合——将几十个 PDF 合并为单个文档并添加页码
开发语言·python·excel·数据可视化·python办公
dogstarhuang4 小时前
Excel手动群发短信不可追踪?用API接口封装实现可监控触达
低代码·excel·api接口·私域运营·接口开发·短信营销·roi提升
DS随心转APP4 小时前
AI导出鸭插件 如何解决这些痛点,以及它如何重构“批量导出”这件事,让 纳米AI导出Excel 和其他格式告别手动整理,让AI导出回归优雅。
人工智能·重构·word·excel·deepseek·ai导出鸭
Su米苏4 小时前
关于@vue-office/excel 渲染异常滚动失去内容
前端·vue.js·excel
一晌小贪欢1 天前
Python办公14:批量解压文件夹内的所有 ZIP/RAR 并自动分类
开发语言·python·excel·数据可视化·python办公
一入程序无退路1 天前
Navicat导出Excel格式表名表结构
数据库·excel