Реализация динамической/совпадающей гиперссылки в Excel с помощью EpplusC#

Место общения программистов C#
Ответить
Anonymous
 Реализация динамической/совпадающей гиперссылки в Excel с помощью Epplus

Сообщение Anonymous »

Хорошо, прежде чем мы начнем: у меня уже есть формула, которая работает на 95%.
Моя проблема заключается в том, что когда Excel открывается впервые после генерации, формулы приходится вручную запускать для ссылок для «рендеринга», что довольно... раздражает.
Ради простоты я не буду представлять вам фактическую реализацию, а только уменьшенную версию. Версия C#, с которой мы работаем, — 9.0 и EPPlus 4.5.3.3 (поскольку компания не желает приобретать лицензию, обновление невозможно)
Итак, в реализации MAIN цель такова: у нас есть 2 рабочих листа. Оба имеют поле идентификатора. За полем идентификатора на втором листе должно следовать поле гиперссылки.
Это поле гиперссылки «должно найти первую строку на первом листе, имеющую соответствующий идентификатор, а затем отобразить поле имени этой строки (1-й лист) в поле ссылки (2-й лист).
Я надеюсь, что это было достаточно хорошее объяснение реализации MAIN. Теперь мы переходим к уменьшенной версии, которую я могу объяснить немного глубже.
/>При этом мы будем работать с ОДНИМ листом.
Существует раздел данных (Продавец, Месяц, товар)
и раздел поиска (Значение, Соответствие)
Если значение в поиске соответствует имени продавца, поле «Совпадение» рядом с ним должно ссылаться на товар продавца.
Вот и желаемое отображение
Изображение

Теперь, как уже говорилось ранее, я уже получил формулу для этого
=HYPERLINK("#"&CELL("address"; INDEX($C$2:$C$10; MATCH($E2;$A$2:$A$10;0))); INDEX($C$2:$C$10; MATCH($E2;$A$2:$A$10;0)))
Но моя проблема в том, что генерация сообщений отображается вот так
Изображение

И мне нужно щелкнуть ячейку и нажать Enter, чтобы гиперссылка отобразилась.
Изображение

Здесь у вас есть реализация EPPLus C# (он не автоматизирован, потому что это опять же небольшая демонстрация

Код: Выделить всё

string excelPath = "Result.xlsx"; // Path to my Excel file

using (ExcelPackage package = new ExcelPackage())
{
ExcelWorkbook wb = package.Workbook;

ExcelWorksheet ws = wb.Worksheets.Add("Sheet");

#region Fill Cells

ws.Cells[1, 1].Value = "Seller";
ws.Cells[1, 2].Value = "Month";
ws.Cells[1, 3].Value = "Product";

ws.Cells[2, 1].Value = "Robert";
ws.Cells[2, 2].Value = "Mar";
ws.Cells[2, 3].Value = "Bananas";

ws.Cells[3, 1].Value = "Tom";
ws.Cells[3, 2].Value = "Feb";
ws.Cells[3, 3].Value = "Oranges";

ws.Cells[4, 1].Value = "Adam";
ws.Cells[4, 2].Value = "Jan";
ws.Cells[4, 3].Value = "Lemons";

ws.Cells[1, 5].Value = "Lookup value";
ws.Cells[2, 5].Value = "Adam";
ws.Cells[3, 5].Value = "Tom";

ws.Cells[1, 6].Value = "First match";
ws.Cells[2, 6].Value = "=HYPERLINK(\"#\"&CELL(\"address\"; INDEX($C$2:$C$10; MATCH($E2;$A$2:$A$10;0))); INDEX($C$2:$C$10; MATCH($E2;$A$2:$A$10;0)))";
ws.Cells[3, 6].Value = "=HYPERLINK(\"#\"&CELL(\"address\"; INDEX($C$2:$C$10; MATCH($E3;$A$2:$A$10;0))); INDEX($C$2:$C$10; MATCH($E3;$A$2:$A$10;0)))";

wb.CalcMode = ExcelCalcMode.Automatic;
wb.FullCalcOnLoad = true;
wb.Calculate(new ExcelCalculationOption(){ AllowCirculareReferences = true});

#endregion

package.SaveAs(new FileInfo(excelPath));
}
Я много экспериментировал. Я пробовал помещать функцию не в Cell.Value, а в Cell.Formular (потом я удалил = в начале)
Я также пробовал запустить команду вычисления для самих ячеек, прежде чем сохранить ее.
Теперь, прежде чем вы спросите: да, важно, чтобы ссылка была динамической, потому что в основной реализации все сортируется, поэтому строки будут меняться местами, но ссылки на втором листе должны адаптироваться, поэтому они по-прежнему указывают на правильные row.
Надеюсь, я смог правильно объяснить свою проблему.

Подробнее здесь: https://stackoverflow.com/questions/797 ... ith-epplus
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»