C# 使用Interop.Excel复制Excel指定Range到另一文件粘贴位置异常求解
问题根因
- 你仅修改了内存中读取的
valueArray2数组,没有将修改后的数组赋值回目标工作表的range2对象,修改没有同步到Excel文件 - 四层循环逻辑完全冗余且存在bug:
- 循环起始值
i=2会直接丢失源范围第一行(C1单元格)的数据 - 内层k、l两层循环没有实际作用,只是重复执行无意义的赋值操作
- 循环起始值
- 没有释放COM对象,会导致Excel进程残留在后台占用资源
修正方案
Interop.Excel支持范围直接批量赋值,无需手动循环遍历,性能更高且不易出错:
using Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; // 提前声明所有COM对象,方便后续释放 Application application = null; Workbook sourceWorkbook = null; Worksheet sourceSheet = null; Range sourceRange = null; Workbook targetWorkbook = null; Worksheet targetSheet = null; Range targetRange = null; try { application = new Application(); // 加载源Excel和指定范围 sourceWorkbook = application.Workbooks.Open(@"Excel.xlsx", 1); sourceSheet = (Worksheet)sourceWorkbook.Sheets[9]; sourceRange = sourceSheet.get_Range("C1", "C5"); // 加载目标Excel和指定写入范围 targetWorkbook = application.Workbooks.Open(@"Excel2.xlsx", 1); targetSheet = (Worksheet)targetWorkbook.Sheets[1]; targetRange = targetSheet.get_Range("F1", "F5"); // 直接批量赋值,自动对应范围尺寸 targetRange.Value = sourceRange.Value; targetWorkbook.Save(); } finally { // 按顺序释放COM对象,避免残留Excel后台进程 if (sourceRange != null) Marshal.ReleaseComObject(sourceRange); if (sourceSheet != null) Marshal.ReleaseComObject(sourceSheet); if (sourceWorkbook != null) { sourceWorkbook.Close(); Marshal.ReleaseComObject(sourceWorkbook); } if (targetRange != null) Marshal.ReleaseComObject(targetRange); if (targetSheet != null) Marshal.ReleaseComObject(targetSheet); if (targetWorkbook != null) { targetWorkbook.Close(); Marshal.ReleaseComObject(targetWorkbook); } if (application != null) { application.Quit(); Marshal.ReleaseComObject(application); } }
如果需要先对数据做自定义处理再写入,可以用数组中转的方式:
// 读取源范围到数组 object[,] valueArray = (object[,])sourceRange.Value; // 这里可自定义处理数组中的数据 // 处理完成后直接赋值到目标范围即可 targetRange.Value = valueArray;
内容的提问来源于stack exchange,提问作者Radu Costel
相关产品推荐
相关产品推荐

