nbspsz头像
关注

C# 调用 Excel COM 的 Range.PasteSpecial 时失败。

从日志看,问题定位范围已经比较小:

Microsoft.Office.Interop.Excel.Range.PasteSpecial(...)
Common.ExcelOperate.PasteSpecial(Range range, String name)

也就是说:

C# 调用 Excel COM 的 Range.PasteSpecial 时失败。

Office 365 正常,Office 2019 报错,说明代码逻辑大概率没有问题,差异在 Excel COM 环境/剪贴板/版本兼容。


1. 最可能原因:PasteSpecial 参数不兼容

你的代码应该类似:

range.PasteSpecial(
    XlPasteType.xlPasteAll,
    XlPasteSpecialOperation.xlPasteSpecialOperationNone,
    false,
    false
);

Office 365 对参数容错更强,Office 2019 某些版本会失败。

建议改成:

range.PasteSpecial(
    XlPasteType.xlPasteValues
);

或者:

range.PasteSpecial(
    Paste: XlPasteType.xlPasteAll
);

不要传多余参数。


2. 剪贴板没有内容(非常常见)

PasteSpecial 依赖 Windows Clipboard。

例如:

sourceRange.Copy();

targetRange.PasteSpecial();

如果:

  • Copy 没成功
  • 中间有其他程序操作剪贴板
  • Excel 2019 COM 响应慢

就会异常。

建议增加:

sourceRange.Copy();

Thread.Sleep(300);

targetRange.PasteSpecial();

或者:

while (Clipboard.GetDataObject()==null)
{
    Thread.Sleep(100);
}

3. Office 2019 与 Office 365 位数不同

重点检查。

例如:

程序:

Any CPU
Prefer32Bit=false

Office:

Office 365 64位
Office 2019 32位

可能出现:

  • Open 正常
  • Copy 正常
  • PasteSpecial失败

查看:

Excel:

文件
 ↓
账户
 ↓
关于 Excel

确认:

Microsoft Excel 2019
32 位/64 位

和你的程序一致。


4. Excel 2019 未释放 COM 对象

如果你的代码循环处理多个 sheet:

例如:

for(...)
{
    range.Copy();
    range.PasteSpecial();
}

Excel 365 内存管理更好。

Excel 2019 容易出现:

RPC_E_CALL_REJECTED

建议:

每次 Paste 后:

excel.Application.CutCopyMode = 0;

例如:

target.PasteSpecial();

excel.CutCopyMode = 0;

5. Office 2019 更新版本问题

查看:

Excel:

文件
账户
关于 Excel

版本类似:

Version 1808
Build xxxx

Office 2019 已经停止增加功能,但仍有更新。

建议至少:

16.0.10396+

6. 建议你的 PasteSpecial 方法改造

你现在:

Common.ExcelOperate.PasteSpecial(Range range,String name)

建议改:

public void PasteSpecial(Excel.Range range,string name)
{
    try
    {
        range.PasteSpecial(
            Excel.XlPasteType.xlPasteAll
        );
    }
    catch(Exception ex)
    {
        Thread.Sleep(500);

        range.PasteSpecial(
            Excel.XlPasteType.xlPasteValues
        );
    }
    finally
    {
        range.Application.CutCopyMode = 0;
    }
}

我判断概率:

原因概率
剪贴板状态异常40%
PasteSpecial参数问题25%
Office 2019补丁/COM兼容20%
32/64位问题10%
其他5%

你再提供两个信息,我可以进一步定位:

  1. Office 2019 是 32 位还是 64 位?
  2. Common.ExcelOperate.PasteSpecial 方法里面完整代码(特别是 Copy 和 PasteSpecial 两行)

这个日志已经到 COM 调用层,基本不用看业务代码了。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/nbspzs/article/details/166489934

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--