我想在Excel中将2000个数据单元与3000个其他数据单元进行比较,但这需要很长时间

我有两行数据,我想彼此比较以find重复的数据。 当我运行我的程序时,完成这个任务需要几个小时,而Excel需要几秒钟的时间。 但我不想在Excel中这样做,因为我想自动执行。 行A = 2000长,行B = 3000数据长。

这是我做的:

static void Main(string[] args) { excel_init("C:\\blablatest"); for (int j = 1; j < 2000; j++) { for (int k = 1; k < 2000; k++) { if (excel_getValue("A"+j) == excel_getValue("B"+k)) { excel_setValue("D"+j,"1"); } Console.WriteLine(j); //**STILL LOOP TAKES HOURS** } } excel_close(); Console.ReadKey(); } private static Microsoft.Office.Interop.Excel.ApplicationClass appExcel; private static Workbook newWorkbook = null; private static _Worksheet objsheet = null; //Method to initialize opening Excel static void excel_init(String path) { appExcel = new Microsoft.Office.Interop.Excel.ApplicationClass(); if (System.IO.File.Exists(path)) { // then go and load this into excel newWorkbook = appExcel.Workbooks.Open(path, true, true); objsheet = (_Worksheet)appExcel.ActiveWorkbook.ActiveSheet; } else { Console.WriteLine("Unable to open file!"); System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel); appExcel = null; } } static void excel_setValue(string cellname, string value) { objsheet.get_Range(cellname).set_Value(Type.Missing, value); } //Method to get value; cellname is A1,A2, or B1,B2 etc...in excel. static string excel_getValue(string cellname) { string value = string.Empty; try { value = objsheet.get_Range(cellname).get_Value().ToString(); } catch { value = ""; } return value; } //Method to close excel connection static void excel_close() { if (appExcel != null) { try { newWorkbook.Close(); System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel); appExcel = null; objsheet = null; } catch (Exception ex) { appExcel = null; Console.WriteLine("Unable to release the Object " + ex.ToString()); } finally { GC.Collect(); } } } } 

(如何)我可以让这个更快?

通过在Excel进行比较,您正在付出巨大的开销。 你应该做的是提取数据,并直接在你的应用程序进行比较。

最简单的方法是将Excel范围转换为数组:

 var rowAArray = objsheet.Range["A1","A2000"].Value; //object[,] typed array var rowBArray = objsheet.Range["B1", "B2000"].Value; //object[,] typed array 

现在你只需要比较两个数组:

  for (int j = 1; j < 2000; j++) { for (int k = 1; k < 2000; k++) { if (rowBArray[k, 1] == rowAArray[j, 1]) objsheet.Cells[j, 4].Value = 1; //Set value in cell "D*" } } 

如果您正在处理数值,您将不得不忍受拳击/取消装箱罚款,但仍然比使用Excel执行比较要快得多。

没有testing代码,但它应该工作。

虽然你的问题已经被InBetween很好的回答了,而且消除这个巨大的开销会更快,但是我必须补充说,你不需要比较所有的2000 * 3000条目来find重复的值,因为你有两个sorting列表。 类似的工作可以在这里find

让我们把你的两个列表,即A和B(列号),分别为E和G.那么F呢? 将A的原始行号存储为E.例如,如果string“aabbb”在A384中,现在在E1中,则将其存储在F1中。 然后比较两个列表作为上面的链接,例如,如果您在E644有一个副本,用1标记单元格“D”+(F644的值)。

最初你有O(AB)比较,通过这样做你有O(AlogA + BlogB)sorting。 (只比较O(max(A,B))。)

注意:在我看来,实现这个并不会那么简单,没有bug。 我build议先尝试InBetween的答案。 只有在速度缓慢的情况下才考虑应用我的build议。