C# 通过代码向Excel添加超链接
我正在使用这个C程序,它将向工作簿的G列添加超链接。它在99%的情况下有效,但如果列A中的值中有一个“值”,则语法不会添加有效的超链接。我想我已经解释了我的代码行中的特殊字符C# 通过代码向Excel添加超链接,c#,hyperlink,C#,Hyperlink,我正在使用这个C程序,它将向工作簿的G列添加超链接。它在99%的情况下有效,但如果列A中的值中有一个“值”,则语法不会添加有效的超链接。我想我已经解释了我的代码行中的特殊字符 if (cellVal == "*,*" || cellVal == "*'*" || cellVal == "*&*" || cellVal == "*-*" || cellVal == "*.*") 然而,当单步执行代码时,它总是转到else块,我不知道为什么。例如,下面的值中显然有一个'' 乔的车库
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。就是这样!不确定发生了什么,我关闭了我的项目,重新打开,清理了解决方案,然后构建它,启动它,然后砰的一声!完全按照您上面描述的方式运行。谢谢你在这方面的帮助!