复制一个公式 – 并将其应用到一个新的单元格区域

所以这就是我所经历的。 我正在使用Excel的DLL与C#为了进入一个大的和讨厌的Excel表,以便其他人不必。

我们在一个单元格中有一个相当大的公式,因此我们不想将它复制到每一行。 该公式在放置的行上使用多个值。 如果它在行1上,则使用该行中的大量单元格。

当在Excel中正常复制此公式时,单元格的新范围将被修改以反映新的起始位置。

问题是,当我复制这样的公式,它仍然给我所有的价值,必须做的第一行,而不是我粘贴的行…..这是我的代码:

sheet.Cells[77][row].Formula = sheet.Cells[77][1].Formula; 

有人可以让我知道如何使公式适用于新行而不是第1行吗?

这可能会工作,因为它从VBA工作…在大多数情况下。

 sheet.Cells[77][row].FormulaR1C1 = sheet.Cells[77][1].FormulaR1C1; 

这是可行的,因为FormulaR1C1 (不是一个非常有用的链接)使用R1C1表示法,它描述了与当前单元格有关的引用单元格的位置,而不是说明要使用哪个单元格。 这意味着实际的引用依赖于具有公式的单元格。 当你使用Formula ,你需要复制Formula的string,包括硬编码的单元格引用。

你可以使用Application.ConvertFormula

所以,假设我的单元格=单元格77有一个公式,说=Sum(B77,C77) (来自同一行的单元格)。
如果想要将它复制到它下面的单元格中,则可以执行如下操作:

 string formula = Sheet1.Cells[77][2].Formula; Sheet1.Cells[77][2].Formula = app.ConvertFormula(formula, XlReferenceStyle.xlA1, XlReferenceStyle.xlR1C1, XlReferenceType.xlRelative, Sheet1.Cells[77][3]); 

完整的控制台应用程序工作(你需要修改单元格)。

  static void Main(string[] args) { var app = new Microsoft.Office.Interop.Excel.Application(); var workbook = app.Workbooks.Open(@"C:\Users\user\Desktop\Book1.xlsx"); Microsoft.Office.Interop.Excel.Worksheet Sheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.get_Item("Sheet1"); string formula = Sheet1.Cells[5][3].Formula; Sheet1.Cells[5][4].Formula = app.ConvertFormula(formula, XlReferenceStyle.xlA1, XlReferenceStyle.xlR1C1, XlReferenceType.xlRelative, Sheet1.Cells[5][3]); workbook.SaveAs(@"C:\Users\user\desktop\test.xlsx"); workbook.Close(); } 

您可以根据自己的喜好修改ConvertFormula方法的第三和第四个参数。 阅读更多关于这里的方法: ConvertFormula 。
如果您想要在多行上对公式进行拉伸,可以尝试使用range.AutoFill()

嗨,大家好发表这个,因为这个代码是用来复制公式在Excel中的单元格后面:

 public void copy_Formula_behind_cell() { Excel.Application xlapp; Excel.Workbook xlworkbook; Excel.Worksheet xlworksheet; Excel.Range xlrng; object misValue = System.Reflection.Missing.Value; xlapp = new Excel.Application(); xlworkbook =xlapp.Workbooks.Open("YOUR_FILE", 0, true, 5, "", "",true,Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); xlworksheet = (Excel.Worksheet)xlworkbook.Worksheets.get_Item(1); string sp = xlworksheet.Cells[3,2].Formula;//It will Select Formula using Fromula method// xlworksheet.Cells[8,2].Formula = xlapp.ConvertFormula(sp,XlReferenceStyle.xlA1, XlReferenceStyle.xlR1C1, XlReferenceType.xlAbsolute, xlworksheet.Cells[8][2]); //This is used to Copy the exact formula to where you want// xlapp.Visible = true; xlworkbook.Close(true, misValue, misValue); xlapp.Quit(); releaseObject(xlworksheet); releaseObject(xlworkbook); releaseObject(xlapp); } private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; MessageBox.Show("Unable to release the Object " + ex.ToString()); } finally { GC.Collect(); } }