#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:
- Нажмите Alt F11 (открывается редактор Visual Basic)
- Нажмите Вставить -> Модуль (добавляет модуль в ваш файл Excel)
- Вставьте приведенный ниже код для функции GETURL
- Нажмите 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);
}
Когда запись добавляется в список записей, значение любого диапазона ячеек форматируется в виде гиперссылки с возможностью кликабельности.