Eppluse сложная гиперссылка приводит к сбою файла excel

Я использую библиотеку eppluse для создания отчетов на C# .
Отчеты содержат миллионы URL-адресов, которые я должен отображать в виде гиперссылок / кликабельных ссылок. В настоящее время все работает, но некоторые URL-адреса ломают мой файл Reports.xlsx. Привязка ошибок в Excel

Пример кода:

for (var j = 0; j < values.Length; j++)
{
    // Format values before printing
    object cellValue = ParseString(values[j].Replace("\"", ""));

    // Check for urls and conver to hyperlinks
    if (cellValue.GetType().Name.ToLower() == "uri")
    {
        worksheet.Cells[i + 1, j + 1].Hyperlink = new ExcelHyperLink(Uri.EscapeUriString(cellValue.ToString().Replace("[", "%5B").Replace("]", "%5D"))) { Display = "Link" };
        worksheet.Cells[i + 1, j + 1].StyleName = hyperLinkStyle.Name;
    }
    else
    {
        worksheet.Cells[i + 1, j + 1].Value = cellValue;
    }
}

Просто из любопытства ... Зачем вам лист с миллионами кликабельных URL? Кто их всех щелкнет?

VDWWD 26.10.2018 18:34

Фактически, продукты нашего клиента находятся на разных сайтах электронной коммерции, и мы проверяем нарушения продукта и предоставляем отчет, который содержит фактические URL-адреса продуктов. Иногда это очень большой отчет, который содержит миллионы URL-адресов и их создание.

manjusha 27.10.2018 07:13
0
2
205
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я запустил ваш код. В этом нет ничего плохого. Но повезло, что я допустил небольшую ошибку в приведенном ниже фрагменте для тестирования. В настоящее время он создает гиперссылку для каждой заполненной ячейки на листе.

for (int col = 1; col <= ws.Dimension.End.Column; col++)
{
    ws.Column(col).Width = ws.Column(col).Width + 1;

    for (var j = 1; j <= ws.Dimension.End.Row; j++)
    {
        ws.Cells[col, j].Hyperlink = new ExcelHyperLink(Uri.EscapeUriString("http://www.google.nl".Replace("[", "%5B").Replace("]", "%5D"))) { Display = "Link" };
    }
}

Но в первый раз я запустил этот фрагмент со следующим Cells[col + 1, j + 1]. Это создало полностью заполненный лист Excel, поскольку в цикле он каждый раз сдвигал Dimension.End. Но когда лист был заполнен, возникла та же ошибка, что и у вас. Что лист был поврежден.

В заключение может показаться, что ни Excel, ни EPPlus не могут обрабатывать гиперссылки сверх определенного числа ...

Нет, на самом деле я представил здесь только основную часть своей функции. Он работает большую часть времени, но не работает для некоторых важных URL-адресов / URL-адресов с недопустимыми символами. Ячейки [col + 1, j + 1] это для пропуска первой строки, которую я уже добавил в Excel в качестве заголовка. И я добавил ws.Cells [col, j] .Hyperlink = new Uri (value); после проверки значение является допустимым URL-адресом, в противном случае я устанавливаю только ws.Cells [col, j] .value = value;

manjusha 29.10.2018 18:24
Ответ принят как подходящий

Благодарим за помощь следующее решение, работающее на данный момент. Я не уверен, как долго это будет работать, но в настоящее время работает без сбоев.

string url = Uri.EscapeUriString(cellValue.ToString().Replace("[", "%5B").Replace("]", "%5D"));
        if (cellValue.ToString().Length < 256)
        {
            worksheet.Cells[i + 1, j + 1].Formula = string.Format("HYPERLINK(\"{0}\",\"{1}\")", url, "Link");
        }
        else
        {
            worksheet.Cells[i + 1, j + 1].Hyperlink = new ExcelHyperLink(url) { Display = "Link" };
        }

Другие вопросы по теме