合并选中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. deepin常用软件列表

    deepin常用软件列表 软件列表 Safe Eyes 视力保护程序 网址

  2. Ionic4 Cordova 调用原生硬件 Api 实现扫码功能

    QR Scanner 速度快,样式随心所欲,默认只能扫二维码 https://ionicframework.com/docs/native/qr-scanner/ 安装插件 ionic cordova ...

  3. QThread: Destroyed while thread is still running

    Qt5已经分装了函数 void QThread::requestInterruption() { Q_D(QThread); QMutexLocker locker(&d->mutex) ...

  4. python for test

    for i,value in enumerate(['A', 'B', 'C']) print(i,value)

  5. 【438】Python 处理文件

    1. 读取文件,计算 tweets 数目 python中readline判断文件读取结束的方法 line == '' python:如何检查一行是否为空行 line == '\n' or line = ...

  6. 使用SoapUI测试wsdl

    webservice服务wsdl地址:http://localhost:8080/services/HelloWorld?wsdl new project: new soap project: 调用测 ...

  7. Swift4.0复习泛型

    1.泛型的基本使用: /// 定义了一个泛型结构体MyStruct, /// 其泛型形参为T struct MyStruct<T> {   /// 用泛型T定义存储式成员属性t var t ...

  8. CSS控制元素背景透明度总结

    方法一:CSS3的background rgba filter:progid:DXImageTransform.Microsoft.gradient(enabled='true',startColor ...

  9. spring boot如何打印mybatis的执行sql

    方案一 application.properties配置: logging.level.com,后面的路径指的是mybatis对应的方法接口所在的包.并不是mapper.xml所在的包. 1. log ...

  10. Java基础教程:内部类

    Java基础教程:内部类 内部类 内部类,是指在一个类的内部定义的类.就像下面这样: public class EnclosingClass {   . . .   public class Nest ...