从Excel单元格中的超链接文本中提取URL

9
我在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包含文本:

美味饼干食谱

我想提取字符串:

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

展示Excel示例和一些代码。 - abatishchev
我展示了代码,但是 Excel 文件只是一列超链接文本,其条目与上面显示的 cookie 示例完全相同。 - AJ_
8个回答

10
你可以使用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表格中。虽然有些混乱,但最终结果正是我想要的。 - AJ_

8
在您的代码中,只需要添加以下内容:
string myString = ((Excel.Range)xlws.Cells[2, 1]).Cells.Hyperlinks[1].Address;

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


1
从编程角度来看,这是最好的答案。它不需要修改Excel工作表。我发现将xlws.Cells更改为xlws.Sheets [1] .Cells是必要的。 - HaveSpacesuit

5

VBA函数:

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

现在使用 =GETURL(单元格) 来获取 URL
例子: =GETURL(A1) 将返回单元格 A1 中显示的超链接的 URL

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

Source


2
使用Visual Studio Tools for Office (VSTO)打开Excel工作簿并提取所有超链接。
我在Sheet1的A1单元格中放置了一个超链接,Book1.xlsx: 文本="example.com", 地址="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_
@AJ:你使用的Excel和VSTO版本是什么?我使用的是最新版本,.NET 4.0/VS 2010/Excel 14。 - abatishchev
我正在使用Excel 2003。程序实际上已经全部完成,正在生成一个数据库。但由于有2700个条目,可能需要大约7到10个小时才能完成>_>。 - AJ_

0

试试这个:

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);
    }
}

0
为什么不使用Uri类将字符串转换为URL:
Uri uri = new Uri("http://myUrl/test.html");

你如何从超链接列中获取字符串URL? - Timothy Gonzalez

0

您可以使用VBA代码来实现这一点。 按下Alt + F11打开VB编辑器,插入一个模块并粘贴以下代码:

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 及以上版本中另存为启用宏...]


-1

我刚遇到了这个问题,以下是我的解决方法:

我使用了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);
                    }

当记录被添加到记录列表中时,无论单元格范围是什么,其值都会被格式化为可点击的超链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接