使用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

执行程序:

相关推荐
我老菜11 小时前
解析excel中的图片
java·excel
CodeCraft Studio18 小时前
Excel处理控件Aspose.Cells教程:使用 Python 在 Excel 中进行数据验
开发语言·python·excel
时间之城18 小时前
笔记:记一次使用EasyExcel重写convertToExcelData方法无法读取@ExcelDictFormat注解的问题(已解决)
java·spring boot·笔记·spring·excel
VBAMatrix18 小时前
审计效率升级!快速匹配Excel报表项目对应的Word附注序号
excel·审计·财务报表·会计师事务所·审计工具
lovely_nn20 小时前
wps excel 常用操作
excel·wps
前端极客探险家1 天前
前端 Excel 工具组件实战:导入 → 可编辑表格 → 导出 + 样式同步 + 单元格合并
前端·typescript·vue·excel
AAA顶置摸鱼1 天前
使用 Pandas 进行多格式数据整合:从 Excel、JSON 到 HTML 的处理实战
json·excel·pandas
神奇侠20242 天前
基于PaddleOCR对图片中的excel进行识别并转换成word(一)
python·word·excel·paddleocr
林枫依依2 天前
Unity 将Excel表格中的数据导入到Mysql数据表中
数据库·mysql·excel
CodeJourney.2 天前
基于DeepSeek与Excel的动态图表构建:技术融合与实践应用
数据库·人工智能·算法·excel