C#合并选中EXCEL中的各个工作表
合并选中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中的各个工作表的更多相关文章
- vbs查找Excel中的Sheet2工作表是否存在不存在新建
set oExcel = CreateObject( "Excel.Application" ) oExcel.Visible = false '4) 打开已存在的工作簿: oEx ...
- 获取Excel工作薄中Sheet页(工作表)名集合
#region 获取Excel工作薄中Sheet页(工作表)名集合 02./// <summary> 03./// 获取Excel工作薄中Sheet页(工作表)名集合 04./// < ...
- 在Excel工作表单元格中引用当前工作表名称
在Excel工作表单元格中引用当前工作表名称 有多份Excel表格表头标题都为"××学校第1次拉练考试××班成绩表",由于工作表结构都是一样的,所以我每次都是复制工作表然后编辑修改 ...
- EXCEL中如何删除透视表的多余汇总
EXCEL中如何删除透视表的多余汇总 1)如下图,选中字段列,单击鼠标右键,在弹出的菜单中选择[字段设置]选项. 2)弹出[字段设置]对话框. 3)选择“分类汇总和筛选”选项卡,然后勾选“无”选项,单 ...
- excel-合并多个Excel文件--VBA合并当前目录下所有Excel工作簿中的所有工作表
在网上找EXCEL多文件合并的方法,思路: 一.Linux 或者window+cmder,直接用命令行cat合并EXCEL文件,但是,需要安装辅助东西才能直接处理(也许也不可以,但是,可以用文件格式转 ...
- 如何把一个excel工作薄中N个工作表复制到另一个工作薄中
一般遇到标题这样的情况,许多人可能会一个一个的复制粘贴,其实完全不必那么麻烦. 你可以按以下步骤来操作: 第一步:打开所有要操作的excel工作薄\n 第二步:按住Shift键,选择所有要复制的工作表 ...
- pandas实现excel中的数据透视表和Vlookup函数功能
在孩子王实习中做的一个小工作,方便整理数据. 目前这几行代码是实现了一个数据透视表和匹配的功能,但是将做好的结果写入了不同的excel中, 如何实现将结果连续保存到同一个Excel的同一个工作表中?还 ...
- EXCEL密码破解/破解工作表保护密码
网上有很多这个代码,但很多朋友并不太了解如何运用在此做了一些整理,希望对大家有所帮助! 注:很多时候会因为忘记密码丢失重要EXCEL文件而烦恼,这份代码就能帮你找回,仅仅出之这个初衷,如因为这个代码让 ...
- Excel VBA 如何在工作表上使用Option Button按钮
应用场景 在Excel的页面上放一个“确认”按钮,再放几个Option Button按钮,编写代码,点击“确认”按钮,判断出选择了哪个Option按钮, 然后根据选择不同的Option Button去 ...
随机推荐
- deepin常用软件列表
deepin常用软件列表 软件列表 Safe Eyes 视力保护程序 网址
- Ionic4 Cordova 调用原生硬件 Api 实现扫码功能
QR Scanner 速度快,样式随心所欲,默认只能扫二维码 https://ionicframework.com/docs/native/qr-scanner/ 安装插件 ionic cordova ...
- QThread: Destroyed while thread is still running
Qt5已经分装了函数 void QThread::requestInterruption() { Q_D(QThread); QMutexLocker locker(&d->mutex) ...
- python for test
for i,value in enumerate(['A', 'B', 'C']) print(i,value)
- 【438】Python 处理文件
1. 读取文件,计算 tweets 数目 python中readline判断文件读取结束的方法 line == '' python:如何检查一行是否为空行 line == '\n' or line = ...
- 使用SoapUI测试wsdl
webservice服务wsdl地址:http://localhost:8080/services/HelloWorld?wsdl new project: new soap project: 调用测 ...
- Swift4.0复习泛型
1.泛型的基本使用: /// 定义了一个泛型结构体MyStruct, /// 其泛型形参为T struct MyStruct<T> { /// 用泛型T定义存储式成员属性t var t ...
- CSS控制元素背景透明度总结
方法一:CSS3的background rgba filter:progid:DXImageTransform.Microsoft.gradient(enabled='true',startColor ...
- spring boot如何打印mybatis的执行sql
方案一 application.properties配置: logging.level.com,后面的路径指的是mybatis对应的方法接口所在的包.并不是mapper.xml所在的包. 1. log ...
- Java基础教程:内部类
Java基础教程:内部类 内部类 内部类,是指在一个类的内部定义的类.就像下面这样: public class EnclosingClass { . . . public class Nest ...