从 C# 导出到 Excel 并使用 Excel 公式添加另一列

Exporting to Excel from c# and adding in another column with Excel formula

我正在尝试将我的 DataGridView 的内容导出到 Excel,我有执行此操作的代码,但是我想要的是添加一个带有 [= 的附加列15=]

目前我有这个代码

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();
    }

我不确定是否要在公式列中添加,如有任何帮助,我们将不胜感激。

谢谢!

您可以简单地使用要添加公式的范围的 .Formula 属性,但是如果您引用其他单元格(这很可能),那么 .FormulaR1C1非常好,因为它可以让您根据单元格的相对位置来引用单元格,而不是试图弄清楚 Row/Column 是什么。

在您上面的示例中,这将添加一个公式作为最后一列,并将从左边数第二列的值乘以二:

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] 向后一排。

-- 编辑 2017 年 11 月 28 日 --

根据您的评论,这是一个巧妙的技巧,无需任何脑力即可将标准公式转换为 R1C1。按原样输入您的公式。转到 File->Options->Formulas 并检查显示 "R1C1 Formulas." 的选项卡,它会将您的普通公式转换为 R1C1 并便于在您的代码中使用它。

很酷的是,当您 copy/paste 公式时,您会发现它不会像普通 A1 样式那样发生变化。

因此,在您的示例中,如果我将您的公式放入 J7,它将变为:

=IF(ISNA(匹配(R[-5]C[-9],C[-7],0)),"",索引(C[-7],匹配(R[-5 ]C[-9],C[-7],0)))

当然这是不对的,因为这完全取决于您最初输入标准公式的单元格。

所以像往常一样输入它,更改为 R1C1,并将其用于您的 C# 代码。