Добавление формулы в Excel с помощью C # - создание формулы - PullRequest
9 голосов
/ 16 января 2012

Я хотел добавить формулы в рабочую таблицу Excel.
Мне удалось сделать это с помощью свойства Формула .

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

Очевидно, что если я введу формулу в самом Excel, я смогу увидеть результат в ячейке, а формулу - в строке формул.

Часть моего кода:

for (int i = 0; i < nOfColumns / 3; i++)
{
    Range cells = workSheet.Range[workSheet.Cells[2, i * 3 + 3], workSheet.Cells[lastRowNumber, i * 3 + 3]];
    cells.FormulaR1C1 = "=IF(EXACT(RC[-2],RC[-1]),TRUE,ABS(RC[-2]/RC[-1]-1))";
}

ниже - тестовый код. даже после сохранения книги - FormulaHidden имеет значение false, и я могу успешно извлечь введенную формулу. действительно разочарован

        Microsoft.Office.Interop.Excel.Application excelApp = null;
        Workbooks workBooks = null;
        Workbook workBook = null;
        Worksheet workSheet;

        try
        {

            excelApp = new Microsoft.Office.Interop.Excel.Application();
            excelApp.DisplayAlerts = false;

            workBooks = excelApp.Workbooks;
            workBook = workBooks.Open(filePath, AddToMru: false);
            workSheet = workBook.Worksheets.get_Item(1);

            int nOfColumns = workSheet.UsedRange.Columns.Count;
            int lastRowNumber = workSheet.UsedRange.Rows.Count;

            Range rng = workSheet.Range["C1"];
            rng.Formula = "=SUM(B2:B4)";
            String formula = rng.Formula; //retrieve the formula successfully

            rng.FormulaHidden = false;
            workSheet.Unprotect();

            workBook.SaveAs(filePath, AccessMode: XlSaveAsAccessMode.xlExclusive);

            formula = rng.Formula;  //retrieve the formula successfully
            bool hidden = rng.FormulaHidden;

        }
        catch (Exception e)
        {
            throw;
        }
        finally
        {
            if (workBook != null)
            {
                workBook.Close();
                workBook = null;
            }
            if (workBooks != null)
            {
                workBooks.Close();
                workBooks = null;
            }
            if (excelApp != null)
            {
                excelApp.Quit();
                excelApp = null;
            }
        }
    }

Кто-нибудь знает, как сделать показанную формулу при программном добавлении формул ?

Ответы [ 4 ]

3 голосов
/ 19 января 2012

наконец !!!догадаться.Такое поведение вызвано флагами SaveAs.изменено

workBook.SaveAs (filePath, AccessMode: XlSaveAsAccessMode.xlExclusive);

на

workBook.SaveAs (filePath, AccessMode:XlSaveAsAccessMode.xlShared);

Теперь осталось только понять, что именно различается между двумя флагами.:)

1 голос
/ 16 января 2012

Скрытие формулы (путем установки флажка Скрытый в диалоговом окне Формат ячеек) и защита рабочего листа (после этого) приведут к тому, что формула не будет отображаться на панели формул.

Пример кода VBA

Range("C1").FormulaHidden = True    'set this property to false to make formula visible.
Sheet1.Protect

РЕДАКТИРОВАТЬ: чтобы увидеть формулу в строке формул

Range("C1").FormulaHidden = False
Sheet1.Unprotect
0 голосов
/ 19 января 2012

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

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

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

0 голосов
/ 16 января 2012

Перейдите на вкладку «Формула» на панели инструментов и нажмите «Показать формулы».

enter image description here

...