【问题标题】:How to add hyperlink to Excel's cells with C#如何使用 C# 将超链接添加到 Excel 单元格
【发布时间】:2017-05-02 07:04:48
【问题描述】:

如您所见,有时我们需要在 Excel 文件中添加大量超链接,而作为程序员,您不想手动执行,而是希望以编程方式执行。 我在互联网上搜索过,但我只知道如何以编程方式添加 Web 的超链接,而不是当前的 excel 文件超链接。 所以我认为了解如何以编程方式添加当前 excel 文件的超链接(或本地超链接)是一个很好的理想选择。

【问题讨论】:

    标签: c# excel hyperlink


    【解决方案1】:

    Excel 支持HYPERLINK() function

    HYPERLINK(link_location, [friendly_name]) 
    

    查看我上面链接到的页面,了解HYPERLINK() 函数的常见示例,例如您要查找的内容。

    例如,以下公式打开一个文件,导航到 Annual 工作表并选择 F10。超链接文本是单元格 D1 的内容。

    =HYPERLINK("[http://example.microsoft.com/report/budget report.xlsx]Annual!F10", D1) 
    

    在上面的示例中,Excel 文件位于 HTTP 位置,但它也可以是本地路径,如下所示:

    =HYPERLINK("[D:\Documents\budget report.xlsx]Annual!F10", D1) 
    

    【讨论】:

      【解决方案2】:

      我还没有找到使用 lib Microsoft.Office.Interop.Excel 将超链接添加到 Excel 单元格的方法,但我想出了一个可以通过剪贴板数据添加超链接的理想方法。

      我研究了 Excel 剪贴板数据,发现 Excel 数据可以是 HTML 数据。所以我将数据作为 HTML 处理并将其粘贴到 Excel - 和 BAM - 我们得到了 Excel 单元格的超链接

      我们有这样的课程

          class HDNData
          {
              StringBuilder builder;
      
              public void SetBuilder(StringBuilder dataBuilder)
              {
                  this.builder = dataBuilder;
              }
      
              public string Data { get; set; }
              public string Hyperlink { get; set; }
              public string HexColor { get; set; }
              public override string ToString()
              {
                  builder.Clear();
                  bool hasHyperlink = !string.IsNullOrEmpty(Hyperlink);
                  bool hasColor = !string.IsNullOrEmpty(HexColor);
                  if (hasHyperlink)
                  {
                      builder.Append("<a href=\"");
                      builder.Append(Hyperlink);
                      builder.Append("\">");
                  }
                  if(hasColor)
                  {
                      builder.Append("<span style='color:");
                      builder.Append(HexColor);
                      builder.Append("'>");
                  }
      
                  builder.AppendLine(Data);
                  if (hasHyperlink)
                      builder.Append("</a>");
                  return builder.ToString();
              }
          }
          class HDNHtml
          {
              StringBuilder builder = new StringBuilder();
              StringBuilder cellBuilder = new StringBuilder();
              private List<List<HDNData>> data = new List<List<HDNData>>();
      
              public void Add(int i, HDNData hdnData)
              {
                  if(i < data.Count)
                  {
                      hdnData.SetBuilder(cellBuilder);
                      data[i].Add(hdnData);
                  }
                  else
                  {
                      if (i == data.Count)
                      {
                          data.Add(new List<HDNData>());
                          hdnData.SetBuilder(cellBuilder);
                          data[i].Add(hdnData);
                      }
                  }
              }
      
              public override string ToString()
              {
                  builder.Clear();
                  builder.AppendLine("<html>");
                  builder.AppendLine("<head></head>");
                  builder.AppendLine("<body>");
                  builder.AppendLine("<table>");
                  builder.AppendLine("<col>");
                  foreach (List<HDNData> row in data)
                  {
                      builder.AppendLine("<tr>");
                      foreach (HDNData col in row)
                      {
                          builder.AppendLine("<td>");
                          builder.Append(col.ToString());
                          builder.AppendLine("</td>");
                      }
                      builder.AppendLine("</tr>");
                  }
                  builder.AppendLine("</table>");
                  builder.AppendLine("</body>");
                  builder.AppendLine("</html>");
                  return builder.ToString();
              }
          }
      

      并像这样使用类

          HDNHtml hdn = new HDNHtml();
          Random r = new Random();
          HDNData hdnData = new HDNData();
          hdnData.Data = r.Next().ToString();
          hdnData.HexColor = "#FFCCFF";
          hdn.Add(0,hdnData);
          hdnData = new HDNData();
          hdnData.Data = r.Next().ToString();
          hdnData.Hyperlink = "#GTA";
          hdn.Add(0, hdnData);
          hdnData = new HDNData();
          hdnData.Data = r.Next().ToString();
          hdnData.Hyperlink = "#GTA";
          hdn.Add(0, hdnData);
          hdnData = new HDNData();
          hdnData.Data = r.Next().ToString();
          hdnData.Hyperlink = "#GTA";
          hdn.Add(1, hdnData);
          hdnData = new HDNData();
          hdnData.Data = r.Next().ToString();
          hdnData.Hyperlink = "#GTA";
          hdn.Add(1, hdnData);
          string data = hdn.ToString();
          txtWarnings.Text = data;
          Clipboard.SetText(data);
      

      现在运行代码并将剪贴板数据粘贴到 Excel 的工作表中。请注意,在该 Excel 工作簿中必须删除一个单元格名称: GTA ,因此 excel 的单元格的超链接将链接到该 GTA 单元格。

      【讨论】:

        猜你喜欢
        • 2014-12-03
        • 2018-07-22
        • 1970-01-01
        • 1970-01-01
        • 2019-06-02
        • 1970-01-01
        • 1970-01-01
        • 2015-02-11
        • 2021-05-12
        相关资源
        最近更新 更多