从 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# 代码。
我正在尝试将我的 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# 代码。