Tag: com

如何通过COM遍历Excel 2003工作表中的所有分页符

我一直试图通过COM检索给定的Excel 2003工作表上的所有分页符的位置。 这是我想要做的事情的一个例子: Excel::HPageBreaksPtr pHPageBreaks = pSheet->GetHPageBreaks(); long count = pHPageBreaks->Count; for (long i=0; i < count; ++i) { Excel::HPageBreakPtr pHPageBreak = pHPageBreaks->GetItem(i+1); Excel::RangePtr pLocation = pHPageBreak->GetLocation(); printf("Page break at row %d\n", pLocation->Row); pLocation.Release(); pHPageBreak.Release(); } pHPageBreaks.Release(); 我期望这打印出pSheet的每个水平分页符的行号。 我遇到的问题是,虽然count正确表明在工作表中分页的数量,我似乎只能检索第一个。 在循环的第二次运行中,调用pHPageBreaks->GetItem(i)将抛出一个exception,错误号为0x8002000b,“无效索引”。 尝试使用pHPageBreaks->Get_NewEnum()来获得一个枚举器迭代集合也失败,同样的错误,立即调用Get_NewEnum() 。 我已经四处寻找解决scheme,到目前为止我发现的最接近的东西是http://support.microsoft.com/kb/210663/en-us 。 我试过激活分页符以外的各种单元格,包括超出要打印范围的单元格,以及右下angular的单元格(IV65536),但没有帮助。 如果有人可以告诉我如何让Excel返回表单中所有分页符的位置,那真是太棒了! 谢谢。 @Joel:是的,我试图显示用户界面,然后将ScreenUpdating设置为true – 它产生了相同的结果。 此外,我从此尝试了在调用HPageBreaks集合之前设置pSheet->PrintArea到整个工作表和/或调用pSheet->ResetAllPageBreaks()的HPageBreaks ,这也没有帮助。 @Joel:我已经使用了pSheet->UsedRange来确定要滚动的行,并且Excel滚动了所有水平的中断,但是当我尝试访问第二个时,我仍然遇到同样的问题。 不幸的是,切换到Excel 2007也没有帮助。

从Excel发送命令到应用程序? COM?

我写了一个设备控制器(rs232),它正在被成功地使用,但是用户想从Excel中查看数据并控制设备(或者通过我的程序进行通信)。 我认为DDE是一个选项,发现RTD(IRtdServer)可能是一个好的开始(虽然没有办法从实时数据客户端将数据发送回“服务器”)。 我发现这些RTD部分的资源: http : //support.microsoft.com/? id= 327215和http://support.microsoft.com/?id=327215 这是一个multithreading的应用程序,我已经添加了在com端口上有多个侦听器的function,以便我可以更新多个客户端。 我将添加COM接口到EXE。 但是之后我需要的是通过我的应用程序从Excel控制我的应用程序/代理命令到设备的方法。 什么是最好的方法来做到这一点? 也许另一个COM接口,并从VBA或什么的? 我不熟悉从Excel使用脚本,所以也许有人可以提供示例代码或链接,显示COM对象的代码和附带的VB(A?)代码? 请记住,这是一个非托pipe的C ++应用程序,它现在不能转换为托pipe或C#。 也欢迎使用C#的替代scheme,但这是一个长期的重写。 谢谢 编辑我有一个替代COM添加到现有的EXE支持。 我认为添加一个双向通信更为灵活(跨平台 – 也许提升或corba或直接IP基于我自己的消息协议) 一个COM服务器(或两个)可以包装该通信通道 – 不pipe它是什么。 这并不真正影响我的问题 – 我仍然想知道从Excel中控制外部EXE的选项。 编辑不必为客户推出.NET也是一大利好。 许多这些设备是在电脑上是相当古老,可能有NT或XP,我不津津乐道的增加我的设置/安装包从700KB到荒谬的.NET安装大小…

用Tcl Tk打开Excel和PDf文件

