C# 优化添加超链接语法

C# 优化添加超链接语法,c#,excel,performance,c#-4.0,hyperlink,C#,Excel,Performance,C# 4.0,Hyperlink,我有一个工作表,其中我添加了500个超链接,这个过程大约需要90秒才能完成。我知道这部分是因为被迫使用Microsoft Interop Excel,部分是因为被迫使用for loop,但必须有一种更快/更有效的方法来实现这一点。这是我当前的语法 public static void AddThatHyper() { long lr, i; string cellVal; WS = xlApp.ActiveWorkbook.ActiveSheet; lr = WS

我有一个工作表,其中我添加了500个超链接,这个过程大约需要90秒才能完成。我知道这部分是因为被迫使用Microsoft Interop Excel,部分是因为被迫使用
for loop
,但必须有一种更快/更有效的方法来实现这一点。这是我当前的语法

public static void AddThatHyper()
{
    long lr, i;
    string cellVal;
    WS = xlApp.ActiveWorkbook.ActiveSheet;
    lr = WS.Cells[WS.Rows.Count, 2].End(Excel.XlDirection.xlUp).Row;
    for (i = 2; i <= lr; i++)
    {
        Object Anchor = WS.Cells[i, 9];
        Object TextToDisplay = Convert.ToString(WS.Cells[i, 9]);
        cellVal = WS.Cells[i, 1].Value;
        cellVal = cellVal.Substring(0, Math.Min(28, cellVal.Length));
        rangeToHoldHyperlink = WS.Range["I" + i];

        if (cellVal.Contains("&") ||
            cellVal.Contains(",") ||
            cellVal.Contains("-") ||
            cellVal.Contains(".")
           )
        {
            xlApp.ActiveSheet.Hyperlinks.Add(Anchor, "", "'" + "CR " + cellVal + "'!A1", "", TextToDisplay);
        }
        if (cellVal.Contains("'"))
        {
            cellVal = cellVal.Replace("'", "''");
            xlApp.ActiveSheet.Hyperlinks.Add(Anchor, "", "'" + "CR " + cellVal + "'!A1", "", TextToDisplay);
        }
        else
        {
            xlApp.ActiveSheet.Hyperlinks.Add(Anchor, "", "'" + "FR " + cellVal + "'!A1", "", TextToDisplay);
        }
    }
}
public static void addthathHyper()
{
长lr,i;
字符串cellVal;
WS=xlApp.ActiveWorkbook.ActiveSheet;
lr=WS.Cells[WS.Rows.Count,2].End(Excel.XlDirection.xlUp).Row;

对于(i=2;i注意,此代码未经测试。这是一个基于我以前制作的程序的示例。您可能需要进行一些手动调试,以查看是否正确提取/转换了值

public static void AddThatHyper()
{
    long lr, i;
    string cellVal;
    WS = xlApp.ActiveWorkbook.ActiveSheet;
    lr = WS.Cells[WS.Rows.Count, 2].End(Excel.XlDirection.xlUp).Row;
    string prefix = "";      

    string topCell = "I" + 2;
    string bottomCell = "I" + lr;

    //get_Range returns object array
    Range range = ws.get_Range(topCell, bottomCell);

    object[,] rangeValues = new object[lr - 2, 1];
    string[,] rangeStringValues = new string[lr - 2, 1];
    rangeValues = range.Cells.Formula;

    //turn object array into string array
    //should contain strings like "=hyperlink(url, text)"
    for (int i = 0; i < rangeValues.GetLength(0); i++)
    {
        rangeStringValues[i, 0] = rangeValues[i, 0]?.ToString() ?? "";
    }

    //edit hyperlinks
    for (int i = 0; i < rangeStringValues.GetLength(0); i++)
    {
        prefix = "FR"
        string hyperlink = rangeStringValues[i, 0];
        MatchCollection fields =  Regex.Matches(hyperlink, @"("[A-Za-z0-9\.]*")");
        string url = fields[0]?.ToString() ?? "";
        string text = fields[1]?.ToString() ?? "";

        if (Regex.IsMatch(url, @"[&,\-\.]"))
            prefix = "CR";
        else if (url.Contains("'"))
        {
            prefix = "CR"
            url.Replace("'", "''");
        }
        string formattedUrl = "'" + prefix + url + "'!A1";
        rangeStringValues[i, 0]= $"=HYPERLINK(""{formattedUrl }"", ""{text}"")";

    }
    range.set_Value(value: values);
    range.Formula = range.Value;
}
public static void addthathHyper()
{
长lr,i;
字符串cellVal;
WS=xlApp.ActiveWorkbook.ActiveSheet;
lr=WS.Cells[WS.Rows.Count,2].End(Excel.XlDirection.xlUp).Row;
字符串前缀=”;
字符串topCell=“I”+2;
字符串bottomCell=“I”+lr;
//获取范围返回对象数组
范围范围=ws.get_范围(顶部单元格,底部单元格);
对象[,]范围值=新对象[lr-2,1];
字符串[,]rangeStringValues=新字符串[lr-2,1];
rangeValues=range.Cells.Formula;
//将对象数组转换为字符串数组
//应包含“=超链接(url,文本)”之类的字符串
对于(int i=0;i
问题在于,您试图分别读取和写入单元格。减少执行时间的最佳方法是将所有值作为一个范围读取并存储在一个数组中。之后,您可以对其进行操作,然后为整个范围设置值。从而减少程序必须进行的COM调用量。请查看问题:。@Seunhaab-这个选项可能有效,但我不清楚如何实现。你能提供示例语法吗?这些答案上的URL设置与我的不同,因为我有3个可能的条件来说明URL应该如何设置。