使用C# OfficeOpenXml获取Excel单元格完整超链接URL(含#锚点及参数)的问题
C# OfficeOpenXml获取Excel单元格完整超链接URL(含#锚点及参数)的问题
我之前也碰到过这个一模一样的问题!OfficeOpenXml的Hyperlink.AbsoluteUri确实会截断#后面的锚点和参数,当时折腾了好一会儿才找到原因和解决办法。
问题根源
问题出在EPPlus对超链接的解析逻辑上:它会把#及后面的所有内容识别为URI片段(Fragment),而AbsoluteUri属性返回的是不含片段的基础URI,所以你才只能拿到http://website/这部分。
解决办法
其实EPPlus已经把#后面的内容单独存在了Hyperlink.Fragment属性里,我们只需要把基础地址和片段拼接起来就能得到完整URL:
// 假设你已经定位到目标单元格 var targetCell = myWorksheet.Cells[i, j]; string fullHyperlinkUrl = string.Empty; if (targetCell.Hyperlink != null) { if (!string.IsNullOrWhiteSpace(targetCell.Hyperlink.Fragment)) { // 拼接基础地址、#号和片段内容 fullHyperlinkUrl = $"{targetCell.Hyperlink.Address}#{targetCell.Hyperlink.Fragment}"; } else { // 没有锚点和参数的情况,直接用基础地址 fullHyperlinkUrl = targetCell.Hyperlink.Address; } } // 此时fullHyperlinkUrl就是完整的http://website/#parameter=aaa¶meter=bbb Console.WriteLine(fullHyperlinkUrl);
额外注意事项
- 如果你的超链接是相对路径(比如
../page.html#section1),可以结合Hyperlink.BaseUri来转成绝对路径:var absoluteBase = new Uri(targetCell.Hyperlink.BaseUri, targetCell.Hyperlink.Address); fullHyperlinkUrl = string.IsNullOrWhiteSpace(targetCell.Hyperlink.Fragment) ? absoluteBase.ToString() : $"{absoluteBase}#{targetCell.Hyperlink.Fragment}"; - 记得要先判断
cell.Hyperlink是否为null,避免空引用异常。
亲测这个方法能完美拿到包含#锚点和所有参数的完整URL,你可以试试!
内容来源于stack exchange
相关产品推荐
相关产品推荐

