Извлечение URL-адреса из текста с гиперссылкой в ячейке Excel

#c# #.net #excel #hyperlink #vsto

#c# #.net #excel #гиперссылка #vsto

Вопрос:

У меня в Excel есть таблица, полная текста с гиперссылкой, так что в основном это набор имен, но когда я нажимаю на одно, оно переводит меня на некоторый URL-адрес в моем браузере по умолчанию.

Итак, я извлекаю текст из этой таблицы Excel в своей программе, но значение, которое я получаю при извлечении из этих ячеек с гиперссылками, соответствует строке внутри, когда я хочу 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 будет содержать текст:

Рецепт вкусного печенья

И я хочу извлечь строку:

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

Комментарии:

1. Показать пример Excel и некоторый код

2. Я показал код, но файл Excel — это всего лишь один столбец текста с гиперссылкой, с записями, точно такими же, как в примере cookie, показанном выше.

Ответ №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)

Комментарии:

1. Большое спасибо, я просто использовал это, чтобы извлечь все ссылки на другую часть таблицы с помощью моей программы, а затем скопировать / вставить их в новую таблицу Excel. Беспорядочно, но конечный результат — это именно то, что я хотел.

Ответ №2:

В вашем коде просто добавьте

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

Я, очевидно, рекомендую выполнить некоторые проверки перед доступом к свойству «Гиперссылки».

Комментарии:

1. Это лучший ответ с точки зрения программирования. Для этого не требуется изменять таблицу Excel. Я счел необходимым изменить xlws. Ячейки в xlws. Листы [1]. Ячейки.

Ответ №3:

Функция VBA:

  1. Нажмите Alt F11 (открывается редактор Visual Basic)
  2. Нажмите Вставить -> Модуль (добавляет модуль в ваш файл Excel)
  3. Вставьте приведенный ниже код для функции GETURL
  4. Нажмите Alt Q (закрывает редактор Visual Basic)

Теперь используйте =GETURL(cell) для получения URL
Пример: =GETURL(A1) вернет URL-адрес гиперссылки, отображаемой в ячейке A1

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

Источник

Ответ №4:

Используйте Visual Studio Tools для Office (VSTO), чтобы открыть книгу Excel и извлечь все гиперссылки.


Я поместил гиперссылку в A1 листа 1 в Book1.xlsx : text = «example.com, адрес = «http://www.example.com «

 _Application app = null;
try
{
    app = new Application();

    string path = @"c:tempBook1.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/
  

Комментарии:

1. Я ценю ответ, но синтаксис не работал в моей системе, и я немного справился с работой на стороне Excel, используя свою программу на C #.

2. @AJ: Какую версию Excel и VSTO вы используете? Я использовал последнюю версию .NET 4.0 / VS 2010 / Excel 14

3. Я использую Excel 2003. На самом деле программа уже все закончила и создает базу данных. Но поскольку имеется 2700 записей, для завершения может потребоваться от 7 до 10 часов >_>

Ответ №5:

почему бы не использовать класс Uri для преобразования строки в URL:

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

Комментарии:

1. Как вы получаете 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);
                    }
  

Когда запись добавляется в список записей, значение любого диапазона ячеек форматируется в виде гиперссылки с возможностью кликабельности.