EPPlus неправильно определяет диапазон вызовов формул на другом листе

Isaac Little спросил: 13 октября 2017 в 06:31 в: c#

Я использую EPPlus для экспорта таблицы Excel, в которой записываются результаты различных тестов, а затем делается их краткое изложение. У меня есть эти строки кода, которые хорошо работают

groupsheet.Cells[3, 5, 3, (25 + (tPts.Count() - 1) * 9) ].Formula = "AVERAGE(E6:E"+(5+ mCount).ToString()+")";
groupsheet.Cells[4, 5, 4, (25 + (tPts.Count() - 1) * 9) ].Formula = "STDEV(E6:E"+(5+ mCount).ToString()+")";
groupsheet.Cells[5, 5, 5, (25 + (tPts.Count() - 1) * 9) ].Formula = "MAX(E6:E"+(5+ mCount).ToString()+")";

Как я и ожидал от EPPlus, этот код колеблется. Таким образом, E3 получает "= Среднее (E6: E8)" (если mCount равен 3), F3 получает "= Среднее (F6: F8)" и т. Д. Вплоть до конца (как определено длиной tPts). Точно так же все в строке 4 получает стандартное отклонение желаемого диапазона, а все в строке 5 получает максимум желаемого диапазона.

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

summarysheet.Cells[3 + groupCount * 4, 5, 5 + groupCount * 4, (25 + (tPts.Count() - 1) * 9)].Value = groupsheet.Cells[3 , 5, 5 , (25 + (tPts.Count() - 1) * 9)].Value;

Это работает, как и ожидалось, помещая значение из отдельной группы в нужное место на сводном листе. Но мне бы хотелось, чтобы каждая ячейка содержала ссылку на соответствующую ячейку на листе отдельной группы (под названием Group1, Group2, Group3 ...), чтобы сводная таблица изменялась динамически с изменениями, внесенными в отдельные таблицы групп.

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

summarysheet.Cells[3 + groupCount * 4, 5, 5 + groupCount * 4, (25 + (tPts.Count() - 1) * 9)].Formula = "Group"+ groupNumKey.ToString() +"!E3";

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

Большое спасибо!

Это моя попытка метод грубой силы

// Iterate over each column to put the references in place
int currColNum = 5; //Start at 5 (E)
string currColName = "E";
int maxColNum = (25 + (tPts.Count() - 1) * 9); // End at the last column
while (currColNum <= maxColNum)
{
    currColName = Base26Encode(currColNum); // Finds the excel column name from the row #
    summarysheet.Cells[3 + groupCount * 4, currColNum].Formula = "Group" + groupNumKey.ToString() + "!" + currColName + "3"; // Grab Average
    summarysheet.Cells[4 + groupCount * 4, currColNum].Formula = "Group" + groupNumKey.ToString() + "!" + currColName + "4"; // Grab STD
    summarysheet.Cells[5 + groupCount * 4, currColNum].Formula = "Group" + groupNumKey.ToString() + "!" + currColName + "5"; // Grab Max    currColNum++;
}

где "Base26Encode" - это фрагмент кода, который выводит A, когда ему дано 1, Z, когда ему дано 26, AA, когда ему дано 27, и так далее (преобразование индексы столбцов в имена столбцов Excel)


0 ответов