C#操作Excel执行分类多条件汇总合并
之前发了一片模拟合并,详见模拟Excel同一列相同值的单元格合并
在之前的文章中介绍了思想,其中Excel采用的二维数组模拟,今天花了点时间,学习了一下C#操作Excel,实现了类似的效果!
准备
需要导入Microsoft.Office.Interop.Excel;
using Microsoft.Office.Interop.Excel;
实现
关键函数:
/// <summary>
///
/// </summary>
/// <param name="sheet"></param>
private static void ExecutMerge(Worksheet sheet)
{
int begainIndex = 2; // 开始行, Excel下标从1开始,第一行是标题行
int endIndex = GetEndIndex(sheet, begainIndex, 1, sheet.UsedRange.Rows.Count); // 查找最开始第一列从1(下标0)行开始值相同的最后一行下标
// 外围控制,第一列的合并
while (begainIndex <= sheet.UsedRange.Rows.Count)
{
MergeContorl(sheet, begainIndex, endIndex, 1); // 递归执行
begainIndex = endIndex + 1; // 第一列下一次执行行开始下标
endIndex = GetEndIndex(sheet, endIndex + 1, 1, sheet.UsedRange.Rows.Count);
}
}
/// <summary>
/// 递归控制器
/// </summary>
private static void MergeContorl(Worksheet sheet, int rowbeg, int rowend, int col)
{
// 1. 执行当前的合并操作
Merge(sheet, rowbeg, rowend, col);
// 2.执行后面的操作
if (col > 6)
{ // 只合并前面6列,递归结束条件
return;
}
// 3.执行后面列的操作
for (int i = rowbeg; i <= rowend; i++)
{
int begin = i;
int end = GetEndIndex(sheet,begin, col + 1, rowend);
while (begin <= rowend)
{ // 这里保证后面所有的行都能遍历到
MergeContorl(sheet, begin, end, col + 1); // 开启递归
begin = end + 1;
end = GetEndIndex(sheet, begin, col + 1, rowend);
}
}
}
/// <summary>
/// 合并
/// </summary>
private static void Merge(Worksheet sheet, int rowbeg, int rowend, int col)
{
//sheet.get_Range(sheet.Cells[rowbeg, col], sheet.Cells[rowend, col]).MergeCells = true;
sheet.Range[sheet.Cells[rowbeg, col], sheet.Cells[rowend, col]].MergeCells = true;
for (int i = rowbeg + 1; i <= rowend; i++)
{
sheet.Cells[i, col] = " ";
}
}
/// <summary>
/// 获取同一列相同值得最后(行)下标
/// </summary>
/// <returns></returns>
private static int GetEndIndex(Worksheet sheet, int begrow, int col, int endscope)
{
if (begrow >= endscope || begrow >= sheet.UsedRange.Rows.Count) // sheet的行下标从0开始
{
return begrow;
}
if(((Range)sheet.Cells[begrow, col]).Text ==( (Range)sheet.Cells[begrow + 1, col]).Text)
{
return GetEndIndex(sheet, begrow + 1, col, endscope);
}
else
{
return begrow;
}
}
main函数
static void Main(string[] args)
{
// 1. 打开excel文件
Application app = new Application();
app.AlertBeforeOverwriting = false;
app.DisplayAlerts = false; // 避免合并单元格时频繁的提示
Workbooks wbks = app.Workbooks;
Workbook wbk = wbks.Add(@"C:\XXXXXX\Desktop\test.xlsx"); // 打开Excel文件
Worksheet sheet = (Worksheet)wbk.Sheets.get_Item(1); // 获取sheet
// 执行合并
ExecutMerge(sheet);
// 合并完成另存为一个文件
wbk.SaveAs(@"C:\XXXXXX\Desktop\result.xlsx", Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value);
// 资源的关闭释放
wbk.Save();
wbk.Close();
app.Quit();
Console.WriteLine("执行结束");
Console.ReadLine();
}
可以看出,只要得到一个sheet,直接调用ExecutMerge(sheet);即可;
效果
- 原表

