无需NuGet,用C# Interop合并两个Excel工作表并保留样式
用C# Interop Excel实现工作表数据追加并保留样式
以下是完整的实现代码,基于你已有的基础代码扩展,实现将第二个工作簿的sheet2数据追加到第一个工作簿的sheet1现有数据之后,同时完整保留单元格样式:
using Microsoft.Office.Interop.Excel; using System; class ExcelDataAppend { static void Main() { var excelApp = new Application(); // 可选:设置Excel后台运行,不显示界面 excelApp.Visible = false; excelApp.DisplayAlerts = false; try { // 打开源工作簿(包含要追加的sheet2)和目标工作簿(要追加到的sheet1) Workbook sourceBook = excelApp.Workbooks.Open(@"C:\Path\To\Source.xlsx"); Worksheet sourceSheet = sourceBook.Worksheets[2]; // 第二个工作表sheet2 Workbook targetBook = excelApp.Workbooks.Open(@"C:\Path\To\Target.xlsx"); Worksheet targetSheet = targetBook.Worksheets[1]; // 第一个工作表sheet1 // 获取sheet1的最后一行(有数据的行) int lastRowTarget = targetSheet.Cells[targetSheet.Rows.Count, 1].End[XlDirection.xlUp].Row; // 获取sheet2的已使用区域(包含所有有数据和样式的单元格) Range sourceRange = sourceSheet.UsedRange; // 计算目标区域的起始位置:最后一行的下一行,第一列 Range targetRange = targetSheet.Cells[lastRowTarget + 1, 1]; // 复制源区域,粘贴时保留全部格式 sourceRange.Copy(); targetRange.PasteSpecial(XlPasteType.xlPasteAll); // 保存目标工作簿 targetBook.Save(); Console.WriteLine("数据追加完成"); } catch (Exception ex) { Console.WriteLine($"操作出错:{ex.Message}"); } finally { // 清理资源,避免Excel进程残留 foreach (Workbook workbook in excelApp.Workbooks) { workbook.Close(false); } excelApp.Quit(); // 释放COM对象 System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); } } }
关键步骤说明
- 定位目标起始行:通过
End[XlDirection.xlUp]从列A的最后一行向上查找,找到sheet1最后一个有数据的行,确保追加到空白行 - 复制源区域:使用
UsedRange获取sheet2所有已使用的单元格(包含数据和样式),避免复制空白区域 - 带格式粘贴:
xlPasteAll参数会复制包括字体、颜色、边框、单元格格式在内的所有样式,完全保留源单元格的格式 - 资源清理:必须手动关闭工作簿、退出Excel并释放COM对象,否则会有Excel进程在后台残留
注意事项
- 替换代码中的文件路径为实际的源文件和目标文件路径
- 确保本地安装了Microsoft Office,且项目引用了
Microsoft.Office.Interop.Excel程序集(右键项目→添加引用→COM→找到Microsoft Excel xx.x Object Library) - 运行时需要足够的文件读写权限
内容的提问来源于stack exchange,提问作者Nilesh Patil
相关产品推荐
相关产品推荐

