gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:35:29 25 4
gpt4 key购买 nike

我有两行数据,我想将它们相互比较以查找重复项。当我运行我的程序时,完成此任务需要几个小时,而 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 执行比较快得多。

尚未测试代码,但它应该可以工作。

关于c# - 我想在 Excel 中将 2000 个数据单元格与 3000 个其他数据单元格进行比较,但这需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30736634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com