zoukankan      html  css  js  c++  java
  • 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行了,当结束行号<起始行号时,就意味着该工作表没有需要合并的。

  • 相关阅读:
    Pycharm(Mac版)快捷键操作篇
    Ubuntu报E: 仓库 “http://ppa.launchpad.net/webupd8team/sublime-text-3/ubuntu bionic Release” 没有 Release 文件。
    Ubuntu安装出现无法锁定管理目录是否有其他进程正在占用它?
    解决Ubuntu(18.04LTS)和win10电脑之间无法复制粘贴问题
    数据库的基本查询
    Ubuntu下数据库的操作
    Ubuntu中vi上下左右键退格键失灵的问题
    Ubuntu 18.04TLS命令安装Pycharm并固定在快速启动栏
    Ubuntu下mysql连接Navicat premium报错
    Ubuntu安装mysql报ERROR 1698 (28000): Access denied for user 'root'@'localhost',有效的解决办法
  • 原文地址:https://www.cnblogs.com/JTCLASSROOM/p/11102265.html
Copyright © 2011-2022 走看看