1

这就是我正在经历的。我正在将 Excel dll 与 c# 一起使用,以便进入一个又大又讨厌的 excel 工作表,这样其他人就不必这样做了。

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

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

问题是,当我像这样复制公式时,它仍然给我所有与第一行有关的值,而不是我粘贴它的行.....这是我的代码:

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

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

4

4 回答 4

12

这可能会起作用,因为它适用于 VBA ......在大多数情况下。

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

这会起作用,因为FormulaR1C1(不是一个信息量很大的链接)使用 R1C1 表示法,它描述了与当前单元格相关的引用单元格的位置,而不是说明要使用哪些单元格。这意味着实际引用取决于带有公式的单元格。当您只使用Formula时,您正在复制Formula包含硬编码单元格引用的字符串。

于 2012-12-07T23:56:39.007 回答
2

你可以使用Application.ConvertFormula

所以,假设我的 Cell = Cells 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()

于 2012-12-08T00:22:07.420 回答
0

大家好,我发布此代码是因为此代码用于复制 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();
    }
}
于 2017-10-14T07:30:24.033 回答
0

我正在使用 c# 代码和 Microsoft.Office.Interop.Excel 库发布此代码以用于范围 excel 公式:

class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        p.Excel();
    }

    public void Excel()
    {
        Application xlApp = new Application();
        Workbook xlWorkBook;
        Worksheet xlWorkSheet;
        object misValue = Missing.Value;

        xlWorkBook = xlApp.Workbooks.Add(misValue);
        xlWorkSheet = (Worksheet)xlWorkBook.Worksheets.get_Item(1);

        for (int r = 1; r < 5; r++) //r stands for ExcelRow and c for ExcelColumn
        {
            // Its a my sample example: Excel row and column start positions for writing Row=1 and Col=1
            for (int c = 1; c < 3; c++)
            {
                if (c == 2)
                {
                    if (r == 1)
                    {
                        xlWorkSheet.Cells[r, c].Formula = "=SUM(A1+200)";
                    }
                    continue;
                }
                xlWorkSheet.Cells[r, c] = r;
            }
        }
        Range rng = xlWorkSheet.get_Range("B1");
        //  This is the main code we can range our excel sheet formulas
        rng.AutoFill(xlWorkSheet.get_Range("B1", "B4"), XlAutoFillType.xlLinearTrend);

        xlWorkBook.Worksheets[1].Name = "MySheetData";//Renaming the Sheet1 to MySheet

        xlWorkBook.SaveAs(@"E:\test.xlsx");

        xlWorkBook.Close();

        Marshal.ReleaseComObject(xlWorkSheet);
        Marshal.ReleaseComObject(xlWorkBook);
        Marshal.ReleaseComObject(xlApp);

    }
}
于 2020-11-22T15:19:41.797 回答