是否可以在一个Excel实例中使用多核?

我必须将简单的格式应用于10,000个以上的Excel文件。 我已经有了一个多核计划。 它为每个Excel文件打开一个新的Excel实例。 如果重要的话,这个代码目前在我的表单代码中。

我希望能用一个Excel实例和许多工作簿。 如果我只使用一个Excel实例,是否有可能利用多核function? 怎么样?

– 如果上面的答案是否定的,则更复杂的问题可能是:我应该生成多less个Excel实例,以及如何在每个实例之间拆分工作簿?

当前代码在这里:

private void SelectFilesButtonClick(object sender, EventArgs e) { var listOfExcelFiles = OpenExcel.FileNames.ToList(); Parallel.ForEach(listOfExcelFiles, TrivialExcelEditFunction); } private void TrivialExcelEditFunction(string file) { //Open instance of Excel //Do processing //Close instance of Excel } 

更新下面的代码,但仍然没有限制自己的核心数量。 不知道为什么。

 private void SelectFilesButtonClick(object sender, EventArgs e) { var listOfExcelFiles = OpenExcel.FileNames.ToList(); int cores = Environment.ProcessorCount; //Split one list into list of lists. Number of lists based on number of cpu cores List<List<object>> listOfLists = Split(listOfExcelFiles, cores); //Limits number of threads to number of cores Parallel.ForEach(listOfLists, new ParallelOptions { MaxDegreeOfParallelism = cores }, EditExcel); } private void TrivialExcelEditFunction(string file) { //Open instance of Excel foreach (string file in files) { //Do processing } //Close instance of Excel } 

可以说我有4个核心。 我的想法是将文件列表分成4个相同的列表,将线程限制为4,然后我可以在Excel的4个实例中处理文件。 我认为这意味着TrivialExcelEditFunction将只运行4次。 相反,这个函数在14到27次之间运行。 请告诉我我哪里错了。

我认为这是@Servy上面提到的。 我现在每天都用这个代码来处理Excel,而且肯定还没有失败。 还要确保你正确地编组你的COM对象。 另外一些额外的信息,Excel 2010内部使用多核,注意性能(尤其是大文件)。

 var tasks = new Task[Environment.ProcessorCount]; for (int i = 0; i< Environment.ProcessorCount; i++) { tasks [i] = Task.Factory.StartNew(() => { // your Excel code here. }); } Task.WaitAll(tasks); 

创buildN个任务/线程来执行处理,其中“N”是机器上的核心数量。 给每个任务/线程一个Excel实例。

您将无法控制多个线程中的单个实例(至less不会高效;一次只能处理一个线程的任务),创build这么多的Excel实例效率相当低。

正如@Servy指出的那样,您可以为每个线程创build一个Excel实例的多个线程。

确保每个线程创build它正在使用的Excel对象。

期待古怪。 拥有10,000多个文件,您可能会预计至less有less数问题。 如果一个隐藏的Excel实例试图提示用户它可能会出现冻结。

当使用一些调用单线程COM对象的函数时,Word有一些问题,我怀疑Excel也可能有一些。 在Word中,这些performance方式各不相同,包括冻结或closures的情况。

如果格式化非常简单,并且您的文件是xmlx,则可以编写一些代码来通过OOXML SDK应用更改,这不需要实际的Excel实例

Interesting Posts