C# Excel Interop InvalidCastException 时尝试更改 Shape.Fill.Backc
本文关键字:Shape Fill Backc Excel Interop InvalidCastException | 更新日期: 2023-09-27 18:37:15
当我尝试在 Excel 工作表上更改通过 C# 创建的新形状的背景颜色时,我收到错误。 我在下面添加了产生错误的示例代码。 下面的代码在安装了Office 2013的旧PC上运行良好,但是当在客户端计算机或新PC(Windows 10 Office 2016)上运行时,我在Shape.getFill()
调用和其他一些调用中得到一个InvalidCastException(下面粘贴的异常)。
所有抛出的调用似乎都与获取格式化对象有关(例如,它也发生在Chart.PlotArea.Format.get_Line()
调用中。 我进行的大多数其他 C# Excel 互操作调用都工作正常。 例如,我可以创建形状和图表,从单元格中写入和读取,但是当我尝试更改某些对象的格式时,会发生此错误。 当我在新笔记本电脑上编译并运行以下代码时,我在旧笔记本电脑上编译和运行时得到一个模糊的 InvalidCastException,它可以正常工作。 在旧计算机上编译和运行不会在新计算机上解决此问题。 我尝试在新PC上安装2010 PIA,但也没有运气。任何帮助将不胜感激。
代码示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
namespace TestOfficeError {
static class Program {
[STAThread]
static void Main() {
Excel.Application app = new Excel.Application();
Excel.Workbooks wbs = app.Workbooks;
Excel.Workbook wb = wbs.Add();
Excel.Sheets sheets = wb.Sheets;
Excel.Worksheet sheet = sheets[1];
Excel.Shape shape = sheet.Shapes.AddShape(Microsoft.Office.Core.MsoAutoShapeType.msoShapeRectangle, 10, 10, 100, 100);
//Exception thrown on this line. See exception below.
shape.Fill.BackColor.RGB = 0;
wb.Activate();
SafeRelease(sheet);
SafeRelease(sheets);
SafeRelease(wb);
SafeRelease(wbs);
SafeRelease(app);
FinalCleanup();
}
static void SafeRelease(object obj) {
if (obj != null){
Marshal.FinalReleaseComObject(obj);
}
}
static void FinalCleanup() {
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
}
例外
System.InvalidCastException was unhandled
HResult=-2147467262
Message=Return argument has an invalid type.
Source=mscorlib
StackTrace:
at System.Runtime.Remoting.Proxies.RealProxy.ValidateReturnArg(Object arg, Type paramType)
at System.Runtime.Remoting.Proxies.RealProxy.PropagateOutParameters(IMessage msg, Object[] outArgs, Object returnValue)
at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
at Microsoft.Office.Interop.Excel.Shape.get_Fill()
at TestOfficeError.Program.Main() in c:'users'chris'documents'visual studio 2015'Projects'TestOfficeError'TestOfficeError'Program.cs:line 28
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
我刚刚遇到了类似的Excel.Shape.Line属性问题。问题是用户安装了 64 位版本的 Office 2010。将其更改为32位版本解决了问题。
我使用dynamic
类型而不是Excel.Shape
解决了这个问题。
这只是一种解决方法,但它正在起作用。