合并选中EXCEL中的各个工作表,以第一个选中的EXCEL文件里的工作表进行匹配,遍历后面的每个EXCEL文件,有相同的工作表就合并:

private void button1_Click(object sender, EventArgs e)
{
string inifolder = System.AppDomain.CurrentDomain.BaseDirectory.ToString() + "EXCEL\\UpdateList";//设定默认文件夹
OpenFileDialog dialog = new OpenFileDialog
{
Title = "请选择EXCEL文件:",
Filter = "EXCEL文件(*.xls*)|*.xls*",
Multiselect = true,
InitialDirectory = inifolder
};
string[] files = null;
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
files = dialog.FileNames;
}
if (files != null)
{
if (files.Length == )
{
MessageBox.Show("There is only one file seleced, no need to merge!");
return;
}
Excel.Application merapp = new Excel.Application();
merapp.Visible = true;//设定合并过程是否可视化
Excel.Workbook merwbk = merapp.Workbooks.Open(files[]);
merwbk.SaveAs(System.AppDomain.CurrentDomain.BaseDirectory.ToString() + "EXCEL\\UpdateListByMerge\\Subaccount Update List(M)" + DateTime.Now.ToString("_yyyyMMdd_HHmmss") + ".xlsm");//另存第一个EXCEL文件
for (int i = ; i < files.Length; i++)//遍历后面的EXCEL文件
{
Excel.Workbook merdwbk = merapp.Workbooks.Open(files[i]);
foreach(Excel.Worksheet sht in merwbk.Worksheets)
{
Excel.Worksheet mersht = sht;
string curshtname = mersht.Name;
if (!HasSheet(curshtname, merdwbk))
{
continue;
}
int docidcol = ;
int startrow = ;
switch (mersht.Name)
{
case "Add":
docidcol = ;
startrow = ;
break;
case "Close":
case "Reopen":
case "Merge":
case "Liquidate":
docidcol = ;
startrow = ;
break;
}
int endrow = ((Excel.Range)merdwbk.Worksheets[curshtname].Cells[, docidcol]).get_End(Excel.XlDirection.xlUp).Row;
if (endrow < startrow)
continue;
int currow = ((Excel.Range)mersht.Cells[, docidcol]).get_End(Excel.XlDirection.xlUp).Row;
if (curshtname.ToUpper() == "TODOLIST")
merdwbk.Worksheets[curshtname].Range["a" + startrow.ToString() + ":f" +endrow.ToString()].Copy(mersht.Range["a" + (currow + ).ToString()]);
else
merdwbk.Worksheets[curshtname].Rows[startrow.ToString() + ":" + endrow.ToString()].Copy(mersht.Range["a" + (currow + ).ToString()]);
}
merdwbk.Close(false);
}
merwbk.Save();
     merapp.Visible = true;
}
}

根据工作表名判断EXCEL文件是否含有该工作表:

public bool HasSheet(string shtname, Excel.Workbook wbk)
{
foreach (Excel.Worksheet w in wbk.Worksheets)
{
if (w.Name.ToUpper().Trim() == shtname.ToUpper())
{
return true;
}
}
return false;
}

在合并EXCEL文件时,往往需要计算工作表里需要copy的起始行号和结束行号,要结合实际可能发生的情况统计比较好,例子中使用的是get_End()方法,而不是使用UsedRange或者CurrentRegion确定区域,因为有可能只改变格式也会影响UsedRange,有空行也会影响CurrentRegion,还不如选中一个标准列,统计该标准列中最后一个非空单元格的行号,代表该工作表的结束行号,起始行号一般就是标题除外的第2行或第3行了,当结束行号<起始行号时,就意味着该工作表没有需要合并的。

