Intereting Posts
Нужен ли мне BindingSource и BindingList для WinForms DataBinding? Преобразовать или сопоставить экземпляр classа с списком другого с помощью Lambda или LINQ? Управление указателем мыши через алгоритм camshift OpenCV (или как мышь в основном функционирует) Дизайнер XAML не появляется Как неоднозначные значения enums разрешены в C #? Как добавить несколько файлов в список воспроизведения C #: поиск массива byte в памяти другого процесса WPF добавить столбец изображения datagrid? Преобразование текста в верхний регистр при вводе текста в текстовое поле Как сделать «всегда-на-нижнем» окне Как LINQPad компилирует код? Запретить использование конструктора по умолчанию Рекомендуется ли использовать prevTask.Wait () для использования с ContinueWith (из библиотеки задач)? Имеет ли C # аналог «ThreadLocal» (для членов данных) атрибуту «ThreadStatic»? Можно ли переключать строки и столбцы в datagridview?

Excel.Worksheet.Cells = “= Formula” vs. Range.set_Value (Missing.Value, arrayFormulas)

Excel.Worksheet.Cells[row,col] = "=Formula / reference" 

Хотя в приведенном выше Excel обновляет формулу / ссылку и показывает результат в таблице данных в приведенном ниже коде при использовании Range.set_Value(..) техническое описание не обновляется вообще

 string[,] myFormulas = new string[nrRows, nrColumns]; ... myFormulas [x,y] = eg "=SUM(D1:D" + rowNr + ")"; myFormulas [x,y+1] = eg "=Table1!A1"; ... Range.set_Value(Missing.Value, myFormulas) 

и он показывает только формулу в виде строки, например =Table1!A1 .

Я не могу обновить его. Ни с CalucalteAll() , ни с RefreshAll() , ни с anyhing. Любые предложения о том, как получить обновление в таблице данных?

EDIT: вы можете установить весь массив с помощью одного оператора Range.set_Value(Missing.Value, myFormulas) . Мой вопрос заключается в том, как заставить excel оценивать формулы в этом массиве (а не рассматривать их как простые строки или устанавливать ячейки один за другим, чем Excel, чем пересчитывает.)?

Я обнаружил, что rangeVariable.Formula = rangeVariable.Value переведет «формулу в виде текста» в формулу Excel, и это делается для всех ячеек в этом диапазоне.

 Worksheet sheetOne = ... int numberOfRows = 5000; // Make a massive range on sheet 1, then use cell assignment by array for fastness Range range = sheetOne.Range["A1"]; string[,] links = new string[numberOfRows+1, 1]; range = range.Resize[numberOfRows+1, 1]; for (int count = 0; count < numberOfRows; count++) { // Build the =HYPERLINK formula to set as text in each cell string worksheet = "Sheet2"; string cellRef = string.Format("A{0}", count + 1); string formula = string.Format("=HYPERLINK(\"#{0}!{1}\", \"{2}\")", worksheet, cellRef, string.Format("Hyperlink number {0}", count)); links[count, 0] = formula; } //range.set_Item(Type.Missing, Type.Missing, links); range.set_Value(Type.Missing, links) // thanks HeinrichStack range.Formula = range.Value; //<--- Boom baby, all 'formula as text' turns into bona fide excel formula 

Надеюсь это поможет

Я не думаю, что есть какой-либо способ установить значение Formula для любой данной ячейки, за исключением того, что намеренно устанавливает для нее свойство Formula , по одной ячейке за раз.

Ознакомьтесь со свойствами и примерами здесь.

поэтому я думаю, что вам нужно сделать, это нечто большее:

 Worksheet.Cells[x,y].Formula = "=SUM(D1:D" + rowNr + ")"; Worksheet.Cells[x,y+1].Formula = "=Table1!A1"; 

Я недавно встретил эту проблему и почти весь день искал решение, но не повезло.

И я, наконец, нашел решение, когда пытаюсь исправить еще одну проблему, также относится к типу данных ячеек, в котором вы должны установить для вашего 2-мерного массива тип «объект» вместо типа «строка». Причиной проблемы, на мой взгляд, являются свойства Формулы (также Value, Value2), которые автоматически записывают данные в зависимости от типа данных в коде. Код должен выглядеть примерно так:

 Worksheet sampleSheet = ...; object[,] dataArr = new object[rowNum,colNum]; for (int i = 0; i < rowNum; i+=1) { for (int j = 0; j < colNum; j+=1) { dataArr[i,j] = "=SUM(....)"; } } sampleSheet.Range[....].Formula = dataArr; 

Надеюсь, эта помощь!