Tag: com

悬挂互操作COM对象的问题

我有一个应用程序使用COM互操作来创build一个电子表格,在客户端的机器上的Excel中打开。 不过,如果我查看任务pipe理器,用户closuresExcel时EXCEL.exe进程并不总是结束。 如果我保存工作簿并以编程方式closuresExcel,则只需使用Marshal.ReleaseComObject()进行清理,但由于我依赖于手动closures程序,所以我不知道该怎么做。 有什么build议么?

Python干净的方式来包装单个语句在一个try块除外

我目前正在使用com做一些Python自动化的Excel。 它function齐全,做我想做的,但我发现了一些令人惊讶的事情。 有时,我使用的一些Excel命令将会失败,并且没有明显的原因。 其他时候,他们会工作。 在我正在做的VB的等价代码中,这个问题显然被认为是正常的,并用一个On Error Resume Next语句贴满。 当然,Python没有这样的说法。 try except循环try except ,我不能在整个集合中包装整个集合,因为它可能在一半以内“失败”,并且不能正确完成。 那么,将几个独立的语句封装到除了block之外的尝试中是怎样的一种pythonic方法呢? 具体来说,比以下更清洁: try: statement except: pass try: statement except: pass 相关的代码是excel.Selection.Borders位。 def addGridlines(self, infile, outfile): """convert csv to excel, and add gridlines""" # set constants for excel xlDiagonalDown = 5 xlDiagonalUp = 6 xlNone = -4142 xlContinuous = 1 xlThin = 2 […]

注册在客户端计算机上注册的针对Excel编写的COM服务器的问题(无法设置mscoree.dll的完整path)

在这个前面的问题< 如何获得在VB.NET中编写的Excel的COM服务器安装和注册在自动化服务器列表中? >有一个示例,说明如何使用VS 2008创buildregistry项的完整path。除了我设置的完整path(使用VS中的registry编辑器),mscoree.dll无法正常工作(这意味着它什么都不做)。 完整的registrypath是: HKEY_CLASSES_ROOT \ CLSID \ {my_GUID} \ InprocServer32的\(默认) 我设定的值是: [SystemFolder] MSCorEE.dll中 我可以把任何东西(包括硬编码的完整path),但设置似乎并不重要,registry总是包含mscoree.dll没有任何path。 我已经尝试通过VS添加另一个值到registrypath,并正常工作,包括由[SystemFolder]指定的完整path。 我需要完整path的原因是(如前面的问题所述),如果没有path,Excel会在自动化服务器被选中时产生一个错误,因为它找不到mscoree.dll(有趣的是,即使我收到一个错误, )。 我正在通过安装项目安装,否则工作正常。 我在VISTA * 64系统上安装,但是在其他操作系统上却得到了相同的错误。 有谁知道我在做什么错?

我如何强制python(使用win32com)创build一个新的Excel实例?

我正在自动化一些需要很长时间的Excel相关任务。 我创build一个Excel实例使用: excel = win32.gencache.EnsureDispatch('Excel.Application') wb = excel.Workbooks.Add() 然而,脚本开始运行后,如果我select打开的Excel工作簿(而不是一个Python正在工作),python脚本崩溃。 但是,如果我打开一个新的Excel工作簿并input东西,python脚本不受影响。 有没有一种特殊的方式可以调用excel来防止这种情况的发生? 还是其他解决scheme? 编辑:这似乎工作。 excel = win32.DispatchEx('Excel.Application')

当.visible = $ false时,Powershell excel刷新失败,“被调用被拒绝”

我已经有很长一段时间了这个问题,只是懒惰的忽略它,但是我现在需要find一个解决scheme。 我有一个自动刷新大量Excel文档的脚本。 这工作得很好,但是,如果我将Visible属性设置为false在工作簿上存储在networking共享失败。 重申一遍,将可视属性设置为false进行刷新可以在本地文件上正常工作,但是保存在\ location上的任何工作簿都会失败,并显示“被调用者拒绝调用”错误。 所有刷新都可以正常工作。 这是我的代码: #Create Excel COM object and set it up for use. $excel = new-object -comobject Excel.Application; $excel.DisplayAlerts = $false; #If this is set to false, saving the file on a network share will fail. Reason : Unknown. $excel.Visible = $true; #Open workbook which should be refreshed. $excelworkbook = $excel.workbooks.Open($workbook); […]

Python:无需剪贴板,从Office / Excel文档访问embedded的OLE

我想使用Python添加和提取Office / Excel文档中的文件。 到目前为止,添加东西很容易,但是对于解压缩我还没有find一个干净的解 为了清楚我已经得到了什么,以及我已经写了下面的小例子test.py ,并进一步解释。 test.py import win32com.client as win32 import os from tkinter import messagebox import win32clipboard # (0) Setup dir_path = os.path.dirname(os.path.realpath(__file__)) print(dir_path) excel = win32.gencache.EnsureDispatch('Excel.Application') wb = excel.Workbooks.Open(dir_path + "\\" + "test_excel.xlsx") ws = wb.Worksheets.Item(1) objs = ws.OLEObjects() # (1) Embed file f = dir_path + "\\" + "test_txt.txt" name = […]

Excel interop在Office 2007的机器上工作,但在Office 2010的机器上失败

