Tag: com

添加新工作表到现有文件后C#interop:excel进程不退出

可能重复: 如何正确清理C#中的Excel互操作对象 我已经阅读了许多关于pipe理COM引用的其他线程,同时使用.Net-Excel互操作来确保Excel进程在退出时正确退出,到目前为止技术运行良好,但是最近我遇到了将新工作表添加到现有工作簿文件时出现问题。 下面的代码留下了一个僵尸Excel过程。 如果我将工作表添加到新创build的工作簿文件,它退出罚款。 如果我运行的代码不包括.Add()行,它退出罚款。 (我正在阅读的现有文件是由注释掉的代码创build的空文件) 有任何想法吗? //using Excel = Microsoft.Office.Interop.Excel; //using System.Runtime.InteropServices; public static void AddTest() { string filename = @"C:\addtest.xls"; object m = Type.Missing; Excel.Application excelapp = new Excel.Application(); if (excelapp == null) throw new Exception("Can't start Excel"); Excel.Workbooks wbs = excelapp.Workbooks; //if I create a new file and then add a […]

Excel插件与无缝撤消:可能吗?

我正在考虑实现一个使用COM( 而不是 VBA)的Excel加载项,它将处理工作表中的数据。 我将需要这个加载项与Undo堆栈无缝集成。 进一步来说: 这个加载项对数据的任何修改都需要用户撤销(通过标准的撤消操作) 需要保留插件操作发生之前撤消堆栈中的项目 到目前为止,我的(尽pipe敷衍)研究,Excel是否可以允许这一点还不清楚。 如果没有,这是一个showstopper,加载项将没有价值。 我的问题:这可能吗? 这更像是一个“是或否”的问题,而不是一个“如何”的问题,因为我需要知道我是否正在进行大雁追逐。 然而,任何关于如何做的指针都是一个好处。

为什么CoUninitialize在退出时会导致错误?

我正在使用C ++应用程序从Excel文件读取一些数据。 我有它的工作,但我对一部分感到困惑。 这里是代码(简化为只读第一个单元格)。 //Mostly copied from http://www.codeproject.com/KB/wtl/WTLExcel.aspx #import "c:\Program Files\Common Files\Microsoft Shared\OFFICE11\MSO.DLL" #import "c:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" #import "C:\Program Files\Microsoft Office\Office11\excel.exe" rename ("DialogBox","ExcelDialogBox") rename("RGB","ExcelRGB") rename("CopyFile", "ExcelCopyFile") rename("ReplaceText", "ExcelReplaceText") exclude("IFont", "IPicture") _variant_t varOption((long) DISP_E_PARAMNOTFOUND, VT_ERROR); int _tmain(int argc, _TCHAR* argv[]) { DWORD dwCoInit = 0; CoInitializeEx(NULL, dwCoInit); Excel::_ApplicationPtr pExcel; pExcel.CreateInstance(_T("Excel.Application")); Excel::_WorkbookPtr pBook; pBook = pExcel->Workbooks->Open("c:\\test.xls", […]

通过打开文件启动Excel时,Excel加载项不加载

有几个用户报告说,如果他们通过双击Excel文件启动Excel,那么加载项将不会加载。 但是,如果他们通过开始菜单(或快速启动工具栏)打开Excel,加载项加载正常。 一些细节,如果他们帮助: 这是一个COM加载项,用VB6编写。 该问题已在Windows XP / Excel 2003和Vista / Excel 2007系统中报告。 加载项实现了IDTExtensibility2。 启动模式设置为“启动时加载”。 任何想法的原因或如何解决这个将不胜感激。 更新:我相信我已经find了解决这个问题的方法。 当一个IDTExtensibility2 dll被注册时,它会自动为加载行为,加载项名称等创buildHKCU条目。但是我也有我的设置文件注册到HKLM的加载项,以便所有用户都可以使用机。 这导致系统上的registry项双重。 我不认为这将是问题的原因。 我手动编辑了HKCU的条目,而Excel似乎忽略了它们,并遵循了HKLM的条目。 但是,我收到另一位开发人员的提示,说明他们有同样的问题,他们的解决scheme是删除重复的registry项。 我试了一下,似乎已经解决了报告错误的(非常less的)人的问题。 下面的Inno设置代码将添加HKLM条目,仔细检查加载行为是否正确(因为我是偏执狂),然后删除HKCU条目。 将您的文件属性replace为您看到的全部大写。 [Registry] Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; Flags: uninsdeletekey Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; ValueType: string; ValueName: FriendlyName; ValueData: ADDIN_NAME Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; ValueType: string; ValueName: Description; ValueData: ADDIN_DESC Root: HKLM; Subkey: […]

