从日志看,问题定位范围已经比较小:
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% |
你再提供两个信息,我可以进一步定位:
- Office 2019 是 32 位还是 64 位?
Common.ExcelOperate.PasteSpecial方法里面完整代码(特别是 Copy 和 PasteSpecial 两行)
这个日志已经到 COM 调用层,基本不用看业务代码了。
转载自 CSDN-专业IT技术社区



