从Excel单元格中的超链接文本中提取URL
我在excel中有一个超链接文本,所以基本上是一堆名字,但是当我点击一个时,它会把我带到默认浏览器中的一些URL。
所以我从我的程序中的excel表中提取文本,但是我从这些超链接单元格中提取的值是string里面的值,当我想要将string链接到的URL在excel文件中。
所以我想有两种方法可以做到这一点。 我可以将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将包含文本:
美味的cookies食谱
我想提取string:
http://allrecipes.com//Recipes/desserts/cookies/Main.aspx
你可以使用vbamacros:
按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
然后你可以在你的Worksheet中使用它,就像这样:
=URL(B4)
VBAfunction:
- 按Alt + F11 (打开Visual Basic编辑器)
- 点击插入 – >模块(添加一个模块到你的Excel文件)
- 将下面的代码粘贴到GETURL的函数中
- 按Alt + Q (closuresVisual Basic编辑器)
现在使用=GETURL( cell )
来获取URL
示例: =GETURL(A1)
将返回单元格A1中显示的超链接的URL
Function GETURL(HyperlinkCell As Range) GETURL = HyperlinkCell.Hyperlinks(1).Address End Function
资源
在你的代码中只需添加
string myString = ((Excel.Range)xlws.Cells[2, 1]).Cells.Hyperlinks[1].Address;
我显然build议在访问“超链接”属性之前进行一些检查。
使用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/
为什么不使用Uri类将string转换为URL:
Uri uri = new Uri("http://myUrl/test.html");
您可以使用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及以上保存为启用macros…]
我刚碰到这个问题,这对我来说是有效的:
我在一个范围内使用了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); }
当logging被添加到logging列表时,无论单元格范围的值被格式化为可点击超链接。