C#Excel自动化导致Excel内存泄漏

我正在尝试使用C#与COM互操作库打开一套非常沉重的Excel工作簿。 我必须使用C#,因为我还需要启动macros,移动一些单元格,并开始一个自定义的Excel加载项,我的公司使用。 然后我的程序退出,将工作簿打开,每个都在一个单独的excel实例中。 当程序退出时,我不希望工作簿被closures。 问题是,当我的C#程序退出,随着时间的推移,Excel工作簿逐渐消耗更多的内存,直到他们从原来的500 MB内存消耗3.5演唱会的内存。 我曾经手工打开工作簿,工作表从未消耗过多的内存。 一旦我开始使用C#打开它们,由于内存使用量过大,它们开始中断。 我的理论是,当我与COM Excel对象交互时,我创build了一个内存泄漏。 以下是我的原始代码: using Excel = Microsoft.Office.Interop.Excel; … excelApp = new Excel.Application(); excelApp.Visible = true; excelApp.Workbooks.Open(filename, misValue, misValue, misValue, misValue, misValue, true, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue); excelApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic; 我阅读了关于如何使用Marshal来释放使用的信息,所以现在我正在尝试下面的代码,但是除了打开所有的表格并且看看它们是否消耗了太多的数据之外,没有简单的方法来testing它。 excelApp = new Excel.Application(); excelApp.Visible = true; Excel.Workbooks currWorkbooks = excelApp.Workbooks; Excel.Workbook currWorkbook […]

如何获得在VB.NET中编写的用于Excel的COM服务器安装并注册在自动化服务器列表中?

版本 Excel 2007,Windows Vista,VB.NET,带有.NET 3.5 sp2的Visual Studio 2008,MSI安装程序包。 我正在尝试做什么 我有一个用VB.NET编写的Excel UDF。 它是作为COM服务器公开的,因为您无法直接在.NET语言中创buildExcel UDF。 安装是一个真正的痛苦,因为没有任何安装设置似乎得到它是正确的; 他们都没有给你一个安装包,把COM服务器放到客户端机器上,注册了服务器,注册了types库,以及在Excel 2007的自动化服务器列表中可见的组件。 我试过了 以下是types库的安装设置,它们的缺陷在编译时和安装时显而易见: vsdrfComSelfReg 在编译安装项目时没有警告 模块xxx.tlb注册失败。 HRESULT -2147024703 组件的ProgID和GUID在registry中设置,但该组件不出现在自动化服务器列表中 vsdrfDoNotregister 编译期间没有警告 安装工作,但当然TLB没有注册 vsdrfCOM 编译时警告:警告:无法为名为“xxx.tlb”的文件创build注册信息 types库在安装过程中未被注册 正确的设置应该是vsdrfCOM,如下所述: 问:任何人都可以告诉vsdrfCOM在Visual Studio的安装项目中的含义吗? 当我在安装项目中检查添加文件的属性中的“注册”属性时可用。 答:这意味着Visual Studio将在构build时提取COM注册数据,并将其放入MSI文件(主要是MSI文件的registry表,还有类表)。 所以当你安装它的时候,你的代码不需要自行注册,因为文件被复制到磁盘并且registry项被创build。 它还将通过向MSI的TypeLib表添加条目来创buildtypes库注册。 许多困难似乎是Vista特有的。 尤其是,使用REGCAP实用程序从.TLB文件生成.REG文件在Vista中不起作用。 如果不是这样的话,那么这个build议可能是有用的 。 相反,它完全可以产生空的.REG文件。 我已经尝试了这个StackOverflowpost中的所有build议。 这篇文章对技术问题有很好的描述: “引用”对话框中的条目来自HKCR \ TypeLibregistry项,而不是来自HKCR \ CLSID。 如果你的程序集没有出现在引用对话框中,但编译后的DLL仍然可以使用你的COM程序集,这意味着你的程序集正确的注册了类和接口,但是types库本身不是。 这个问题 任何人都有如何使安装注册组件和types库的想法? 我无法访问Windows XP计算机。 […]

防止Excel退出

