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 == 1)
        {
            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[0]);
        merwbk.SaveAs(System.AppDomain.CurrentDomain.BaseDirectory.ToString() + "EXCEL\\UpdateListByMerge\\Subaccount Update List(M)" + DateTime.Now.ToString("_yyyyMMdd_HHmmss") + ".xlsm");//另存第一个EXCEL文件
        for (int i = 1; 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 = 1;
                int startrow = 2;
                switch (mersht.Name)
                {
                    case "Add":
                        docidcol = 10;
                        startrow = 3;
                        break;
                    case "Close":
                    case "Reopen":
                    case "Merge":
                    case "Liquidate":
                        docidcol = 4;
                        startrow = 3;
                        break;
                }
                int endrow = ((Excel.Range)merdwbk.Worksheets[curshtname].Cells[999999, docidcol]).get_End(Excel.XlDirection.xlUp).Row;
                if (endrow < startrow)
                    continue;
                int currow = ((Excel.Range)mersht.Cells[999999, 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 + 1).ToString()]);
                else
                    merdwbk.Worksheets[curshtname].Rows[startrow.ToString() + ":" + endrow.ToString()].Copy(mersht.Range["a" + (currow + 1).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行了,当结束行号<起始行号时,就意味着该工作表没有需要合并的。

原文地址:https://www.cnblogs.com/JTCLASSROOM/p/11102265.html

时间: 2024-11-08 19:57:11

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

EXCEL中如何获得工作表(sheet)的名称

1.  EXCEL中获得工作表(sheet)的名称: RIGHT(CELL("filename"),LEN(CELL("filename"))-FIND("]",CELL("filename"))) =MID(CELL("filename",$A$1),FIND("]",CELL("filename",$A$1))+1,LEN(CELL("filename&

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

#region 获取Excel工作薄中Sheet页(工作表)名集合 /// <summary> /// 获取Excel工作薄中Sheet页(工作表)名集合 /// </summary> /// <param name="excelFile">Excel文件名及路径,EG:C:\Users\JK\Desktop\导入测试.xls</param> /// <returns>Sheet页名称集合</returns> pr

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

一般遇到标题这样的情况,许多人可能会一个一个的复制粘贴,其实完全不必那么麻烦. 你可以按以下步骤来操作: 第一步:打开所有要操作的excel工作薄 第二部:按住Shift键,选择所有要复制的工作表,在选择的工作表上单击右键 第三步:在弹出的菜单中,选择移动或复制(M)...选项. 第四步:在新弹出的窗口中选择转移到的目标工作薄,以及放置的位置.点击确定,转移成功.

excel批量取消隐藏工作表

按下"Alt+F11"键,在打开的"Microsoft Bisual Basic"窗口中,选择"插入——模块".,复制下面的代码,按F5键运行,就完成了批量取消隐藏工作表. Sub 批量取消隐藏工作表() Dim i As Integer For i = 1 To Worksheets.Count Worksheets(i).Visible = True Next End Sub 批量取消隐藏工作表代码二: Sub 批量取消隐藏工作表() For

excel 利用正则表达式匹配工作表中的数据

sheet1中A列放需要匹配的数据 sheet2中A列放正则表达式,可以是多个,但至少一个 匹配到了则在sheet1中C列对应行显示相关标记内容,比如本案例中显示1111 Sub Test() atr = Worksheets("Sheet1").Range("a65536").End(xlUp).Row btr = Worksheets("Sheet2").Range("a65536").End(xlUp).Row a =

excel表格中关于 撤销工作表保护密码

利用宏处理,代码如下: Sub PasswordBreaker() Dim i As Integer, j As Integer, k As Integer Dim l As Integer, m As Integer, n As Integer Dim i1 As Integer, i2 As Integer, i3 As Integer Dim i4 As Integer, i5 As Integer, i6 As Integer On Error Resume Next For i = 6

办公自动化18-将多个excel表中的多个sheet合并到一个excel中的一个sheet

合并前excel中的数据情况: 合并后的excel中数据情况: 附上代码如下: import pandas as pd year = ['2017','2018']#文件夹的命名 sheet_concat = pd.DataFrame() for i in range(len(year)): sheet = pd.read_excel('C:/Users/17360/Desktop/test/'+year[i]+'.xlsx',sheet_name = None,header= 0) #shee

Excel VBA在生成副本的工作表中插入本工作簿中的VBA模块代码

即在工作簿中添加一个工作表,然后移出并存为新的工作簿,在移出前将本工作簿的一个模块的代码拷贝至新的工作簿.下面是关键代码: '====================================================================== '各班名单保存为单个xls文件 ActiveSheet.Move ChDir myPath '忽略对话框,覆盖保存 Application.DisplayAlerts = False '班级名称增加"考生号处理"vba模块

C#如何设置Excel文档保护——工作簿、工作表、单元格

简介 Excel在工作和学习中应用广泛,是必不可少的数据统计与处理工具.对于一些重要的Excel文件,只供特殊人员查看.编辑或者防止重要数据对外泄露时,就需要设置文档保护,包括设置访问密码.设置文件只读等操作.本篇文章将介绍如何使用C#来设置Excel工作簿和工作表的保护,示例内容涉及以下要点 加密Excel工作簿 解密Excel工作簿 加密Excel工作表3.1加密整个工作表3.2 锁定单元格区域 解密工作表 隐藏单元格公式 工具使用 Spire. XLS for .NET 8.0 PS: 安