Я использую библиотеку 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-адреса продуктов. Иногда это очень большой отчет, который содержит миллионы URL-адресов и их создание.
Я запустил ваш код. В этом нет ничего плохого. Но повезло, что я допустил небольшую ошибку в приведенном ниже фрагменте для тестирования. В настоящее время он создает гиперссылку для каждой заполненной ячейки на листе.
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;
Благодарим за помощь следующее решение, работающее на данный момент. Я не уверен, как долго это будет работать, но в настоящее время работает без сбоев.
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" };
}
Просто из любопытства ... Зачем вам лист с миллионами кликабельных URL? Кто их всех щелкнет?