- 结果

最后
此致, 敬礼
C#操作Excel执行分类多条件汇总合并的更多相关文章
- 使用POI操作Excel时对事先写入模板的公式强制执行
场景:POI读取Excel模板. 当使用POI操作Excel时,发现由POI生成的公式能够在打开Excel是被执行, 而事先手工写入Excel模板文件的公式则不自动被调用,必须手动双击该Cell才能生 ...
- 用Python的pandas框架操作Excel文件中的数据教程
用Python的pandas框架操作Excel文件中的数据教程 本文的目的,是向您展示如何使用pandas 来执行一些常见的Excel任务.有些例子比较琐碎,但我觉得展示这些简单的东西与那些你可以在其 ...
- 自己封装的poi操作Excel工具类
自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...
- 用DELPHI操作EXCEL Word
用DELPHI操作EXCEL 在DELPHI中显示EXCEL文件,可用以下简单代码做到.但要实用,则需进一步完善. var Form1: TForm1; EApp:variant;implemen ...
- 一个操作EXCEL的C#类ExcelUtils
近期在公司里一直从事服务类的工作,涉及到非常多excel的处理.部分工作内容是每天反复的,仅仅是每天的数据不同而已.我遇到的一个问题是客户每天发送的几种数据有些excel中的字段顺序是一致的,有些是不 ...
- Python openpyxl、pandas操作Excel方法简介与具体实例
本篇重点讲解windows系统下 Python3.5中第三方excel操作库-openpyxl: 其实Python第三方库有很多可以操作Excel,如:xlrd,xlwt,xlwings甚至注明的数据 ...
- 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器
1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...
- Apache POI组件操作Excel,制作报表(三)
Apache POI组件操作Excel,制作报表(三) 博客分类: 探索实践 ExcelApache算法Office单元测试 上一篇介绍了POI组件操作Excel时如何对单元格和行进行设置, ...
- 用Python操作excel文档
使用Python第三方库 这一节我们学习如何使用Python去操作Excel文档.如果大家有人不知道Excel的话,那么建议先学一学office办公基础.这里想要操作Excel,必须安装一个Pytho ...
随机推荐
- JS DOM 1
接触JS也有快一个月了,现在来总结一下看过的书,一本本总结,之后再融会贯通,也许更有助于学习.废话不多说,现在看的是<JavaScript DOM编程艺术>,该书挺薄的,不太会望而生畏,( ...
- go加密算法:CBC对称加密(一)--DES
package main import ( "bytes" //"crypto/aes" "crypto/cipher" "cry ...
- Flask之Flask实例有哪些参数
常用的参数应用实例 from flask import Flask, render_template, url_for, session, request, redirect app = Flask( ...
- 大数据学习--day04(选择结构、循环结构、大数据java基础面试题)
选择结构.循环结构.大数据java基础面试题 switch: 注意: byte short int char String(jdk1.7支持) 不能是 long float double boolea ...
- 24-集成ASP.NETCore Identity采用EF
1-增加IdentityServer4.AspNetIdentity nuget包 2- StartUp.cs启用增加相应的代码 .AddAspNetIdentity<ApplicationU ...
- 单节锂电池充电(电路)芯片TP4056
- java 中的线程池和线程 调用小demo
public class Main { public static void main(String[] args) { try { /// ThreadPoolExecutor executor = ...
- stm32 nucleo系列开发板的接口
1. 首先说的是 Arduino接口,所有的nucleo系列都支持这个接口,而且像F767这种尺寸长的板子也有的,不过是双排排针,其实就是外侧也是 Arduino接口 2. 板子接上电脑之后有个串口
- 解决美图看看不出现在“Open with”的子菜单中的问题
最近由于特殊需求,要使用美图看看,Win10系统,美图看看工作倒也正常,但出现一个比较郁闷的情况,就是只能在“Open with”的最下面一个子菜单中选择“Choose another app”,然后 ...
- JavaWeb(二)——Tomcat服务器(一)
一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...