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