Tag: office interop

Excel VSTO加载项:无法在MessageBox.Show(“Test”)后重新激活Excel;

我正在实现一个显示一些模式对话框的VSTO Excel加载项。 这些对话框在Windows任务栏中不显示为自己的窗口。 但是在某些情况下,这些对话框不是从Excel顶端消失,不能通过使用任务栏回来! 整个故事(用Windows XP – 7,Excel 2007 – 2010重现): 我打开Excel并创build两个或更多新的工作簿 我显示一个模式对话框,让我们说通过“MessageBox.Show”我打开“记事本”,并最大化其窗口 我尝试通过Windows任务栏重新激活其中一个Excel工作簿窗口 我期望:Excel将拿出我的模态MessageBox出现在上面 实际结果是:当您单击Windows任务栏中的工作簿项时,MessageBox或任何Excel工作簿都不会出现! 为什么??? 我可以通过Ctrl + Tab重新激活Excel。 然后我的模式对话框/ MessageBox正确的在上面。 如果您有Visual Studio和Excel,则很容易重现。 请帮忙! 问候,约尔格 代码示例: 只需创build一个空的Visual C#/ Office / 2010 / Office 2010加载项 用下面的代码replace“ThisAddIn.cs”的内容: – namespace ExcelAddIn6 { public partial class ThisAddIn { private void ThisAddIn_Startup(object sender, System.EventArgs e) { NativeWindow excelWindowThatIsTheOwner = […]

使用click once on non dev pcs从GAC中缺lessMicrosoft.VisualStudio.OfficeTools.Controls.ManagedWrapper

我们在应用程序中使用Microsoft.Office.Interop.Excel和Microsoft.Office.Tools.Excel将datagrid导出到Excel。 我们也使用一次点击部署,现在clickonce说应用程序需要Microsoft.VisualStudio.OfficeTools.Controls.ManagedWrapper安装在GAC中。 通常,当我们得到这个错误时,通常可以将dll添加到项目中,或者有人忘了在dll上设置一个属性 – 但是这个dll是不同的 – 它已经在我的电脑的GAC中,在C:\ WINDOWS \程序集和文件不能被删除。 得到这个文件并将其添加到我的项目中的正确方法是什么? 我已经看到需要registry编辑的事情,以及“从gac中获取dll”的东西,但是这是必要的吗? 编辑:这是一个C#WPF项目。

C#Interop执行后不closuresExcel进程

我有以下代码块: Excel.Application xlApp = new Excel.Application(); Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(this.pathToFile); Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1]; Excel.Range xlRange = xlWorksheet.UsedRange; 我将xlRange推入一个数组,使用: someArray = (System.Object[,])xlRange.Value2; 之后,我尝试清理: Marshal.ReleaseComObject(xlRange); Marshal.ReleaseComObject(xlWorksheet); xlWorkbook.Close(); Marshal.ReleaseComObject(xlWorkbook); xlApp.Quit(); Marshal.ReleaseComObject(xlApp); 但是,即使所有四个excel对象都与Marshal发布,该进程仍保持打开状态,并防止再次打开该文件。 有关如何正确清理Interop excel对象的任何想法?

MS Interop Word,Excel多个打开的文件DocumentBeforeClose处理