我缺less一个Excel.Application.Quit或一个Excel.Application.BeforeQuit事件。 有没有人知道模拟这些事件的解决方法? 我通过COM Interop从C#WinForms应用程序访问Excel。 给定一个Excel.Application对象,我怎么能: 最好防止Excel退出? 如果这是不可能的,我怎么能至less注意到 Excel退出? 请注意:因为我有一个Excel的应用程序的COM引用,当用户退出 Excel时, Excel进程不会退出 。 虽然这听起来是矛盾的,但事实就是如此。 通过“退出”,我的意思是用户点击窗口右上angular的“退出”或“十字button”。 窗口closures,文件被卸载,加载项被卸载,以及Excel除了我不知道的东西之外的任何东西。 但是我仍然可以使用Application对象来“恢复”进程并使Excel重新可见,尽pipe加载项然后丢失了,而且我还不确定尚未定义的状态是什么。 为了摆脱这个问题,我希望在一开始就取消退出(如果存在的话,可以考虑BeforeQuit Cancel = true ),或者至less在Excel退出时通知,这样我就可以释放COM对象使stream程真正退出,下一次我再次需要Excel时,我会知道我需要先启动它。 不幸的是,这是一个恶性循环: 只要Excel运行,我需要COM对象 。 所以我不能在 Excel退出前处理它们。 另一方面,只要COM对象存在,即使Excel假装退出,进程也不会退出,所以我不能等待进程退出事件或类似事件。 我有一种令人不快的感觉,就是我要把头撞到一堵砖墙上。

如何从Visual Studio C#使用Office?

在Visual Studio中添加Office的COM互操作的引用的技术是: 参考 添加参考 selectCOM选项卡 select“ Microsoft Office 11.0对象库” 神奇的命名参考出现: Microsoft.Office.Core Project.csproj文件显示引用的详细信息: <COMReference Include="Microsoft.Office.Core"> <Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid> <VersionMajor>2</VersionMajor> <VersionMinor>3</VersionMinor> <Lcid>0</Lcid> <WrapperTool>primary</WrapperTool> <Isolated>False</Isolated> </COMReference> 项目进入源代码控制,一切正常。 然后,使用Office 2007的开发人员将从源代码pipe理中获取该项目,并且无法构build它,因为此类引用不存在。 他(即我)检出.csproj文件,删除对的引用 Microsoft Office 11.0 Object Library 并重新添加COM引用 Microsoft Office 12.0 Object Library 而神奇的是一个命名参考出现: Microsoft.Office.Core Project.csproj文件显示引用的详细信息: <COMReference Include="Microsoft.Office.Core"> <Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid> <VersionMajor>2</VersionMajor> <VersionMinor>4</VersionMinor> <Lcid>0</Lcid> <WrapperTool>primary</WrapperTool> <Isolated>False</Isolated> </COMReference> 项目进入源代码控制,一切正常。 然后,使用Office 2003的开发人员从源代码​​pipe理中获取该项目,并且无法构build它,因为这样的引用不存在。 他(即不是我)检出.csproj文件,删除对的引用 Microsoft Office 12.0 […]

从Haskell的Excel中读取数据

我想从.xls文件中获取数据,而无需手动打开Excel。 一种可能性是使用COM自动化。 有com-1.2.3和hdirect软件包,但是我找不到如何在Excel中使用这些软件包的例子。 有没有人有这个解决scheme?

尝试使用Excel 2007执行Office自动化,但仍使用Excel 2003

环境: Windows XP机器 安装Excel 2007和Excel 2003(按顺序,不按时间顺序)。 C#3.5 问题: 当我使用PIA做一些Office自动化时,我使用下面的代码行: var excel = new ApplicationClass(); PIA的版本专门将其称为Excel 12。 C:\ Windows \组件\ GAC \的Microsoft.Office.Interop.Excel \ 12.0.0.0__71e9bce111e9429c \ Microsoft.Office.Interop.Excel.dll 但: excel.Version;//this is 11.0 instead of 12.0 因此,当我尝试打开扩展名为.xlsx的文件时,它会警告我在文件转换中丢失的function,并用excel 2003打开它。我非常肯定它与安装顺序是2007 – > 2003有关,但我不能卸载2003在我的机器上我们有一些办公自动化在我们的networking服务器上使用excel 2003的无关项目。 我已经看了Policy.11.0.Microsoft.Office.Interop.Excel.config的东西,但它说 <bindingRedirect oldVersion="11.0.0.0" newVersion="12.0.0.0"></bindingRedirect> 所以,我不知所措。 为什么我不能告诉COM Interop要使用哪个版本的Excel?