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去 ...
 
随机推荐
- Microservices in action: java(spring) and .net
			
Manning | Homehttps://www.manning.com/ What is a Microservice? | Manninghttps://freecontent.manning. ...
 - centos下如何开放某个端口?
			
命令如下: firewall-cmd --permanent --add-port=/tcp (开放22端口) firewall-cmd --reload
 - tomcat NIOEndpoint中的Acceptor实现
			
EndPoint的组件就是属于连接器Connector里面的.它是一个通信的端点,就是负责对外实现TCP/IP协议.EndPoint是个接口,它的具体实现类就是AbstractEndpoint,而Ab ...
 - Python高级笔记(八)with、上下文管理器
			
1. 上下文管理器 __enter__()方法返回资源对象,__exit__()方法处理一些清除资源 如:系统资源:文件.数据库链接.Socket等这些资源执行完业务逻辑之后,必须要关闭资源 #!/u ...
 - Linux记录-批量安装LNMP(转载)
			
#!/bin/bash # Describe: This is a one - button installation service script # 提示:使用此脚本时,尽量先选择第一项配置Yum ...
 - ABAP语法篇1 DATA新用法
			
@DATA 按取数指定的字段定义内表结 定义工作区: SELECT SINGLE * FROM lfbk INTO @DATA(is_lfbk) ...
 - spring 传播行为与数据库事务ACID
			
数据库事务ACID特性 数据库事务正确执行的4个基础要素是原子性(Atomicity).一致性(Consistency).隔离性(Isolation)和持久性(Durability). •原子性:整个 ...
 - Apache使用内置插件mod_php解析php的配置
			
apache安装完毕之后,修改httpd.conf配置文件,添加代码如下: LoadModule php5_module modules/libphp5.so <FilesMatch \.php ...
 - 【kubernetes secret 和 aws ecr helper】kubernetes从docker拉取image,kubernetes docker私服认证(argo docker私服认证),no basic auth credentials错误解决
			
aws ecr helper: https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-dock ...
 - Django: ORM查询中使用or查询
			
先引入Q,(原名就叫Q) from django.db.models import Q page_user = User.objects.filter(Q(member_code__contains= ...