我在c#中读取excel表中的形状时遇到此异常: 在
的代码行上if (worksheet.Shapes.Count >= iCurrentRowIndex)
{ }
无法转换类型的COM对象 'System .__ ComObject'到接口类型 'Microsoft.Office.Interop.Excel._Worksheet'。 此操作失败,因为 QueryInterface调用COM 与IID接口的组件 '{000208D8-0000-0000-C000-000000000046}' 由于以下错误而失败: 应用程序称为接口 被编组为一个不同的线程。 (HRESULT的例外情况:0x8001010E (RPC_E_WRONG_THREAD))。
编辑:
此应用程序在本地运行完美,但当我在IIS上部署它时,它会抛出异常。应该是什么原因?我使用代码作为线程
string strImageSavedPath = string.Empty;
ThreadStart cbThreadStater = delegate { strImageSavedPath = CopyToClipBoard(worksheet, (int)iRowindex, strApplicationPath); };
Thread thrd = new Thread(cbThreadStater);
thrd.SetApartmentState(ApartmentState.STA);
thrd.Start();
thrd.Join();
其中CopyToClipBoard
方法读取提供的行索引的图像,将图像保存在文件系统中并返回路径。
System.InvalidCastException未处理Message =“无法投射 接口类型为'System .__ ComObject'类型的COM对象 'Microsoft.Office.Interop.Excel._Worksheet'。此操作失败 因为QueryInterface调用COM组件的接口 由于IID'{000208D8-0000-0000-C000-000000000046}'失败了 以下错误:应用程序调用了一个接口 为不同的线程编组。 (HRESULT的例外情况:0x8001010E (RPC_E_WRONG_THREAD))。“Source =”Microsoft.Office.Interop.Excel“
堆栈跟踪: 在Microsoft.Office.Interop.Excel._Worksheet.get_Shapes() 在KGD6ExcelReader.ExcelManager.CopyToClipBoard(工作表工作表,Int32 iRowindex,String strApplicationPath)中 d:\ ParallelMinds \共享\ KGD6ExcelReader \ KGD6ExcelReader \ ExcelManager.cs:线 522 在KGD6ExcelReader.ExcelManager。<> c__DisplayClass3.b__0() 在 d:\ ParallelMinds \共享\ KGD6ExcelReader \ KGD6ExcelReader \ ExcelManager.cs:线 376 在System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在System.Threading.ExecutionContext.runTryCode(Object userData) 在System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode) 代码,CleanupCode backoutCode,Object userData) 在System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback回调,对象状态) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态) 在System.Threading.ThreadHelper.ThreadStart()InnerException:
答案 0 :(得分:1)
代码是否在后台线程上运行?如果是这样,您需要将线程的ApartmentState设置为STA - 您必须新建一个实际的线程来执行此操作并调用SetApartmentState方法。
答案 1 :(得分:1)
您尝试使用的COM接口参考(可能是工作表)是与当前线程位于不同公寓的代理。请参阅link text。
尝试编组对当前线程的引用。
答案 2 :(得分:1)
使用IIS中的Office自动化对象不推荐且不受支持。因此,您的应用程序在本地成功运行,而在IIS上运行失败这一事实并非完全出乎意料。
这并不意味着您无法尝试,但在继续操作之前,请确保您了解“Considerations for server-side Automation of Office”支持文章中的所有内容。