Оптимизированный способ добавления нескольких гиперссылок в файл Excel с C # - PullRequest
2 голосов
/ 27 июля 2011

Я хотел спросить, есть ли какой-нибудь практический способ добавления нескольких гиперссылок в таблицу Excel с помощью C # ..?Я хочу создать список веб-сайтов и привязать к ним гиперссылки, чтобы пользователь мог перейти по такой гиперссылке и перейти на этот сайт.До сих пор я пришел с простым вложенным оператором for, который проходит по каждой ячейке в заданном диапазоне Excel и добавляет гиперссылку на эту ячейку:

for (int i = 0; i < _range.Rows.Count; i++)
        {
            Microsoft.Office.Interop.Excel.Range row = _range.Rows[i];
            for (int j = 0; j < row.Cells.Count; j++)
            {
                Microsoft.Office.Interop.Excel.Range cell = row.Cells[j];
                cell.Hyperlinks.Add(cell, adresses[i, j], _optionalValue, _optionalValue, _optionalValue);
            }
        }

Код работает, как задумано, но он очень медленный из-задо тысяч вызовов метода Hyperlinks.Add.Меня заинтриговало то, что метод set_Value из Office.Interop.Excel может добавлять тысячи строк одним простым вызовом, но аналогичного метода для добавления гиперссылок нет (Hyperlinks.Add может добавить только одну гиперссылку).

Так что мой вопрос: есть ли способ оптимизировать добавление гиперссылок в файл Excel в C #, когда вам нужно добавить большое количество гиперссылок ...?

Любая помощь будет оценена.

1 Ответ

3 голосов
/ 15 февраля 2012

Я использую VS2010 и MS Excel 2010. У меня те же проблемы (добавление 300 гиперссылок через Range.Hyperlinks.Add занимает около 2 минут).

Проблема времени выполнения связана с большим количеством экземпляров диапазона.
Решение:
Используйте один экземпляр диапазона и добавьте гиперссылки с формулой Excel "= HYPERLINK (target, [friendlyName])".

Пример:

List<string> urlsList = new List<string>();
urlsList.Add("http://www.gin.de");
// ^^ n times ...

// create shaped array with content 
object[,] content = new object [urlsList.Count, 1];
foreach(string url in urlsList)
{
    content[i, 1] = string.Format("=HYPERLINK(\"{0}\")", url);
}

// get Range
string rangeDescription = string.Format("A1:A{0}", urlsList.Count+1) // excel indexes start by 1
Xl.Range xlRange = worksheet.Range[rangeDescription, XlTools.missing];

// set value finally
xlRange.Value2 = content;

... занимает всего 1 секунду ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...