Tag: multithreading

VBA和Excel并行运行

这是我一直以来的问题,但从来没有真正给过这个问题。 我现在所拥有的是一个显示数据的工作表,用户在需要时刷新。 所以: 用户触发一个VBA函数 VBA函数收集数据并分析WHILE USER WAITS VBA函数在电子表格上转储结果 用户继续查看数据 由于数据分析全部是在VBA内部完成的(不使用工作簿,只有logging集,数组,库等),我想以某种方式允许用户继续查看原始数据,而VBA则用于获取和分析新的数据。 我知道你不能使用工作簿并同时运行VBA,但是你可以有两个excel实例,在一个工作簿上工作,而另一个运行VBA。 那么我可以不知何故让我最初的Excel实例调用另一个Excel实例,并让我在第一次工作时运行VBA? 有任何想法吗? (另外,不确定标签“multithreading”技术上是否正确)

在java中同时读取单个Excel文件

我们在试图从两个不同的Jenkins作业运行我们的框架时得到了这个要求 以下是我们的代码: String xlsPath= System.getProperty("user.dir")+"\\TestInputs\\Config.xls"; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=" +xlsPath+ ";DriverID=22;READONLY=TRUE","",""); String sql="Select * from [Setup$]"; Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(sql); while(rs.next()) { System.out.println(rs.getString(1).toString()); System.out.println(rs.getString(2).toString()); System.out.println(rs.getString(3).toString()); Thread.sleep(1000); } rs.close(); st.close(); conn.close(); 当我们试图通过multithreading的概念来执行上面的代码工作绝对正常。 但是,如果我创build了两个JENKINS JOBS并且并行运行它,我正在收到以下错误信息。 线程“main”中的exceptionjava.sql.SQLException:[Microsoft] [ODBC Excel Driver] Microsoft Jet数据库引擎无法打开文件'(unknown)'。 它已经由另一个用户专门打开,或者您需要查看其数据的权限。 我们有任何解决方法吗? 这样我可以执行两个工作没有任何问题。 注:我不能使用HSSF或其他方式来阅读我的Excel文件。 我应该严格使用像上面的代码中使用的数据库命令。 请帮忙 !

VSTO取消工作簿通过发送按键打开事件

在Microsoft Excel中打开一个大文件(可以说是一个大于50MB的csv文件)时,会在屏幕右下angular打开一个小进度条,并显示“按ESC取消”。 如果在打开文件时按ESC键,则会取消操作。 如果文件是200MB,Excel打开文件的时间可以是20秒或更长,所以有能力取消。 在我的VSTO插件,我想有能力取消大型工作簿的文件加载操作。 因为我正在做文件的后期处理,我想有我自己的对话框,显示文件正在打开/正在处理(打开时滚动进度条,和正常进度条后处理)进度。 在这个进度表上,我想要一个取消button,可以停止当前的操作。 为了在Excel打开文件时显示自定义选取框进度条窗体,必须在新线程上创build窗体,因为我相信Excel是单线程的,所以如果在主线程上执行,窗体将冻结。 我的解决scheme是让这个表单在一个单独的线程上执行,然后有一个Cancelbutton,当按下Cancelbutton时,它使用SendKeys(或类似的)来发送ESC键击。 但是,这个解决scheme似乎并不奏效。 使用发送按键的各种方法,或者什么都不会发生,或者我得到这个exception“消息filter指示应用程序正忙(从HRESULTexception:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))” 我尝试过发送按键的各种方法是: //1 Globals.ThisAddIn.Application.SendKeys("{ESC}"); //also tried SendKeys.Send("{ESC}"); //2 Globals.ThisAddIn.Application.SendKeys("{ESC}", true); Globals.ThisAddIn.Application.Wait(DateTime.Now + new TimeSpan(0, 0, 1)); //3 Nuget package to which uses SendInput from https://inputsimulator.codeplex.com/ InputSimulator inputSim = new InputSimulator(); inputSim.Keyboard.KeyPress(VirtualKeyCode.ESCAPE); //4 sending keystorkes via Window hooking http://stackoverflow.com/questions/10407769/directly-sending-keystrokes-to-another-process-via-hooking 我也试过所有这些使用BeginInvoke的方法,没有任何成功。 有没有人有任何build议,我怎样才能得到一个取消button成功注册一个ESC击键与Excel? 我猜测解决scheme有不同的处理线程。

在一个Excel实例中处理VBAmacros并发

我正在开发一个.NET应用程序在Excel中执行一些自动化任务(运行macros,刷新连接等)。 但由于{这个问题}我只需要在Excel的一个实例中运行所有任务。 如果Excel的一个实例已经打开,我使用它,否则我创build一个新的。 问题是Excel是单线程的,所以当我的应用程序的多个实例同时运行时,我需要处理并发。 在这个地方,我只是捕获COMexception“0x800AC472”,然后重试(睡眠时间为X秒),直到运行的任务结束。 但是,这不是一个非常强大的解决scheme,会出现几个错误,并出现一些死锁问题。 我能否以一种可靠的方式处理Excel并发? 我已经在我的代码中实现了IMessageFilter,但这还不够。 谢谢

如何在Visual Studio 2012中更改Concurrency Visualizer线程视图的导出的.csv文件中的列分隔符?