我有问题用Tcl Tk打开现有的Excel文件。 我能打开一个现有的MS Word文件没有问题。 我正在使用的代码如下,我的testing应用程序也有“package require tcom”包括: proc OpenFile {} { #Path to file set app [::tcom::ref getobject "C:\\Users\\Me\\Desktop\\Test.doc"] #Change path to application set this [$app Application] #Open application $this Visible 1 } 该代码由一个button执行。 基本上,按下button后Test.doc被打开。 我尝试将文件更改为现有的Excel文件,当我按下button时,文件打开一瞬间,然后closures。 MS Access文件也是如此。 有谁知道如何用Tcl Tk打开现有的Excel文件,并保持打开状态? 另外,对于PDF和文本文件,我知道我不能使用Tcom打开这些文件。 有谁知道如何用Tcl Tk打开PDF,文本和其他非MS文件? 我真的很感谢你的帮助! 谢谢, DFM

在不安装excel的情况下访问服务器中的excel文件

我创build了一个库来传递/从Excel中获取数据。 要在我的机器上执行,我修改了COM +控制台中的访问权限。 事情是,我感兴趣的上传这个组件到我的在线服务器,但在那里我还没有安装Excel。 有没有办法在没有安装excel的情况下在COM +中注册excel? 提前致谢。 最好的祝福。 何塞

在Excel中以编程方式导入图片变得太慢了

我已经写了一个Windows窗体应用程序,其中对于Excel文件的每一行,我导入位于我的Intranetnetworking上的服务器上的jpg图片。 Excel文件由大约2000行组成。 插入图片的代码如下所示: String currentFilePath = getCurrentFileName(pictureDirectory, stagione, currentLine, currentModello, currentMateriale, currentColore); Excel.Range oRange = (Excel.Range)xlWorkSheet.Cells[rowIndex, indexColumnFoto]; Picture picture = ((Pictures)xlWorkSheet.Pictures(Type.Missing)).Insert(currentFilePath, Type.Missing); picture.Left = (double)oRange.Left; picture.Top = (double)oRange.Top; if (picture.Height > (double)oRange.Height) { if (picture.Height > 400) { oRange.RowHeight = 400; } else { oRange.RowHeight = picture.Height; } } 这个操作在BackgroundWorker中运行,一切正常,除了一段时间后,这个过程变得非常缓慢。 我已经在网上寻找解决scheme,但我什么也没find。 我find的唯一解决scheme是在Excel中导入文本而不是图片的代码段。 如果您有任何想法,请告诉我。 考虑到我的用户抱怨,但我认为在Excel中导入1500-2000图像的软件应该是相当慢的,不是吗? 还有一件事,正如你所看到的,我用COM来完成这项工作。 […]

.NET COM程序集通过BackgroundWorker与Excel进行交互

我正在写一个VB.NET 3.5中的实验程序集,并通过COM公开,然后从一些Excel VBA代码调用来启动一个类的实例,该类捕获一些Excel事件,然后执行一些functionExcel中的活动工作簿。 要启动该类,从VBA传递对Excel应用程序的引用(我在程序集中使用PIA for Excel)。 我需要从我的程序集中对活动工作簿执行耗时的操作,所以我决定在WinForm中使用BackgroundWorker ,这样我可以在后台操作完成时显示操作的进度对话框。 我想知道是否有任何问题与COM交互使用COM这样的背景工作者通过COM? 提出问题的原因是程序集中的主类保留对Excel应用程序对象的引用,然后将其传递给BackgroundWorker以便它可以确定活动工作簿,然后对其执行一些操作。 我只通过一个过程访问工作簿本身(而不是其他对象)。 由于某种原因,我的脑海里,Excel可能不会这样 – 我说得对吗?

将多个excel文件合并成一个

这里有个问题,我有几个生成的excel文件,每个文件都有1个选项卡(但这并不是说未来将不会有更多)。 我需要写的是一个可以打开每个文件的过程,并将其所有工作表(选项卡)复制到一个新文件中。 最后,这个新文件应该包含所有其他文件的工作表。 目前,我已经创build了以下来完成转换之间的Excel格式。 我不太确定从哪里去,我没有任何我用来创build这个的来源…并不太确定对象模型(为了将标签复制到一个新的文件)或者我将面对的问题,并确保我保持一切清理。 object excelApplication = null; object workbook = null; object workbooks = null; try { // Get the Remote Type var excelType = Type.GetTypeFromProgID("Excel.Application", Properties.Settings.Default.ExcelServer, true); // Instantiate the type excelApplication = Activator.CreateInstance(excelType); // Turn off Prompts excelApplication.GetType().InvokeMember( "DisplayAlerts", BindingFlags.SetProperty, null, excelApplication, new Object[] { false }); // Get a reference […]

通过Matlab在Excel中插入图像

我正在使用函数, Shapes.AddPicture插入一个Excel文件中的图像。 我正在调用像这样的例程: leftPlacement=450; topPlacement=20; imgWidth=350; imgHeight=300; Shapes.AddPicture([pwd '\' img] ,0,1,leftPlacement,topPlacement,imgWidth,imgHeight); 这工作正常。 但是,图像掩盖了文件中的数据。 为了更改位置,必须手动更改leftPlacement, topPlacement, imgWidth imgHeight 。 我想知道,如果有更好的方法来做到透明地将图像放在空单元格中。

VBA / C#COM互操作 – 错误430

我正在使用从Excel中的VBA调用的COM可见的C#库。 被调用的C#方法包含由ref传递的参数。 我正在使用VS2010,Office 2010,.Net框架4。 在我的Excel文件的早期版本中,对库的调用仍然正常工作。 在新版本(C#库的调用本身并没有改变),VBApipe理调用库,但是当C#方法完成时,我得到一个运行时错误430“类不支持自动化或不支持预期的接口”。 我用DEBUG模式来看看。 在同一个文件中,VBA设法调用已部署的.NET库。 我所尝试的: – 在VBA中重新添加对OLE自动化库的引用。 – 重新编译C#库 我对有什么可能是错的,在哪里有点困惑。 Excel本身似乎不是问题,因为我的旧文件的作品。 C#库也从我的旧文件调用,所以问题不应该来自库。 至于我的文件调用COM可见库的能力,以及另一个C#库的调用工作(部署一个)。 任何帮助将非常感激! VBA调用csharp如下: Dim csharptoolsDispatch As Object Set csharptoolsDispatch = CreateObject("Dispatch.Caller") Dim a as string ReDim input(0 to 5) as single ReDim output(0 to 5) as single a = csharptoolsDispatch.solveDispatch(2, False, input, output) C#看起来像: -接口 namespace Dispatch { public […]

如何在C#应用程序中删除Excel Interop对象引用

我正在使用EXCEL interop来生成Excel,然后我将它作为附件附加到邮件然后发送邮件。发送邮件后,我想删除生成的文件。 在删除它是抛出错误: this file cannot be deleted as it is is used by another process 我search了SO和其他网站,发现有关COM组件的有趣事实。 参考: 如何正确清理Excel互操作对象? 如果我不附加它作为附件然后文件被删除。 删除之前,我删除所有的COM引用。但是,当我使用它作为附件它是抛出错误:我的代码是这样的: workbook.SaveAs(root + statics + ".xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing); // Garbage collecting // Clean up references to all COM objects // As per above, you're just using a […]