C#合并选中EXCEL中的各个工作表的更多相关文章

  1. vbs查找Excel中的Sheet2工作表是否存在不存在新建

    set oExcel = CreateObject( "Excel.Application" ) oExcel.Visible = false '4) 打开已存在的工作簿: oEx ...

  2. 获取Excel工作薄中Sheet页(工作表)名集合

    #region 获取Excel工作薄中Sheet页(工作表)名集合 02./// <summary> 03./// 获取Excel工作薄中Sheet页(工作表)名集合 04./// < ...

  3. 在Excel工作表单元格中引用当前工作表名称

    在Excel工作表单元格中引用当前工作表名称 有多份Excel表格表头标题都为"××学校第1次拉练考试××班成绩表",由于工作表结构都是一样的,所以我每次都是复制工作表然后编辑修改 ...

  4. EXCEL中如何删除透视表的多余汇总

    EXCEL中如何删除透视表的多余汇总 1)如下图,选中字段列,单击鼠标右键,在弹出的菜单中选择[字段设置]选项. 2)弹出[字段设置]对话框. 3)选择“分类汇总和筛选”选项卡,然后勾选“无”选项,单 ...

  5. excel-合并多个Excel文件--VBA合并当前目录下所有Excel工作簿中的所有工作表

    在网上找EXCEL多文件合并的方法,思路: 一.Linux 或者window+cmder,直接用命令行cat合并EXCEL文件,但是,需要安装辅助东西才能直接处理(也许也不可以,但是,可以用文件格式转 ...

  6. 如何把一个excel工作薄中N个工作表复制到另一个工作薄中

    一般遇到标题这样的情况,许多人可能会一个一个的复制粘贴,其实完全不必那么麻烦. 你可以按以下步骤来操作: 第一步:打开所有要操作的excel工作薄\n 第二步:按住Shift键,选择所有要复制的工作表 ...

  7. pandas实现excel中的数据透视表和Vlookup函数功能

    在孩子王实习中做的一个小工作,方便整理数据. 目前这几行代码是实现了一个数据透视表和匹配的功能,但是将做好的结果写入了不同的excel中, 如何实现将结果连续保存到同一个Excel的同一个工作表中?还 ...

  8. EXCEL密码破解/破解工作表保护密码

    网上有很多这个代码,但很多朋友并不太了解如何运用在此做了一些整理,希望对大家有所帮助! 注:很多时候会因为忘记密码丢失重要EXCEL文件而烦恼,这份代码就能帮你找回,仅仅出之这个初衷,如因为这个代码让 ...

  9. Excel VBA 如何在工作表上使用Option Button按钮

    应用场景 在Excel的页面上放一个“确认”按钮,再放几个Option Button按钮,编写代码,点击“确认”按钮,判断出选择了哪个Option按钮, 然后根据选择不同的Option Button去 ...

随机推荐

  1. 廖雪峰Git教程2

    转自:https://www.liaoxuefeng.com/wiki/896043488029600 [远程仓库] 到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心 ...

  2. Android开发--IntentService的用法,你错过了什么

    Android开发--IntentService的用法,你错过了什么 . 本文链接:https://blog.csdn.net/smbroe/article/details/45009721 Inte ...

  3. python的url正则表达式

    网上有很多的正则表达式版本,大部分都不好使,下面这个比较好用: http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F] ...

  4. 报错:(未解决)java.lang.VerifyError: Instruction type does not match stack map

    报错背景: CDH中集成kafka的服务,解决完kafka的jar包报错之后重启,发现这个报错. 报错现象: java.lang.VerifyError: Instruction type does ...

  5. lombok 插件安装使用

    Lombok是一个Java库,它自动插入编辑器并构建工具,为Java添加香料.永远不要再编写另一个getter或Eques方法,您的类有一个功能齐全的构建器,可以自动化您的日志变量以及更多的注释. 官 ...

  6. Bmp格式图片与16进制的互相转换简解 Python

    BMP TO HEX 首先介绍Github上一个简单的Bmp转成16进制的py: https://github.com/robertgallup/bmp2hex 网上这种例子很多.思路也简单:将bmp ...

  7. 【缺少kubernetes权限】 namespaces "xxx" is forbidden: User "xxx" cannot xxx resource "xxx" in API group "xxx" in the namespace "xxx"

    需要添加权限,添加权限方式: https://github.com/argoproj/argo/issues/1068

  8. [Google] Help employee find the nearest gbike

    You are given a campus map with the Google buildings, roads and Google bikes. You have to help the e ...

  9. AWS 消息服务(九)

    松耦合架构 概述 使用独立的组件设计架构,降低相互依赖,当一个组件出现故障时,其他不受影响 利用ELB和SQS来打破传统服务器各层的关联,成为各层之间的中介,各层的故障和扩展均由中介自助处理 系统的耦 ...

  10. 使用 RedisDesktopManager 连接redis所需步骤

    服务器开放了6379端口 redis默认配置是只允许本地连接,我们需要修改redis配置文件 配置文件找到 bind 127.0.0.1 这一行注释掉 在找到 protected-mode yes 修 ...