我有一个C#WPF(.NET 4.0)应用程序使用Excel互操作来从Excel文件中读取数据。 当我在我的开发机器上运行这个应用程序,它有Excel 2007,它工作正常。 当我在其上安装了Excel 2010的另一台计算机上运行它时,失败,并显示以下错误消息: System.Runtime.InteropServices.COMException(0x80040154):由于以下错误,检索具有CLSID {00024500-0000-0000-C000-000000000046}的组件的COM类工厂失败:80040154类未注册(exception来自HRESULT:0x80040154(REGDB_E_CLASSNOTREG ))。 尝试创buildMicrosoft.Office.Interop.Excel.Application对象时发生失败,如下所示: var app = new Application(); 我的项目有一个参考Microsoft.Office.Interop.Excel.dll (版本14.0.0.0,运行版本v2.0.50727),它位于: C:\ Program Files \ Microsoft Visual Studio 10.0 \ Office \ PIA \ Office14 \ Microsoft.Office.Interop.Excel.dll Visual Studio工具 我试图运行与引用的DLL上的默认设置的应用程序: 复制本地=假 embedded互操作types=真 特定版本=真 我也尝试在引用的dll上使用以下设置运行应用程序: 复制本地=真 embeddedInterop Types = False 特定版本=真 但在使用Office 2010的计算机上,这两种尝试都没有奏效。 其他说明:Office 2010的机器是64位W / Windows 7.我的开发机器是Windows XP的X86。 题 […]

到目前为止,使用COM对象的正确方法是什么?

这是一个非常普遍的问题,我决定提出这个问题,因为这个问题可能与今天有不同的答案。 希望这些答案将有助于理解什么是使用COM对象的正确方法。 就个人而言,在对这个问题有不同的看法后,我感到非常困惑。 过去5年来,我曾经使用COM对象,规则对我来说非常清楚: 在代码行中使用单个句点。 使用多个句点在场景后面创build不能被明确释放的临时对象。 不要使用foreach,而是使用for循环,并在每次迭代中释放每个项目 不要调用FInalReleaseComObject,而是使用ReleaseComObject。 不要使用GC释放COM对象。 GC意图主要用于debugging使用情况。 以与创build相反的顺序释放对象。 读完这些最后一行后,你们中的一些人可能会感到沮丧,这就是我如何正确地创build/释放Com Object所知道的,我希望得到的答案能够使它更加清晰和无可争议。 以下是我在这个主题上find的一些链接。 其中一些人告诉说需要调用ReleaseComObject,而其中一些则不是。 如何正确释放Excel COM对象 (2013年11月) 在.NET中释放COM对象的正确方法 (2011年8月) Marshal.ReleaseComObject认为危险 (2010年3月) ReleaseCOMObject (2004年4月) “…在VSTO场景中,你通常不需要使用ReleaseCOMObject …” MSDN – Marshal.ReleaseComObject方法 (当前的.NET Framework版本): “…您应该使用此方法释放包含引用的基础COM对象…” 更新: 这个问题被标记为太宽泛。 按照要求,我会尽量简化并提出更简单的问题。 使用COM对象时是否需要ReleaseComObject或调用GC是正确的方法? VSTO方法是否改变了我们用COM对象的方式? 我写的上面哪个规则是必需的,哪个是错的? 还有别的吗?

在Excel VBA中使用New关键字和调用CreateObject有什么区别?

我应该使用什么标准来决定我是否像这样编写VBA代码: Set xmlDocument = New MSXML2.DOMDocument 或者像这样: Set xmlDocument = CreateObject("MSXML2.DOMDocument") ?

作为计划任务运行时,Powershell脚本无法访问文件

我的Powershell(2.0)脚本具有以下代码片段: $fileName = "c:\reports\1.xlsx" $xl = new-object -comobject excel.application $xlFormat = [Microsoft.Office.Interop.excel.XlFileFormat]::xlWorkbookDefault $xl.displayalerts = $false $workbook = $xl.workbooks.open($fileName) #Code to manipulate a worksheet $workbook.SaveAs($fileName, $xlformat) $xl.quit() $error | out-file c:\reports\error.txt 我可以在Powershell命令提示符下运行这个脚本,没有任何问题。 电子表格被更新,并且error.txt是空的。 但是,当我在任务计划程序中将其作为任务运行时,第一行出现错误。 使用“1”参数调用“打开”的exception:“Microsoft Office Excel无法访问文件'C:\ reports \ 1.xlsx'。有以下几种可能的原因:文件名或path不存在。正在被另一个程序使用您尝试保存的工作簿与当前打开的工作簿具有相同的名称。 我使用与在Powershell命令提示符下运行脚本相同的凭据来运行该任务。 当我手动运行脚本时,它可以打开,更新和保存电子表格而不会出现问题。 当我在任务计划程序中运行它时,它不能访问电子表格。 所讨论的文件对于所有用户是可读/可写的。 我已经validation了我可以使用相同的凭据在Excel中打开文件。 如果我制作一个新的电子表格,并将其名称作为$文件名,我会得到相同的结果。 我已经validation在任务pipe理器中没有Excel.exe的实例。 奇怪的是,如果我使用get-content,我没有任何问题。 另外,如果我制作一个新的电子表格,我没有任何问题。 $fileName = "c:\reports\1.xlsx" $xl = get-content $spreadsheet […]