使用C#将几个Excel文件合并去重分类
需要将几个Excel表格里面的数据去重,然后将每个站点的数据另存为一张Sheet上。
几个表格如下所示:


实现效果如下所示:

具体实现
需要使用EPPlus操作Excel
安装EPPlus如下所示:

为了更好的演示与说明,把步骤进行了拆分,先导入Excel数据,再去重,再进行数据分类,最后再导出为Excel数据,设计了一个窗体,如下所示:

导入Excel数据
首先定义一个类,用来保存相关数据,类的设计如下:
public class WaterData
{
public int Id { get; set; }
public string? Name { get; set; }
public string? WaterLevel { get; set; }
public string? WaterChange { get; set; }
public string? Source { get; set; } }
点击导入Excel数据按钮的代码如下:
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files (*.xlsx; *.xls;*.csv)|*.xlsx; *.xls;*.csv";
openFileDialog.FilterIndex = 1;
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
filePath = openFileDialog.FileName;
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using (ExcelPackage package = new ExcelPackage(filePath))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
//获取表格的列数和行数
int rowCount = worksheet.Dimension.Rows;
int colCount = worksheet.Dimension.Columns;
for (int i = 0; i < rowCount - 1; i++)
{
//创建一个realData类保存数据
var data = new WaterData();
data.Id = n;
data.Name = (string)worksheet.Cells[i + 2, 3].Value;
data.WaterLevel = Convert.ToString(worksheet.Cells[i + 2, 4].Value);
data.WaterChange = Convert.ToString(worksheet.Cells[i + 2, 5].Value);
data.Source = (string)worksheet.Cells[i + 2, 2].Value;
waterList.Add(data);
n++;
}
package.Save();
}
}
else
{
MessageBox.Show("您本次没有选择任何文件!!!");
}
}
上面的n是static int,初始值为0。
导入Excel数据的效果如下所示:

数据去重
执行数据去重,依据的是C#LINQ中的DistinctBy方法,本例中不使用id是因为每条数据id都不一样,即使是重复的数据但是id也不一样,本例依据的中Name属性和Soure属性,只要这两个数据一样,就认为是重复数据。
点击数据去重按钮的代码如下:
private void button2_Click(object sender, EventArgs e)
{
distinctList = waterList.DistinctBy(x => new { x.Name, x.Source }).ToList();
}
只需要一行代码:
distinctList = waterList.DistinctBy(x => new { x.Name, x.Source }).ToList();
执行去重的效果如下所示:

执行数据分类
本例中要求将同一个站点的数据放在同一张Sheet上,那么首先需要知道到底有多少个不同的站名,代码如下:
var Names = distinctList.Select(x => x.Name).Distinct().ToList();
实现效果如下:

由于这些数据是由图片文字识别而来的,因此可能识别有误,如果一个站名的数据不足50条,就不需要,代码如下:
for (int i = 0; i < Names.Count; i++)
{
var nameList = distinctList.Where(x => x.Name == Names[i]).ToList();
if (nameList.Count > 50)
{
list.Add(nameList);
}
}
实现数据分类也只需要一行代码:
var nameList = distinctList.Where(x => x.Name == Names[i]).ToList();
实现效果如下所示:

导出为Excel文件
本例中导出为Excel文件的思路是先让用户选定一个文件夹,然后就将导出的Excel文件保存在这个文件夹下面,导出为Excel文件的代码如下:
private void button4_Click(object sender, EventArgs e)
{
// 创建一个FolderBrowserDialog对象
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
// 设置对话框的标题
folderBrowserDialog.Description = "选择保存各站点数据的文件夹";
// 设置默认的根文件夹,如果需要的话
// folderBrowserDialog.RootFolder = Environment.SpecialFolder.MyComputer;
// 显示文件夹选择对话框
DialogResult result = folderBrowserDialog.ShowDialog();
if (result == DialogResult.OK)
{
// 用户选择了一个文件夹
selectedFolderPath = folderBrowserDialog.SelectedPath;
richTextBox1.Text += $"选择的Excel保存文件夹为:{selectedFolderPath}\r\n";
richTextBox1.Text += "正在执行导出为Excel文件...";
using (ExcelPackage excelPackage = new ExcelPackage())
{
for(int i =0; i < list.Count; i++)
{
ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add(list[i][0].Name);
for (int j = 0; j < list[i].Count; j++)
{
worksheet.Cells[j + 1, 1].Value = list[i][j].Id;
worksheet.Cells[j + 1, 2].Value = list[i][j].Name;
worksheet.Cells[j + 1, 3].Value = list[i][j].WaterLevel;
worksheet.Cells[j + 1, 4].Value = list[i][j].WaterChange;
worksheet.Cells[j + 1, 5].Value = list[i][j].Source;
}
}
// 保存 Excel 文件
FileInfo excelFile = new FileInfo($"{selectedFolderPath}\\各站点数据.xlsx");
excelPackage.SaveAs(excelFile);
richTextBox1.Text += "导出为Excel文件完成\r\n";
}
}
}
实现效果如下所示:

