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行了,當結束行號<起始行號時,就意味着該工作表沒有需要合並的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM