Я пытаюсь экспортировать содержимое моего DataGridView в Excel, у меня есть код для этого, однако я хочу, чтобы он добавил дополнительный столбец с Excel Formula

У меня есть этот код до сих пор

private void button1_Click_1(object sender, EventArgs e)
    {
        Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
        Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
        Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
        app.Visible = true;
        worksheet = workbook.Sheets["Sheet1"];
        worksheet = workbook.ActiveSheet;
        worksheet.Name = "Testing this";
        for (int i = 1; i < dataGridView2.Columns.Count + 1; i++)
        {
            worksheet.Cells[1, i] = dataGridView2.Columns[i - 1].HeaderText;
        }
        for (int i = 0; i < dataGridView2.Rows.Count - 1; i++)
        {
            for (int j = 0; j < dataGridView2.Columns.Count; j++)
            {
                worksheet.Cells[i + 2, j + 1] = dataGridView2.Rows[i].Cells[j].Value.ToString();
            }
        }
        workbook.SaveAs("c:\\output.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        app.Quit();
    }

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

Благодарность!

1
David Waldron 24 Ноя 2017 в 16:45

1 ответ

Лучший ответ

Вы можете просто использовать свойство .Formula диапазона, в который хотите добавить формулу, но если вы ссылаетесь на другие ячейки (что вероятно), то .FormulaR1C1 действительно хорош, поскольку он позволяет ссылаться на ячейки основываясь на их относительном положении, а не пытаясь выяснить, что такое строка / столбец.

В приведенном выше примере это добавило бы формулу в качестве самого последнего столбца и взяло бы значение второго столбца слева и умножило бы его на два:

int formulaCol = dataGridView2.Columns.Count + 1;
for (int i = 0; i < dataGridView2.Rows.Count - 1; i++)
{
    for (int j = 0; j < dataGridView2.Columns.Count; j++)
    {
        worksheet.Cells[i + 2, j + 1] = dataGridView2.Rows[i].Cells[j].Value.ToString();
    }

    worksheet.Cells[i + 2, formulaCol].FormulaR1C1 = "=R[0]C[-2]*2";
}

R[0] означает текущую строку. R1 будет на одну строку впереди, а R[-1] будет на одну строку назад.

- РЕДАКТИРОВАТЬ 28.11.17 -

Согласно вашему комментарию, это изящный трюк для преобразования стандартной формулы в R1C1 без каких-либо умственных усилий. Введите формулу как есть. Перейдите в Файл-> Параметры-> Формулы и проверьте вкладку с надписью «Формулы R1C1». Он преобразует вашу обычную формулу в R1C1 и облегчит ее использование в вашем коде.

Что круто, когда вы копируете / вставляете формулу, вы заметите, что она не меняется, как обычный стиль A1.

Итак, в вашем примере, если я помещу вашу формулу в J7, она станет:

= ЕСЛИ (ISNA (ПОИСКПОЗ (R [-5] C [-9], C [-7], 0)), «», ИНДЕКС (C [-7], ПОИСКПОЗ (R [-5] C [-9 ], C [-7], 0)))

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

Так что введите его, как обычно, измените на R1C1 и используйте его для своего кода C #.

enter image description here

1
Hambone 28 Ноя 2017 в 11:16