最后
操作Excel大家一般使用VBA、Python比较多,本文通过一个实例演示了如何通过C#来简化我们的办公(处理Excel数据)。
本实例全部源代码如下:
using OfficeOpenXml;
using System.Collections;
using System.Collections.Generic;
namespace Excel数据处理
{
public partial class Form1 : Form
{
string filePath;
string selectedFolderPath;
static int n = 0;
List<WaterData> waterList = new List<WaterData>();
List<WaterData> distinctList = new List<WaterData>();
List<List<WaterData>> list = new List<List<WaterData>>();
public class WaterData
{
public int Id { get; set; }
public string? Name { get; set; }
public string? WaterLevel { get; set; }
public string? WaterChange { get; set; }
public string? Source { get; set; }
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files (*.xlsx; *.xls;*.csv)|*.xlsx; *.xls;*.csv";
openFileDialog.FilterIndex = 1;
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
filePath = openFileDialog.FileName;
richTextBox1.Text += $"您选中的文件路径为:{filePath}\r\n";
richTextBox1.Text += $"正在导入Excel数据...\r\n";
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using (ExcelPackage package = new ExcelPackage(filePath))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
//获取表格的列数和行数
int rowCount = worksheet.Dimension.Rows;
int colCount = worksheet.Dimension.Columns;
for (int i = 0; i < rowCount - 1; i++)
{
//创建一个realData类保存数据
var data = new WaterData();
data.Id = n;
data.Name = (string)worksheet.Cells[i + 2, 3].Value;
data.WaterLevel = Convert.ToString(worksheet.Cells[i + 2, 4].Value);
data.WaterChange = Convert.ToString(worksheet.Cells[i + 2, 5].Value);
data.Source = (string)worksheet.Cells[i + 2, 2].Value;
waterList.Add(data);
n++;
}
richTextBox1.Text += $"导入Excel数据成功,数据量为:{rowCount - 1}\r\n";
package.Save();
}
}
else
{
MessageBox.Show("您本次没有选择任何文件!!!");
}
}
private void button2_Click(object sender, EventArgs e)
{
richTextBox1.Text += "正在执行数据去重...\r\n";
distinctList = waterList.DistinctBy(x => new { x.Name, x.Source }).ToList();
richTextBox1.Text += $"数据去重已完成,去重后数据量为:{distinctList.Count}\r\n";
}
private void button3_Click(object sender, EventArgs e)
{
richTextBox1.Text += "正在执行数据分类...\r\n";
var Names = distinctList.Select(x => x.Name).Distinct().ToList();
for (int i = 0; i < Names.Count; i++)
{
var nameList = distinctList.Where(x => x.Name == Names[i]).ToList();
if (nameList.Count > 50)
{
list.Add(nameList);
}
}
richTextBox1.Text += $"执行数据分类完成,类数为:{list.Count}\r\n";
}
private void button4_Click(object sender, EventArgs e)
{
// 创建一个FolderBrowserDialog对象
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
// 设置对话框的标题
folderBrowserDialog.Description = "选择保存各站点数据的文件夹";
// 设置默认的根文件夹,如果需要的话
// folderBrowserDialog.RootFolder = Environment.SpecialFolder.MyComputer;
// 显示文件夹选择对话框
DialogResult result = folderBrowserDialog.ShowDialog();
if (result == DialogResult.OK)
{
// 用户选择了一个文件夹
selectedFolderPath = folderBrowserDialog.SelectedPath;
richTextBox1.Text += $"选择的Excel保存文件夹为:{selectedFolderPath}\r\n";
richTextBox1.Text += "正在执行导出为Excel文件...";
using (ExcelPackage excelPackage = new ExcelPackage())
{
for(int i =0; i < list.Count; i++)
{
ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add(list[i][0].Name);
for (int j = 0; j < list[i].Count; j++)
{
worksheet.Cells[j + 1, 1].Value = list[i][j].Id;
worksheet.Cells[j + 1, 2].Value = list[i][j].Name;
worksheet.Cells[j + 1, 3].Value = list[i][j].WaterLevel;
worksheet.Cells[j + 1, 4].Value = list[i][j].WaterChange;
worksheet.Cells[j + 1, 5].Value = list[i][j].Source;
}
}
// 保存 Excel 文件
FileInfo excelFile = new FileInfo($"{selectedFolderPath}\\各站点数据.xlsx");
excelPackage.SaveAs(excelFile);
richTextBox1.Text += "导出为Excel文件完成\r\n";
}
}
}
}
}
如果你也对C#感兴趣,欢迎关注微信公众号DotNet学习交流~
使用C#将几个Excel文件合并去重分类的更多相关文章
- 多个EXCEL文件合并成一个
Python的numpy处理起来会比较方便,有空实现一下,这里是Excel内部代码的方式: 合并方法如下: 1.需要把多个excel表都放在同一个文件夹里面,并在这个文件夹里面新建一个excel.如图 ...
- python3 把excel文件合并并保存到csv文件
具体是这样,某路径下有很多 excel文件,文件名中包含相同关键字的是一类文件,把包含相同关键字的文件合并成一个文件,生成一个新的csv文件 # coding=utf-8 import xlrd im ...
- 两个EXCEL文件对比去重
两个EXCEL文件,A里面有10000条记录,B里面有4000条记录,A的记录包含了B里面所有的记录现在如何能把A里面没有包含B的6000条记录筛选出来? 那你要把两同时打开,比如book1 book ...
- linux shell文件合并 去重 分割
1,合并+去重+分割 转载:shell 文件合并,去重,分割 - kakaisgood - 博客园 (cnblogs.com) 第一:两个文件的交集,并集前提条件:每个文件中不得有重复行1. 取出两个 ...
- python excel 文件合并
Combining Data From Multiple Excel Files Introduction A common task for python and pandas is to auto ...
- 把一个文件夹下的多个excel文件合并到同一个excel的一个sheet里
#!/usr/bin/python # -*- coding: UTF-8 -*- import pandas as pd import os if __name__ == '__main__': F ...
- excel多个文件合并
多个excel文件合并成一个需要用ms office wps是不行的 1.将所有文件放在一个文件夹里 2.在文件夹里新建一个空的excel打开 右键sheet点击查看代码->输入下面代码-> ...
- Excel用Power Query把文件夹下所有文件合并为一个与合并多个表格
Excel用Power Query把文件夹下所有文件合并为一个与合并多个表格 在 Excel Power Query 未出来之前,把文件夹下所有文件合并为一个与合并同一工作表中的多个工作表,需要用 V ...
- 【原创】.NET读写Excel工具Spire.Xls使用(2)Excel文件的控制
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html .NET读写Excel工具Spire.Xls使用文章 ...
- NPOI操作Excel文件
首先,通过NuGet添加NPOI. NPOI依赖SharpZipLib,通过NuGet添加SharpZipLib. 然后添加NPOI. 添加后项目的引用列表如下: 把DataTable转换成Excel ...
随机推荐
- 人工智能如何应对 DevOps 监控和可观测性挑战
自 ChatGPT 横空出世之后,AIGC 已成为不可逆转的时代浪潮.在之前的文章中,我们介绍了DevOps 领域中AI的用例,需要回顾可以点击下方链接.在本篇文章中,我将简单聊聊人工智能(AI)如何 ...
- Promise的理解和使用(二)
一.Promise的常用APIpromise的这些方法执行完成都会返回一个新的promise,promise的状态由执行的结果决定. (1) new Promise()中的excutor函数 new ...
- React中setState的使用与同步异步
在react中,修改状态如果直接使用this.state,不会引起组件的重新渲染,需要通过 this.setState来对组件的属性进行修改. 1.this.setState的两种定义方式 定义初始状 ...
- JVM常用运行时参数说明
前言 仅列出常用JVM调优参数,更多请转文末的官方文档链接. 堆内存 -Xmx,设置最大堆内存,默认为物理内存的1/4.示例:-Xmx4096m,设置为4G -Xms,设置初始内存,默认为物理内存的1 ...
- 在Jupyter中使用AI写代码,如有神助,太惊艳了
昨晚看到一个可以在JupyterLab中使用的AI代码辅助工具jupyter-ai,它的交互确实非常棒,可以直接聊天,也可以就笔记中的代码提问,最出彩的是生成笔记功能,还是蛮惊艳的. 这里就极简介绍一 ...
- 2017-A
2017-A 题目描述: 输入一个字符串,要求输出能把所有的小写字符放前面,大写字符放中间,数字放后面,并且中间用空格隔开,如果同种类字符间有不同种类的字符,输出后也要用字符隔开. 例: 输入 12a ...
- 基于百度AI实现文字和图像敏感内容审核
前言 百度AI是指百度公司的人工智能技术全称.它采用深度学习技术,包括自然语言处理.语音识别.计算机视觉.知识图谱等,可应用于各个领域如互联网.医疗.金融.教育.汽车.物流等.百度AI的发展将帮助人类 ...
- Ds100p -「数据结构百题」41~50
41.P3590 [POI2015]TRZ 给定一个长度为n的仅包含'B'.'C'.'S'三种字符的字符串,请找到最长的一段连续子串,使得这一段要么只有一种字符,要么有多种字符,但是没有任意两种字符出 ...
- 整理php防注入和XSS攻击通用过滤
对网站发动XSS攻击的方式有很多种,仅仅使用php的一些内置过滤函数是对付不了的,即使你将filter_var,mysql_real_escape_string,htmlentities,htmlsp ...
- 掌握Go类型内嵌:设计模式与架构的新视角
本文深入探讨了Go语言中的类型内嵌特性,从基础概念到实际应用,以及相关的最佳实践.文章不仅讲解了如何在Go中实现和使用类型内嵌,还通过具体的代码示例展示了其应用场景和潜在陷阱.最后,文章总结了类型内嵌 ...