【问题标题】:Extracting a URL from hyperlinked text in Excel cell从 Excel 单元格中的超链接文本中提取 URL
【发布时间】:2011-08-04 12:43:28
【问题描述】:

我在 excel 中有一个充满超链接文本的表格,所以它基本上是一堆名称,但是当我单击一个时,它会将我带到默认浏览器中的某个 URL。

所以我在我的程序中从这个 excel 表中提取文本,但是当我从这些超链接单元格中提取时得到的值是内部字符串的值,当我想要字符串在 excel 文件中链接到的 URL 时。

所以我认为有两种方法可以做到这一点。我可以将 excel 文件中的所有超链接文本转换为相应的 URL,或者我可以使用 C# 以某种方式从单元格中提取 URL 值而不是文本。

我不知道如何做这些事情,但任何帮助将不胜感激。

到目前为止的 C# 代码:

Excel.ApplicationClass excelApp = new Excel.ApplicationClass();

//excelApp.Visible = true;

Excel.Workbook excelWorkbook = 
excelApp.Workbooks.Open("C:\\Users\\use\\Desktop\\list.xls",
0, false, 5, "", "",false, Excel.XlPlatform.xlWindows, "", 
true, false, 0, true, false, false);

Excel.Sheets excelSheets = excelWorkbook.Worksheets;

string currentSheet = "Sheet1";
Excel.Worksheet xlws = (Excel.Worksheet)excelSheets.get_Item(currentSheet);

string myString = ((Excel.Range)xlws.Cells[2, 1]).Value.ToString();

至于 excel 文件,它只是一长串超链接的名称。例如单元格 A2 将包含以下文本:

Yummy cookie recipe

我想提取字符串:

http://allrecipes.com//Recipes/desserts/cookies/Main.aspx

【问题讨论】:

  • 显示excel示例和一些代码
  • 我展示了代码,但 excel 文件只是一列超链接文本,其中的条目与上面显示的 cookie 示例完全相同。

标签: c# .net excel hyperlink vsto


【解决方案1】:

您可以使用 vba 宏:

Alt+F11 打开 VBA 编辑器并粘贴以下内容:

Function URL(rg As Range) As String
  Dim Hyper As Hyperlink
  Set Hyper = rg.Hyperlinks.Item(1)
  URL = Hyper.Address
End Function

然后你可以在你的工作表中使用它,像这样:

=URL(B4)

【讨论】:

  • 非常感谢,我只是用我的程序将所有链接提取到表的不同部分,然后将它们复制/粘贴到新的 Excel 表中。乱七八糟,但最终的结果正是我想要的。
【解决方案2】:

在你的代码中添加

string myString = ((Excel.Range)xlws.Cells[2, 1]).Cells.Hyperlinks[1].Address;

我显然建议在访问“超链接”属性之前进行一些检查。

【讨论】:

  • 从编码的角度来看,这是最好的答案。它不需要修改 excel 工作表。我发现有必要将 xlws.Cells 更改为 xlws.Sheets[1].Cells.
【解决方案3】:

VBA 函数:

  1. 点击 Alt+F11(打开 Visual Basic 编辑器)
  2. 点击插入 -> 模块(将模块添加到您的 excel 文件中)
  3. 将下面的代码粘贴到GETURL函数中
  4. 点击 Alt+Q(关闭 Visual Basic 编辑器)

现在使用 =GETURL(<i>cell</i>) 获取 URL
例如:=GETURL(A1) 将返回显示在单元格 A1 中的超链接的 URL

Function GETURL(HyperlinkCell As Range)
    GETURL = HyperlinkCell.Hyperlinks(1).Address
End Function

Source

【讨论】:

    【解决方案4】:

    使用 Visual Studio Tools for Office (VSTO) 打开 Excel 工作簿并提取所有超链接。


    我在Book1.xlsx中Sheet1的A1中放了一个超链接:text = "example.com, address = "http://www.example.com"

    _Application app = null;
    try
    {
        app = new Application();
    
        string path = @"c:\temp\Book1.xlsx";
        var workbook = app.Workbooks.Open(path, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
    
        var sheets = workbook.Worksheets;
        var sheet = (Worksheet)sheets.get_Item("Sheet1");
    
        var range = sheet.get_Range("A1", "A1");
        var hyperlinks = range.Cells.Hyperlinks.OfType<Hyperlink>();
    
        foreach (var h in hyperlinks)
        {
            Console.WriteLine("text: {0}, address: {1}", h.TextToDisplay, h.Address);
        }
    }
    finally
    {
        if (app != null)
            app.Quit();
    }
    

    输出:

    text: example.com, address: http://www.example.com/
    

    【讨论】:

    • 我很欣赏这个答案,但语法在我的系统上不起作用,我使用我的 C# 程序在 excel 方面完成了更多工作。
    • @AJ:您使用什么版本的 Excel 和 VSTO?我使用了最新的 .NET 4.0/VS 2010/Excel 14
    • 我用的是excel 2003。程序实际上已经全部完成,正在生成一个数据库。但是由于有 2700 个条目,可能需要大约 7 到 10 个小时才能完成>_>
    【解决方案5】:

    为什么不使用 Uri 类将字符串转换为 URL:

    Uri uri = new Uri("http://myUrl/test.html");
    

    【讨论】:

    • 如何从超链接列中获取字符串 URL?
    【解决方案6】:

    您可以使用 VBA 代码来实现此目的。 按Alt+F11打开VB编辑器,插入Module并粘贴以下代码:

    Sub run()    
        On Error Resume Next    
    
        For Each hLink In Selection    
            Range(hLink.Address).Offset(0, 1) = hLink.Hyperlinks(1).Address    
        Next    
    End Sub
    

    保存您的 excel 文件[在 excel 2007 及更高版本中保存为启用宏...]

    【讨论】:

      【解决方案7】:

      试试这个:

      Excel.Application appExcel = new Excel.Application();
      Excel.Workbooks workBooks = appExcel.Workbooks;
      Excel.Workbook excelSheet = workBooks.Open("......EditPath", false, ReadOnly: true);
      
      foreach (Excel.Worksheet worksheet in excelSheet.Worksheets)
      {
          Excel.Hyperlinks hyperLinks = worksheet.Hyperlinks;
          foreach (Excel.Hyperlink lin in hyperLinks)
          {
              System.Diagnostics.Debug.WriteLine("# LINK: adress:" + lin.Address);
          }
      }
      

      【讨论】:

        【解决方案8】:

        我刚刚遇到了这个问题,这对我有用:

        我对范围使用了 FormulaR1C1 扩展方法。所以我的代码看起来像这样:

                            for (int r = 2; r <= sheetRange.Rows.Count; r++)
                            {
                                documentRecord = new List<string>();
                                for (int c = 1; c <= wkCol; c++)
                                {
                                    documentRecord.Add(sheetRange.Cells[r, c].FormulaR1C1); 
                                }
                                AllRecords.Add(documentRecord);
                            }
        

        当记录被添加到记录列表中时,无论单元格区域的值被格式化为一个可点击的超链接。

        【讨论】:

          猜你喜欢
          • 2017-06-03
          • 2016-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-20
          • 2017-07-23
          • 1970-01-01
          相关资源
          最近更新 更多