Tag: com

启用由Excel / PPT禁用的内置Officefunction区button

这是很好地logging如何在Microsoft Office内置的function区button可以重新用途( 例如这里 ),例如复制button。 但是,我并不知道有任何方法可以完全控制重新使用的内置控件的启用状态。 对我来说,这是一个问题,因为我想在Excel和PowerPoint中实现一些扩展function,在某些情况下,alignmentbutton是有意义的。 但它们被Excel / PowerPoint禁用,所以重新调整它们不起作用。 禁用默认启用的内置button不是问题。 为内置button定义一个getEnabledcallback函数似乎可以解决问题。 但是如何启用默认禁用的内置function区button? (getEnabled在这里没有帮助) 我怀疑没有“VBA / VSTO方式”来完成任务? 你认为有可能使用COM,例如通过IAccessible? 到目前为止,我只find枚举,select和调用button命令的方法,但不能改变它们的状态。

虽然Excel中使用VT_DATE和SystemTimeToVariantTime指示,但Excel不显示值

我们通过COM自动化(C ++)导出到excel(office2010)。 这意味着我们使用SafeArrays,VARIANT和使用excel API,如范围 – > PutValue()。 我们对某些(不是全部)具有导出date值的客户机器有问题。 我们通常将VARIANT的值指定为VT_DATE并填入date成员。 像这样的东西: VARIANT vValue; SYSTEMTIME SystemTimeVal; short Year=2011; short Month=11; short Day=14; short Hour=0; short Minute=0; short Second=0; SystemTimeVal.wYear = (WORD)Year; SystemTimeVal.wMonth = (WORD)Month; SystemTimeVal.wDay = (WORD)Day; SystemTimeVal.wHour = (WORD)Hour; SystemTimeVal.wMinute = (WORD)Minute; SystemTimeVal.wSecond = (WORD)Second; V_VT(&vValue) = VT_DATE; SystemTimeToVariantTime(&SystemTimeVal, &(vValue.date)); // SafeArrayPutElement related code omitted here […]

如何在指定的terminal会话帐户上打开Excel / Powerpoint,而不是使用最低ID的默认值?