我有我的应用程序中的Windows资源pipe理器模块。 我想处理打开和closures单词和Excel模块中的文件。 当我同时打开fe 4-5文件时,closures处理程序无法正常工作。 问题是:有时在closuresWord应用程序后,我的应用程序不停止在wordDocEvents_DocumentBeforeClose函数的开始处的断点处。 似乎有一些相关的进程间通信,因为每个打开的文件都是一个新的进程。 如果是已知问题,请帮忙,否则我会尝试在我的代码中做一些事情。 代码快照: if (_wordApp == null) { _wordApp = new Word.Application(); _wordDocEvents = (Word.ApplicationEvents4_Event)_wordApp; if (!isLocked) { //_wordDocEvents.Quit += new Word.ApplicationEvents4_QuitEventHandler(wordDocEvents_Quit); _wordDocEvents.DocumentBeforeClose += new Word.ApplicationEvents4_DocumentBeforeCloseEventHandler(wordDocEvents_DocumentBeforeClose); _wordDocEvents.DocumentBeforeSave += new Word.ApplicationEvents4_DocumentBeforeSaveEventHandler(wordDocEvents_DocumentBeforeSave); _wordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone; } } _wordApp.Visible = true; Word.Document oDoc = _wordApp.Documents.Open(fileName, null, isLocked); oDoc.Activate(); _wordApp.Visible = true; _wordApp.Activate(); closures处理程序 […]

工作表没有被删除 – 添加一个新的会导致名称冲突错误

foreach (Excel.Worksheet sheet in m_objExcel.Sheets) { if (sheet.Name == "Before & After Lube Weight") { //sheet.Delete(); (Excel.Worksheet)m_objExcel.Sheets[6]).Delete(); m_objSheet = (Excel.Worksheet)m_objSheets.Add(m_objSheets[6], Type.Missing, Type.Missing, Type.Missing); m_objSheet.Name = "Before & After Lube Weight"; } } 上面的代码用于用新的工作表覆盖现有的工作表。 我试图一行一行的debugging,所有的代码工作正常,但工作表永远不会被删除之前添加具有相同名称的另一个工作表(注意框架2.0)。 发生exception消息 错误:无法将名称重命名为另一张纸 我相信这是因为以前的工作表没有正确删除。

如何捕获Excel工作簿打开完成?

我打开巨大的工作簿使用Excel互操作,我需要保存工作簿后打开完成为什么,因为保存后,只有我的插件选项卡启用,所以我想跟踪工作簿打开完成。 现在我通过在打开和保存工作簿之间插入睡眠来处理这个问题。 有没有更好的方法来获得开放完整的Excel。 Excel.Application app = new Excel.Application(); Excel.Workbook wb = app.Workbooks.Open(fileName); Thread.Sleep(5000); wb.Save(); 完成后如何保存工作簿。 在这里,我假设工作簿在5秒内完全打开,但这不是一个好的解决scheme。 任何人都可以帮我解决这个问题吗?

为什么Windows Forms应用程序不会将文件保存到文件夹

我有一个Windows窗体应用程序。 在这个应用程序中,我保存一个Excel文件到文件夹。 这是保存文件的function: Public Sub ExportToXls(ByRef dt As DataTable, ByRef path As String) On Error Resume Next 'I use Microsoft.Office.Interop.Excel version = 12 Dim xlApp As Microsoft.Office.Interop.Excel.Application Dim xlWorkBook As Microsoft.Office.Interop.Excel.Workbook Dim xlWorkSheet As Microsoft.Office.Interop.Excel.Worksheet Dim misValue As Object = System.Reflection.Missing.Value xlApp = New Microsoft.Office.Interop.Excel.ApplicationClass xlWorkBook = xlApp.Workbooks.Add(misValue) xlWorkSheet = xlWorkBook.Sheets(1) For i1 As Integer […]

C#Excel COM互操作抛出exception“HRESULTexception:0x800A03EC”

范围: 我正在使用epplus和Excel COM Interop来实现自动生成报告。 由于EPPlus无法实现的任务,我发现自己被迫使用Excel COM来覆盖EPPlus中所有缺失的function。 基本上我工作的方式是: 1 – 在我的数据库上执行一个查询 2 – 将结果转储到“base_sheet”(带头文件) 3 – 使用“base_sheets”创build数据透视表。 这总是有效的,因为我一直在使用这个策略很长一段时间。 Interop用法: 整个stream程可以通过仅使用EPPlus来实现(这不会产生任何问题),除了预select数据透视表filter。 (就像下图所示,而不是显示“所有”元素,我只希望那些匹配“PG”,这个filter)。 问题: Exception from HRESULT: 0x800A03EC名为Exception from HRESULT: 0x800A03EC的错误引发了调用有关数据透视表(内置于Excel Interop)的方法。 一些代码示例: – 样品#1 // Creating Interop Object _excelApp = new Application(); _workbook = _excelApp.Workbooks.Open(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, […]

调用接口的无参数构造函数

有一天我得到一个任务,导出一些数据到Excel中,我看的第一件事是Microsoft.Office.Interop.Excel图书馆,我不知道这可能不是最好的办法,但无论如何,什么让我陷入困境的是,我不得不做一个interface的实例。 是的,如果它实现了相应的interface你可以把一些对象的引用作为一个interface ,但我不是在谈论这个。 基本上这是我正在谈论的代码行。 Microsoft.Office.Interop.Excel.Application aa = new Microsoft.Office.Interop.Excel.Application(); 几乎这只是一个常规的对象实例化,如果Microsoft.Office.Interop.Excel.Application不是一个interface ,那就没有什么特别的了。 现在,当你还处于早期教育阶段时,你所学到的关于接口的第一件事就是,你不能创build一个interface实例。 但是这certificate这是错的。 那么,不完全是因为这是它背后产生的IL IL_0001: ldstr "00024500-0000-0000-C000-000000000046" IL_0006: newobj instance void [mscorlib]System.Guid::.ctor(string) IL_000b: call class [mscorlib]System.Type [mscorlib]System.Runtime.InteropServices.Marshal::GetTypeFromCLSID(valuetype [mscorlib]System.Guid) IL_0010: call object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type) IL_0015: castclass Microsoft.Office.Interop.Excel.Application 现在在这里,没有什么说“做一个接口的实例”(正如我所猜测的),所以它正在做interface构造函数的背后。 但是我的问题依然存在。 怎样才能在interface使用这种语法,为什么编译器不会抱怨呢,一个普通的开发人员能做出这样的事情呢? 任何想法将appriciated。

仅在Excel Interop中获取一个列的UsedRange

使用Microsoft的Excel Interop我正在阅读电子表格。 我没有问题得到整个工作表的使用范围,但我想获得只用于一列的行数。 这是我的工作表的一个例子: 正如你所看到的,列A的使用范围只有3行,而列B是5行。 当我使用我目前的代码: int rows = sheet.UsedRange.Rows.Count; 总是返回“5”。 我如何指定我只想要一个单元格的使用范围?