Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过代码向Excel添加超链接_C#_Hyperlink - Fatal编程技术网

C# 通过代码向Excel添加超链接

C# 通过代码向Excel添加超链接,c#,hyperlink,C#,Hyperlink,我正在使用这个C程序,它将向工作簿的G列添加超链接。它在99%的情况下有效,但如果列A中的值中有一个“值”,则语法不会添加有效的超链接。我想我已经解释了我的代码行中的特殊字符 if (cellVal == "*,*" || cellVal == "*'*" || cellVal == "*&*" || cellVal == "*-*" || cellVal == "*.*") 然而,当单步执行代码时,它总是转到else块,我不知道为什么。例如,下面的值中显然有一个'' 乔的车库

我正在使用这个C程序,它将向工作簿的G列添加超链接。它在99%的情况下有效,但如果列A中的值中有一个“值”,则语法不会添加有效的超链接。我想我已经解释了我的代码行中的特殊字符

if (cellVal == "*,*" 
|| cellVal == "*'*" 
|| cellVal == "*&*" 
|| cellVal == "*-*" 
|| cellVal == "*.*")
然而,当单步执行代码时,它总是转到else块,我不知道为什么。例如,下面的值中显然有一个''

乔的车库 杰克汉堡店 拉里的巨大摇晃 鲍勃的啤酒

为了以正确的方式创建超链接,我需要在这个语法中修改什么

public static void AddHyperlinksToExcel()
{
   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, 7];
            Object TextToDisplay = Convert.ToString(WS.Cells[i, 9]);
            cellVal = WS.Cells[i, 1].Value;
            rangeToHoldHyperlink = WS.Range["G" + i];
            if (cellVal == "*,*" || cellVal == "*'*" || cellVal == "*&*" || cellVal == "*-*" || cellVal == "*.*")
            {
                xlApp.ActiveSheet.Hyperlinks.Add(Anchor, "", "'" + cellVal + "'!A1", "", TextToDisplay);
            }
            else
            {
                xlApp.ActiveSheet.Hyperlinks.Add(Anchor, "", "'" + cellVal + "'!A1", "", TextToDisplay);
            }
        }
    }

如果cellVal是System.String,则代码将无法按预期的方式工作。.net不支持使用==进行通配符匹配。您应该将cellValue=='*&*'等替换为cellValue.Contains&

,而@PhillipH的答案将解决除apastrophe之外的所有Or情况。原因是,Excel将apastrophe转换为双引号。例如,在Excel 2016中,我创建了一个名为Joe's Garage的工作表,并开始录制宏。我遵循的步骤是

1从功能区中单击“插入” 2从功能区中选择超链接 3在显示的选项左侧,单击“放置在此文档中” 4选择要链接到的工作表名称 注意-如果您查看您试图链接到的工作表名称,该名称已更改为“Joes Garage” 5.单击“确定”

现在您有了一个功能完备的超链接,其中的值中有撇号

这不是C语法,但这是Excel VBA在宏记录器中显示的语法,其说明与上述步骤相同

Range("C2").Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
    "'Joe''s Garage'!A1", TextToDisplay:="Link To Joe's Garage"

cellVal的数据类型是什么?我猜它不是一个纯粹的.net字符串-您似乎正在对它进行模式匹配,这不是.net字符串的一个功能,所以我猜它是某种Excel数据类型?cellVal是一个文本字符串,它是Excel工作表a列的值。。它是工作表的A列,包含文本值和我的帖子中列出的示例。如果我在单元格上单击鼠标右键,然后转到“数字”选项卡下的“格式单元格”,它将被列为“常规”或“常规”,但它并没有真正回答我的查询;cellVal不能是.net中定义的System.String数据类型,因为它不支持使用==进行通配符匹配,所以它必须是Excel指定的数据类型。在代码上设置断点,告诉我cellValue变量的数据类型。一旦我们知道我们可以在==有效匹配的内容上查找文档。我非常怀疑某些转义字符需要特殊处理。如何获取数据类型?我浏览了代码,当我将鼠标悬停在代码上时,它只会给我单元格Joe的Garage的值。在代码上放置一个断点。你似乎已经这样做了,然后打开调试即时窗口,键入cellVal.GetType.Name并按return。使用Contains'时,我还需要使用*吗?我询问的原因是我刚刚将代码修改为if-cellVal.Contains&| | cellVal.Contains,| | cellVal.Contains'| | cellVal.Contains-| cellVal.Contains。我得到了与以前相同的结果。否-正如我所说,.net字符串不使用通配符进行匹配。在If语句上加一个断点,然后再次使用立即窗口。输入cellValue并按return键。我们希望看到细胞的价值。如果这不是你所期望的,那就是你的问题。如果它是您期望的,即BellHop&ByDay,那么如果您输入cellValue.Contains'&',它将返回True。就是这样!不确定发生了什么,我关闭了我的项目,重新打开,清理了解决方案,然后构建它,启动它,然后砰的一声!完全按照您上面描述的方式运行。谢谢你在这方面的帮助!