大家好, 我有一个应用程序(Windows服务/ C#)启动EXCEL和POWERPOINT,并使用系统剪贴板复制这两个应用程序之间的数据。 应用程序在多个活动terminal会话的服务器上运行。 默认情况下,Office应用程序在会话ID最低的会话中启动。 COM对象 我使用COM对象在ms-service和office应用程序之间进行通信。 下面的代码是我如何运行EXCEL的一个例子。 xlApp = new Microsoft.Office.Interop.Excel.Application(); xlWorkBook = xlApp.Workbooks.Open("path_to_my_file", 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); multithreading – 并行会话 ATM应用程序正在单线程模式下运行。 我打算同时运行两个…问题是我只有1个剪贴板可用于通信目的。 为了获得另一个,我打算在2个独立的窗口会话上运行整个应用程序。 在这种情况下,我会有2个独立的单线程解决scheme。 将有2个服务的副本,运行自己的办公应用程序,我会有2个单独的剪贴板供我使用。 问题 有一件事尚未解决 – 我不知道如何强制这些办公应用程序运行在不同的用户会话。 从我所看到的情况来看,他们总是在一个身份证号码最低的sesison中跑步。 我发现了类似的问题 – 在terminal服务器上,服务如何在用户会话中启动一个进程? ,但是,运行一个进程并不像通过COM对象运行Office应用程序那样。 编辑:我注意到,如果我打开EXCEL不是从WINDOWS服务,而是从WINDOWS FROMS应用程序,EXCEL行为不同。 它不再在用户会话中以最低ID开始,而是在WINDOWS FORMS APP正在运行的相同帐户上打开。 这不知何故解决了我的问题,我将能够运行2个并行进程:)

VB(A)COM-DLL尝试实例化NET-DLL对象时出错

这是我的挑战 EXCEL-VBA打开一个位于一个地方的COM-DLL,指另一个NET-DLL中的一个类。 当COM-DLL尝试从类(在NET-DLL中)初始化一个对象时,出现get_ContentTypeProperties方法没有实现的错误。 错误消息“方法没有实现” 。 我从来没有创build方法get_ContentTypeProperties ,也不是我使用的接口的一部分。 当通过另一个DLL访问COM-DLL时,为了解决EXCEL-VBA问题,它可以正常工作。 有任何想法吗? 更新 :从实现_Worksheet接口(而不是_Workbook接口像原始问题)中使用不同的类从NET-Dll带来相同的错误消息,但至less我发现“未实现”方法(PrintOutEx)是一部分Microsoft.Office.Tools.Excel命名空间的工作表接口。 这个接口是由Visual Studio使用的,我正在创build我的DLL。 但是仍然…我的NET-DLL正在实现Microsoft.Office.Interop.Excel命名空间中的_Worksheet-Interface。 为什么从接口报告的方法丢失,我不执行? 更新 : 1.)根据进程监视器结果,我看到正确的DLL被寻址,并且没有在GAC中加载的DLL的干扰版本,例如 2.)我 – 以防万一 – 使Excel指代.NET框架2.xxx,其上所有涉及的DLL都基于…相同的错误再次:(

Excel Viewer(XLView)有没有COM API?

我已经开发了一些代码来使用Excel(通过COM)准备打印(缩放)的电子表格,并且工作正常,但现在我正在考虑只用Excel查看器做同样的事情。 问题是,我不能find它是否有一个类似于Excel的COM接口。 我已经在导入语句中用XLVIEWreplace了Excel #import "XLVIEW.EXE" \ rename( "DialogBox", "ExcelDialogBox" ) \ rename( "RGB", "ExcelRGB" ) \ rename( "CopyFile", "ExcelCopyFile" ) \ rename( "ReplaceText", "ExcelReplaceText" ) 但现在,Excel工作区不再可见 Excel::_ApplicationPtr pApplication; // Excel namespace not found

Excel DisplayAlerts奇怪的行为:“一个或多个无效的引用”的错误消息

我有一个Python脚本,使用Excel的COM接口从各种来源的数据填充Excel文件。 这是一个片段: file=win32com.client.Dispatch("Excel.Application") #various manipulation goes here file.DisplayAlerts=False sheet.Delete() file.DisplayAlerts=True 我需要删除其中一个表后填写所有内容,所以我closuresDisplayAlerts,所以它不要求我确认删除。 之后我想再打开,所以用户不会丢失数据。 但是,重新启动DisplayAlerts后,切换工作表会提示给我这样一条消息:“此工作表中的公式包含一个或多个无效的引用,请确认您的公式包含有效的path,工作簿,范围名称和单元格引用”。 我通常不会收到这个消息,我所有的公式都按预期工作。 我怎样才能避免这个消息? 我很确定这个消息与我的图表在数据范围内有很多#N / A值有关(所以点不能被绘制)。 但是我能做些什么来摆脱这些信息,为什么在这三行代码之后出现呢? 此外,只是closures再次切换DisplayAlerts不会提示消息:删除在此发挥作用。 另外,为什么这个消息不只是告诉你它在哪里看到一个问题,是否有一些很好的理由? 消息仅在纸张切换到第一次时出现,并且每次对图表范围进行编辑时都会返回。 此外,它不出现,如果我只是删除表没有closuresDisplayAlerts。

实例化新的Excel过程时出错

这个问题是关于我最近的问题在最大数量的Excel进程? ,但是具有不同的行为。 简而言之:有一个COM +组件在启动时会打开一些excel进程。 句柄被添加到列表中,所以它们不会超出范围或收集垃圾。 如果我在本地运行这个组件(Windows 7 64位,12 Gb的内存),它开始罚款,并打开30个Excel进程没有问题。 如果我在(虚拟)服务器上运行这个组件(windows server 2003 R2 SP2 64位,4 Gb),那么前21个excel进程是正确启动的,但是其余的9个进程没有被创build; 并在事件日志中看到9次以下错误: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005. 所以创build最后的9个excel进程导致了exception,似乎达到了21个excel进程的限制。 如果我在另一台服务器(Windows Server 2003 SP 2,1 Gb RAM)上尝试它,则会创build22个excel进程,另外还有8个失败且具有相同的exception。 我想知道是什么导致Excel进程创build在这些服务器上失败? 编辑:我可以打开30 Excel的实例没有问题,如果我手动打开他们使用开始菜单。 有任何想法吗? 谢谢,L

通过COM dll接收数据时,Excel Application.Ready = False

我使用调度接口通过COM DLL将外部数据传递到Excel插件。 在VBA汇方法中,我试图将数据写入适当的单元格之前检查Application.Ready = True, If Application.Ready = True Then With Workbooks(bookName).Sheets(sheetName).Range(rangeName) .Value = thisData End With Else Debug.Print "Dropped Payload" End If 我不想只是放弃数据,所以我试图做一些事情,以使其正确。 调用Application.OnTime而不是设置值。 不幸的是,当Application.Ready = False时,Excel不会让我调用Application.OnTime。 使用这里的技术来启动一个Windows定时器,然后调用OnTime。 这里的问题是多个事件相互重叠,他们都试图同时访问AfterUDFRoutine1,导致崩溃。 所以我最近的想法是将数据放入队列,然后在Application.Ready = True时排空队列。 为了实现这个,我需要在Application.Ready更改状态时触发一个事件,但是我无法在列表中find该事件。 有人知道这是否存在,以及如何揭露它? 或者,如果有人对如何使这项工作有更好的想法,我对此非常开放。 我唯一不能做的build议是使用RTD,而不是我已经调度 – 我不能改变那部分。 提前致谢!

如何获得通过Excel COM接口select的行数和列数?

我可以通过应用程序的.Selection属性来获取区域。 (我使用python来访问Excel的COM接口) 例如,我想知道用户select了多less行和列 input: user has selected A1:G8 output: the selected range starts from Column 1 (by selection.Column) the selected range starts from Row 1 (by selection.Column) the selected range is spanning 7 rows (by ?) the selected range is spanning 8 columns (by ?) 我在看MSDN的Range接口 ,但是这个属性似乎对这个问题没有帮助。

Excel运行时错误13

我已经经历了各种职位,无法找出我的问题。 我有一个COM对象,build立一个Excel.Range数据,并把它交给一个Excelmacros。 然后将其设置为Variant,然后用于填充范围。 很简单,这是工作,但现在不是我不明白为什么。 C#通过设置引起我的错误的Variant来传回正确的数据。 有任何想法吗? 代码如下: Dim rangeData As Variant rangeData = factory.Build(buildType) Worksheets(sheet).Activate Worksheets(sheet).range("A1:Z10000").Value = rangeData 工厂对象是我的C#COM对象。