从日志看,问题定位范围已经比较小:
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 调用层,基本不用看业务代码了。
以上就是c#调用excel com的range.pastespecial时失败的可能原因与解决方法的详细内容,更多关于c#调用range.pastespecial失败的资料请关注代码网其它相关文章!
发表评论