Tag: com

使用C#从组合的Excel列/行读取数据

我正在尝试使用微软COM Interop从C#中的Excel文档读取数据。 到目前为止,我可以加载文档并从中读取一些数据。 但是,我需要从两个不同的列读取数据,并将其输出为json(用于jquery ajax调用) 我已经做了一个如何构buildExcel文档的快速原型,希望能够更容易地解释;-) 我所拥有的方法被称为GetExcelDataByCategory(string categoryName) ,其中categoryName参数将用于查找从哪个列获取数据。 所以,即如果我以“Category 2”作为参数进行调用,则需要获取C列行中的所有值以及 A列中的相应date,因此输出将如下所示: 然后需要将其转换/parsing为JSON。 我已经search了如何实现这一点,但迄今没有运气:-(我知道我可以使用get_Range()方法来select一个范围,但似乎你需要明确地告诉方法哪一行和哪一列获取数据。Ie:get_Range(“A1,C1”) 这是我第一次从Excel文档读取数据的经验,所以我想有很多东西需要学习;-)有没有办法让我的第二个图像输出? 任何帮助/提示,​​非常感谢! 🙂 提前致谢。 祝一切顺利, 博

使用VBScript以独占模式打开Excel文件

我有一个简单的问题,但我已经find了这个,找不到任何有用的主题.. 我正在打开一个Excel文件,并修改了一些东西的VBScript的工作..所以我使用这个代码: Set objXLApp = CreateObject("Excel.Application") objXLApp.Visible = False objXLApp.DisplayAlerts = False Set objXLWb = objXLApp.Workbooks.Open(FilePath) 现在,我想要做的是使用locking文件的方式打开Excel文件,并防止用户在脚本打开时打开它(直到closures)。 更新: 我认为这个问题与Excel实例有某种关系,我试图做到以下几点(当文件被脚本打开时): 当我手动打开文件(当它被脚本打开时),它们都变成了一个单一的实例。 当我打开任何其他的Excel文件,他们都成为一个单一的实例! 原始文件(由脚本打开)变得可见! 现在这很奇怪,因为我使用的是CreateObject("Excel.Application")而不是GetObject(, "Excel.Application")

基于非零的multidimensional array

我使用Interopt.Excel API从电子表格中提取单元格。 当我打电话时: object[,] rangeValues = (object[,])range.get_Value(XlRangeValueDataType.xlRangeValueDefault); 并设置一个断点并检查rangeValues ,我看到从[1,1]“foo”,[1,2]“bar”等元素开始 但是,如果我做string[,] test = new string[2, 2] { { "one", "two" }, { "three", "four" } }; 元素从[0,0]开始。 Excel API如何构造具有空元素的multidimensional array? 我试图添加null,但你仍然有一个[0,0]条目。 他们的对象没有显示出来。

如何读取从vbaProject.bin提取的hexstream的vba代码?

我有一个损坏的Excel vbaproject.bin从.xlam加载项中提取。 我怎样才能读取从这个bin文件提取的VBA代码作为hexstream的模块? 我正在使用oletools ,在这个线程的更多细节: https://bitbucket.org/decalage/oletools/issues/38/extracted-vba-hex-files-from-vbaprojectbin

如何将数组(Range.Value)传递给本地.NETtypes而不循环?

我想要做的是使用VBA中的.AddRange()方法使用本机C# ArrayList后期绑定填充ArrayList ,但我不知道如何传递一个对象而不是另一个ArrayList作为参数…任何东西否则我已经尝试到目前为止失败… 所以基本上我现在正在做什么(注意: list是通过mscorlib.dll C#的ArrayList ) Dim list as Object Set list = CreateObject("System.Collections.ArrayList") Dim i As Long For i = 1 To 5 list.Add Range("A" & i).Value2 Next 但是,如果i可以= 500K这是相当低效和丑陋的。 在VBA中这也起作用: ArrayList1.AddRange ArrayList2 但是我真正需要/愿意的是传递一个数组而不是ArrayList2 所以我听说我可以将一个数组传递给.NET中的.AddRange()参数。 我在一个小的C#控制台应用程序中testing它,它似乎工作得很好。 下面在纯C#控制台应用程序中工作得很好。 ArrayList list = new ArrayList(); string[] strArr = new string[1]; strArr[0] = "hello"; list.AddRange(strArr); 所以回到我的VBA模块试图做同样的失败.. Dim […]

将Python列表导出到Excel

