Tag: com interop

我怎样才能加快从C#中创buildExcel电子表格?

我目前正在使用C#COM Interop使用Excel 2007编写大约200个Excel电子表格。 不幸的是我需要大约4分钟的时间来写这200张纸 – 每张纸都有大约1000行,每行8-10列。 我如何加快速度? 我的代码基本上是这样的: var xlApp = new Excel.Application(); xlApp.DisplayAlerts=false; foreach (x in z) { var wb = xlApp.Workbooks.add(XLWBATemplae.xlWBATWorksheet); var ws = (Worksheet)wb.Worksheets[1]; //fill data into sheet wb.SaveAs(fileName); wbClose(); } 澄清:我现在正在填充每个单元格 我会尝试一些你的build议,然后接受最好的解决scheme。

运行代码时,退出Interop控制的Excel

我已经在C#中为Excel编写了一个包装器,以允许在批处理过程中(在JobScheduler下)运行Excel工作簿。 我的问题是这个… 如果代码运行时间过长或需要通过作业调度程序终止,则包装程序需要处理此终止事件。 为此我补充说 SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true); 进入代码。 在ConsoleCtrlCheck方法中,我调用一个公共的出口例程(在正常或终止的情况下使用)。 根据MSbuild议,此路由select会执行以下操作。 closures并发布工作簿 closures并发布Excel 垃圾收集 然后用被调用的Excel方法(入口点)的返回码退出。 这很好。 但是,如果VBA代码仍在运行,Interop对象将不会响应工作簿closures或应用程序退出调用。 这可能是因为一切正在缓慢或由于模态对话已经发出。 为了应付这个问题,我在这个常见的例行程序中join了以下内容: 创build新的线程来运行KillExcel方法 KillExcel方法睡眠一段时间(所以正常的退出代码有机会工作),然后杀死进程 如果正常的代码工作,它会在线程中调用Abort private static void Cleanup() { // Give this X seconds then terminate mKillThread = new Thread(KillExcel); mKillThread.IsBackground = false; mKillThread.Start(); … // close the workbooks and excel application // Marshal.FinalReleaseComObject etc GC.Collect(); GC.WaitForPendingFinalizers(); // […]

Excel互操作实例将不会closures

我正在使用Excel Interop。 在我得到的一个方法的开始,我分配了一个新的应用程序的实例,在它的结尾,我试图释放它,但是当我看着TaskManager,我仍然可以看到Excel打开。 这是代码: 类成员: private Excel.Application _app; 用法: public void MethodApp() { _app = new Excel.Application(); …. …. FreeApplicationResources(); } private void FreeApplicationResources() { _app.Quit(); Marshal.ReleaseComObject(_app); } MethodApp可以运行多次,并以与调用次数相同的数量打开实例。 为什么Excel不能closures?

跟踪添加和删除的工作表

我正在做一个Excel插件,并且遇到了障碍。 我想用Excel工作簿中的工作表来更新combobox。 目前我能用foreach循环做到这一点。 然而,这是有限的,只是在我运行它的时候才拿起加或减的表单。 我的插件看起来俗气的“刷新表”button,我想避免这种情况,如果可能的话。 理想情况下,我可以将工作表对象绑定到combobox,以便在没有我的干预的情况下即时更新。 但是,我的研究发现,它不支持。 我还没有尝试过,因为我不在我的开发电脑前,直到后来,但我几乎积极,因为它不会inheritanceIList它不会作为一个数据源工作。 有没有人做过类似的事情? 我真的很想让这件事情正常工作。 谢谢!

C#COM互操作:写入Excel工作表单元格

我正在使用Microsoft.Office.Interop.Excel在一个WinForm中,我正在阅读一个Excel文件,处理数据,并输出一个新的Excel文件。 不过,我无法写入单元格 – 专门添加列标题。 代码如下: Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); Worksheet ws = (Worksheet)wb.Worksheets[1]; for (int i = 0; i < dt.Columns.Count; i++) { for (int j = 0; j < dt.Rows.Count; j++) { ws.Cells[j + 1, i] = dt.Rows[j][i].ToString(); } } ws.Cells[0, 0] = "Ticket Number"; ws.Cells[0, 1] = "Transit"; […]

Excel Interop打开Excel的macros,禁用macros

在加载excel文件之前,C#中有没有办法在excel中closuresmacros? 我正在使用Excel Interop加载Excel文件。 我能看到的只是VB.NET的解决scheme。 感谢Nishant

在一次调用中从Excel中检索多个单元格属性?

我需要检索几千个单元格的背景属性( Range.Interior.Color )。 由于COM-Interop的限制,单独循环访问每个单元非常慢。 是否有可能从单个调用中包含多个单元格的Range中检索不是.Text , .Value或.Value2单元格属性?

如何正确清理C#中的互操作对象

这是如何正确清理C#中的Excel互操作对象的问题 。 gyst是在Excel命名空间内使用链接调用(例如,ExcelObject.Foo.Bar())防止COM对象的垃圾收集。 相反,应该显式创build一个对每个使用的COM对象的引用,并使用Marhsal.ReleaseComObject()明确地释放它们。 仅在特定于Excel COM对象的链接调用之后不释放COM对象的行为? 每当一个COM对象被使用时,应用这种模式是否有点矫枉过正?

Excel互操作 – 如何停止数字(存储为文本)被“评估”

我想知道是否有人遇到以下问题,并有如何解决它的任何想法:我正在通过Interop从C#应用程序(.NET 3.5)导出到Excel(2003)的数据。 其中一列存储显示为数字的string值。 也就是说这是一个以0,例如000123开头的数字 我需要存储完整的号码,因为它可能是一个序列号或类似的东西。 Excel不喜欢这个,所以我想我可以通过设置目标单元格来解决这个问题。 当我导出到Excel时,我发现存储123而不是000123。 我已经通过debugging中的应用程序运行,并从我发现的监视列表(对于“Range range”: range.NumberFormat = "General"` this.Rows[iGridRow].Cells[iGridCol].Value = "000123" '/* (datagrid is not truncating it)*/ range.Value2 = 123.0 它似乎被作为一个数字处理,即使我在此之前设置数字格式: range.NumberFormat = sNumberFormat; range = (Range)sheet.Cells[iExcelRow, iExcelCol]; range.Value2 = this.Rows[iGridRow].Cells[iGridCol].Value.ToString(); 任何人都可以请帮忙?

在互操作期间延迟Excel计算C#

我必须从C#程序input数百个单元格到Excel表格中。 每次我设置一个单元格或范围,Excel缓慢地响应…大概更新我添加的每个input之间的各种输出。 有没有办法从我的C#程序中禁用计算,并在完成设置单元并准备读取输出后重新启用它?