解决 迭代并写成Excel Speed问题

颂歌

众所周知的成员
加入
2020年12月11日
消息
122
编程经验
Beginner
这是使用Microsoft Office Interop。

我有一个具有两个数据类型的字典,一个数据类型与主Excel中的条目匹配。我目前正在使用一个for循环来循环参赛作品,并且在存在匹配的位置,将两个小区中的字典数据写入左侧。我明白我每次都读过300多个参赛物,但我不知道识别连接的小区的更好方法。

我有效的代码,但是在编写数据方面很慢 - 我觉得这样做可能更好的方法是什么?

加速这一点的任何提示?

这是我目前的代码。

C#:
            _Excel.Application excelApp = new _Excel.Application();
            _Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(workbookPath);
            _Excel.Worksheet sheet = excelWorkbook.Sheets[1];
            _Excel.Range xlRange = sheet.UsedRange;
            int colCount = xlRange.Columns.Count;
            int rowCount = xlRange.Rows.Count;
            sheet.Columns["A"].Insert();
            sheet.Columns["B"].Insert();
            sheet.Cells[1, 1] = "File Name";
            sheet.Cells[1, 2] = "MetaData Verba ID";

            var len = dict.Count;
            double bar = 100 / len;

            foreach (var data in dict.Keys)
            {
                for (int k = 1; k <= rowCount; k++)
                {
                    if (xlRange.Cells[k, "A"].Value.ToString() == data)
                    {
                        sheet.Cells[k, "B"] = data;
                        sheet.Cells[k, "A"] = dict[data];
                    }
                }
                (sender as BackgroundWorker).ReportProgress((int)bar);
                bar = bar + 100 / len;

            }
 
Solution
此外,您正在错误的方式与此错误方式:
C#:
foreach (var data in dict.Keys)
{
    for (int k = 1; k <= rowCount; k++)
    {
        if (xlRange.Cells[k, "A"].Value.ToString() == data)
        {
            sheet.Cells[k, "B"] = data;
            sheet.Cells[k, "A"] = dict[data];
        }
    }
}
特别鉴于您已有可用字典。

你上面的方法是你从字典中抓住一个词,然后你通过整本书寻找一个只有一个单词,以便你可以用别的东西替换它。然后从字典中拿起下一个单词,然后再次通过整本书。然后你用下一个单词再做一次。不是它......

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,161
地点
挪威
编程经验
10+

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,161
地点
挪威
编程经验
10+
线程搬到第三方产品论坛。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
此外,您正在错误的方式与此错误方式:
C#:
foreach (var data in dict.Keys)
{
    for (int k = 1; k <= rowCount; k++)
    {
        if (xlRange.Cells[k, "A"].Value.ToString() == data)
        {
            sheet.Cells[k, "B"] = data;
            sheet.Cells[k, "A"] = dict[data];
        }
    }
}
特别鉴于您已有可用字典。

你上面的方法是你从字典中抓住一个词,然后你通过整本书寻找一个只有一个单词,以便你可以用别的东西替换它。然后从字典中拿起下一个单词,然后再次通过整本书。然后你用下一个单词再做一次。如果你刚刚经过这本书一次,让词典仰望更换应该是什么?就像是:

C#:
for (int k = 1; k <= rowCount; k++)
{
    var key = xlRange.Cells[k, "A"].Value.ToString();
    if (dict.ContainsKey(key))
    {
        sheet.Cells[k, "B"] = key;
        sheet.Cells[k, "A"] = dict[key];
    }
}
 
解决方案

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
作为一个快速的抛开,有一些你的旧代码处理,即我的新代码没有。在您的旧代码中,如果您有一个如下文章:
C#:
["Foo"] = "Bar"
["Bar"] = "Boo"

Excel表看起来像:
C#:
     A   B
1 Foo

您的代码将导致:
C#:
     A   B
1 Boo Bar

但我的代码会导致:
C#:
     A   B
1 Bar Foo
 

颂歌

众所周知的成员
加入
2020年12月11日
消息
122
编程经验
Beginner
哇,从3分钟工作到瞬时输出,谢谢。

不,字典中的键是一个唯一的标识符,值是一个文件名,它永远不会与UID相同....因此,感谢突出显示,但不应该影响此任务,欣赏抬头,将欣赏抬头提交包含内存银行!
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+

颂歌

众所周知的成员
加入
2020年12月11日
消息
122
编程经验
Beginner
You should check out trygetValue() as well.

会将它添加到我的工具箱,在这种情况下,字典中的UID在主电子表格中,没有额外的extras,没有丢失(或者不应该是)。唯一不同的数据是我创建的值我想要引入主机。

基本上,主站是以前状态中的所有较小文件的合并。

我想知道创建两个列表,刚用UID订购它们,然后在一起写作它们 - 我认为结果完全相同......但我想检查一下检查,确保什么都没有出错..如此,如果我有空白空间......有些问题出错了,很容易看出一些出现问题。

否则我留下了阅读非常长的UID号码的前景(如MD5哈希号)并试图看出它们是否有所不同。
 
最佳 底部