【发布时间】:2015-03-04 16:50:13
【问题描述】:
我正在使用 NetOffice 编辑 Excel 电子表格。如果我从 Excel 用户定义函数调用代码,它不会让我编辑调用电子表格。
Excel.Application excelApplication = Excel.Application.GetActiveInstance();
Excel.Worksheet workSheet = (Excel.Worksheet) excelApplication.ActiveSheet;
Excel.Range cell = workSheet.Cells[2, 2];
object value = cell.Value; //works
cell.Value = 3; //Throws Exception
是否有解决方法可以让我做到这一点?
例外是
“System.Runtime.InteropServices.COMException (0x80004005):有关详细信息,请参阅内部异常。---> System.Reflection.TargetInvocationException:调用目标已引发异常。---> 系统.Runtime.InteropServices.COMException:来自 HRESULT 的异常:0x800A03EC --- 内部异常堆栈跟踪结束 --- 在 System.RuntimeType.InvokeDispMethod(字符串名称,BindingFlags invokeAttr,对象目标,对象 [] 参数,布尔 [] byrefModifiers,Int32 文化,字符串 [] 命名参数) 在 System.RuntimeType.InvokeMember(字符串名称、BindingFlags bindingFlags、Binder binder、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams) 在 System.Type.InvokeMember(字符串名称、BindingFlags invokeAttr、Binder binder、Object target、Object[] args、CultureInfo 文化) 在 NetOffice.Invoker.PropertySet(COMObject comObject,字符串名称,对象 [] 值) 在 NetOffice.Invoker.PropertySet(COMObject comObject,字符串名称,对象 [] 值) 在 NetOffice.ExcelApi.Range.set_Value(对象值) 在 ExcelExamplesCS45.Example01.RunExample() 在 \psf\home\Documents\Visual Studio 2013\Projects\Excel-REPL\Excel-REPL\Example01.cs:line 29 在 ClojureExcel.MainClass.Test() in \psf\home\Documents\Visual Studio 2013\Projects\Excel-REPL\Excel-REPL\MainClass.cs:line 310"
【问题讨论】:
-
一般来说,工作表单元格中的 UDF 只能向该单元格返回一个值。它不能改变其他单元格。
-
我想知道 Excel 实例在评估 UDF 时是否放置了一些锁,或者是否有办法绕过所述锁。
-
是的,只需在单独的线程中运行上述代码即可。像魅力一样工作!
-
在尝试使用另一个线程解决此 Excel 限制时存在许多问题:您的代码可能无法获得正确的 Excel 实例或正确的工作表(因为您不知道何时另一个线程上的代码运行),并且可能由于悬空的 COM 引用而使 Excel 进程继续运行。有一些解决方法,但 Excel 有充分的理由阻止此类调用...
-
传统上我使用 Apache POI 创建电子表格,但最近我想要一种更像 repl 的方式,所以我创建了github.com/whamtet/Excel-REPL。它有点滥用 Excel,但总的来说效果很好!