我需要更改Concurrency Visualizer线程视图的.csv导出文件的列分隔符。 我在Windows 7旗舰版的Visual Studio 2012中使用了C#。 问题是,CSV文件使用逗号,字符来分隔列,还有数字。 这给统计软件带来了混乱,包括Microsoft Excel。 有了这个符号,你不能分辨2000,22是浮点数还是两列(第一个是2000 ,第二个是22 )。 我试图用Microsoft Excel和SPSS v19打开这些文件,使用逗号(,)或空格作为列分隔符,但是我没有从Concurrency Visualizer中导出相同的表格。 我正在做一个需要以毫秒为单位来测量代码块的调查,这就是为什么我要使用Concurrency Visualizer的范围。 我需要统计处理所有跨度的持续时间,以确保我的代码得到正确的结果。 这就是为什么我在“并发可视化器线程视图”中使用CSV导出function的原因。 分号字符; 可以是一个很好的列分隔符,因为它消除了歧义。 一旦我们解决这个问题,由Concurrency Visualizer Thread View导出的CSV文件可以成为软件调查的一个很好的工具。

将大块数据导出到Excel

我想导出一个2-D数组,以便在List<DataSet>包含大量的数据。 如果我将DataSet分成每个DataSet有5000行的块,每个DataSet包含66个字段, WorkSheets在单个WorkBook有60多个WorkBook 。 我理想的是能够将我的List<DataSet>对象中的每个Table中的数据追加到单个WorkSheet 。 如果这是可能的话,我需要一些帮助来获得解决scheme。 使用包含该大小matrix的单个DataSet分配Excel.Range会导致System.OutOfMemoryException 。 以下是我目前如何将我的DataTable分成块: internal static class ExtensionMethods { internal static List<DataTable> SplitDataSetIntoMultipleTables(this DataTable tableToClone, int countLimit) { List<DataTable> tables = new List<DataTable>(); int sheetNumber = 0; DataTable copyTable = null; foreach (DataRow dr in tableToClone.Rows) { if ((count++ % countLimit) == 0) { sheetNumber++; copyTable = new DataTable(); […]

使用Excel Com对象的Python线程

我试图打开一个工作簿使用python线程内预先打开的Excel COM对象。 使用下面的代码: from multiprocessing import Process, Queue def open_workbook(excel,iSub_Loc,q): p = Process(target = open_workbook_helper, args = (excel,iSub_Loc)) p.daemon = True p.start() def open_workbook_helper(excel,iSub_Locq,): wb = excel.Workbooks.Open(iSub_Loc) ws = wb.Sheets(1) q.put((wb,ws)) 但我得到以下错误 Can't pickle <type PyIDispatch'>: it's not found as __builtin__.PyIDispatch 有什么build议么?

从另一个线程更新Excel电子表格

我已经使用C#创buildCOM服务器,我的客户端可以接收实时更新。 更新通常从不同的线程发起。 但我注意到,当callback方法更新电子表格时,Excel崩溃。 有什么办法在UI线程中调用更新? PS我知道Excel的RTDfunction。 但它不适合我的需要,因为我需要一个更新中的几个参数。

从新线程处理ExcelDnaUtil.Application

我正在使用ExcelDNA来开发一个XLL。 其中,我有一个生活在一个DLL中的表单,我通过“ExcelDnaUtil.Application”作为成员,以促进表单和运行XLL的Excel实例之间的交互。 如果我使用以下命令在主线程中启动表单: form1.show() 当我closures表单然后closuresExcel时,Process Explorer显示Excel进程已妥善处置。 如果我使用新线程启动表单: Dim workerThread As Thread workerThread = New Thread(Sub() form1.showdialog()) workerThread.Start() 当我closures表单然后closuresExcel时,该进程仍保留在Process Explorer中。 我一直小心不要在任何代码行中使用两个小数点,并在closures表单时将接口成员设置为“无”。 我没有使用“ReleaseCOMObject”,因为其他文章指出这是不好的做法。 问题:如何从一个单独的线程正确地处理Excel进程?

使用BackgroundWorker将使Excel进程在closuresExcel后运行

我正在使用C#中的Excel加载项,在运行模拟时显示进度条。 我想要一个BackgroundWorkerasynchronous运行模拟,并报告进度条窗体的进度。 模拟方法需要对当前Excel COM应用程序的引用。 我有一个名为ThisAddin的类,它实现了ExcelDna.Integration.IExcelAddIn接口,并有一个返回应用程序的静态属性。 但是,只要后台工作人员以任何方式尝试使用该应用程序,即使退出Excel,也将使Excel进程继续运行。 例如,如果我简单地在Excel应用程序中设置属性,如下所示: void backgroundworker_DoWork(object sender, DoWorkEventArgs e) { ThisAddIn.App.DisplayStatusBar = true; } 然后,在运行加载和closures的Excel后,我仍然有一个Excel进程在我的任务pipe理器中运行。 有没有办法确保这个过程被杀死? 我不知何故在后台工作人员创build应用程序的另一个实例吗? 我不明白,因为如果我从后台工作人员的应用程序调用quit(),它将closures整个应用程序,该过程仍将继续运行! 当后台工作完成时,我已经确定调用dispose()并中止当前线程。 我已经使用了这里build议的“AbortableBackgroundWorker”类。 但是,这仍然不能解决我的问题。