You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:36:03