我想通过Win32COM客户端导出一个列表到excel,我已经在标题处导入了。 我创build的对象编码如下,但我似乎无法得到它将每个值导出到电子表格自己的行。 如果我能得到一个好的指针(除了放弃python !!:D),我将不胜感激。 class XcelExport(): def excel(self): app = 'Excel' xl = win32.gencache.EnsureDispatch('%s.Application' % app) ss = xl.Workbooks.Open(r'C:\MyFile.xls') sh = ss.ActiveSheet xl.Visible = True sleep(.1) sh.Cells(1,1).Value = 'Export-to-%s : Items' % app sleep(.1) for i in EventTableRFT: sh.Range("A").Value = i sh.Cells(i+2,1).Value = "End of the List!" xprt = XcelExport() xprt.excel()

从VBA中调用计算密集的例程而不拖延Excel GUI

我有一套数字密集的例程(每个需要1分钟才能完成)捆绑在一个COM对象中,干净地实现IDispatch 。 因此,我可以从Excel工作表中使用它们,这些例程将由button触发的VBAmacros调用。 现在,当调用这些例程之一时,Excel用户界面被冻结,这对于表单的最终用户来说是相当不舒服的。 我想find任何机制来缓解这个问题。 这可能是例如启动在COM端启动的另一个线程中的计算,立即返回,生成的线程在计算结果时callbackVBA过程。 或者更简单一些,因为我只需要一次执行一个计算。 现在,从其他线程调用VBA例程可能会有很多问题。 我必须承认,我不是那种经验丰富的COM,我只看待我的代码和Excel(我使用ATL)之间的黑盒子。 所以, 是否有可能从另一个线程callbackVBA例程? 有没有更好的方法来做我想做的事情? UPDATE 在权衡了选项并在互联网上阅读了很多东西之后,我会做一些合作的multithreading:在COM对象中,我没有一个例程,而是有三个: class CMyObject : … { … STDMETHOD(ComputationLaunch)(…); // Spawn a thread and return immediately STDMETHOD(ComputationQuery)(DOUBLE* progress, BOOL* finished); STDMETHOD(ComputationResult)(VARIANT* out); private: bool finished, progress; boost::mutex finished_lock, progress_lock; ResultObject result; // This will be marshaled to out // when calling ComputationResult }; […]

Excel进程不会在VB.net中closures

我正在使用interop.excel创build一个excel文件,并且这个过程没有closures。 这是我正在尝试使用的代码。 Private Sub converToExcel(fileLoc As String, ds As DataSet) Dim xlApp As Excel.Application Dim xlWorkBook As Excel.Workbook Dim xlWorkBooks As Excel.Workbooks Dim xlWorkSheet As Excel.Worksheet Dim misValue As Object = System.Reflection.Missing.Value Dim i As Integer Dim j As Integer xlApp = New Excel.Application xlWorkBooks = xlApp.Workbooks xlWorkBook = xlWorkBooks.Add(misValue) xlWorkSheet = xlWorkBook.Sheets("sheet1") For i […]

Excel.Workbook.SaveAs(…)具有相同的名称文件

我正在使用xls文件。 我怎样才能保存它(如果存在)相同的文件名+“(副本1)”像Windows桌面。 方法saveCommande(…) if(!Directory.Exists(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "EcoEtech_Commande_Fournisseur")) { Directory.CreateDirectory(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\EcoEtech_Commande_Fournisseur"); } xlWorkBook.SaveAs("EcoEtech_Commande_Fournisseur\\" + path, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, true, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\EcoEtech_Commande_Fournisseur\\" + path; xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); this.ReleaseComObject(xlApp,xlWorkBook); //sauvergarde dans la base de données _newAchatCommande.path = path; this._fileName = path; contexte.AddToAchatCommande(_newAchatCommande); contexte.SaveChanges(); 谢谢

如何在Python中导入COM对象名称空间/枚举?

我是相对较新的编程/ python,所以我会很感激任何帮助,我可以得到。 我想通过COM使用Excel将excel文件保存为特定的格式。 这里是代码: import win32com.client as win32 def excel(): app = 'Excel' x1 = win32.gencache.EnsureDispatch('%s.Application' % app) ss = x1.Workbooks.Add() sh = ss.ActiveSheet x1.Visible = True sh.Cells(1,1).Value = 'test write' ss.SaveAs(Filename="temp.xls", FileFormat=56) x1.Application.Quit() if __name__=='__main__': excel() 我的问题是如何指定FileFormat,如果我不明确知道它的代码? 浏览文档我find关于FileFormat对象的引用。 我无法知道如何访问XlFileFormat对象 ,并以我可以find它的枚举值的方式导入它。 谢谢!