【问题标题】:Copying relative formula with EPPlus not working使用 EPPlus 复制相关公式不起作用
【发布时间】:2019-09-06 14:28:14
【问题描述】:

我在使用 EPPlus 将公式从一个单元格复制到另一个单元格时遇到问题。我希望副本根据单元格位置更改公式。我尝试使用复制功能,并尝试复制 FormulaR1C1 属性。无论哪种方式,公式都会损坏。

要重现错误,请将此公式复制到名为 c:\test\in.xlsx =VLOOKUP(B1,Sheet2!A:B,2,FALSE) 的 Excel 文件的单元格 (1,1) 中

using System.IO;
using OfficeOpenXml;

namespace eptest
{
    class Program
    {
        static void Main(string[] args)
        {
            ExcelPackage ep = null;
            ExcelWorksheet ws = null;

            ep = new ExcelPackage(new FileInfo("c:\\test\\in.xlsx"));
            ws = ep.Workbook.Worksheets["Sheet1"];

            ws.Cells[1, 1].Copy(ws.Cells[2, 1]);
            //ws.Cells[2, 1].FormulaR1C1 = ws.Cells[1, 1].FormulaR1C1; //this doesn't work either

            ep.SaveAs(new FileInfo("c:\\test\\out.xlsx"));

        }
    }
}

【问题讨论】:

  • 我尝试复制 FormulaR1C1 属性,但没有成功。看我上面的例子,很容易复制我的错误。只有几行代码。

标签: c# excel-formula epplus


【解决方案1】:

我认为你发现了一个错误。问题就在这里:

https://github.com/JanKallman/EPPlus/blob/d09fd3516b01c9fc6d6500ab9ff0ed82a60fab7b/EPPlus/ExcelCellBase.cs#L988

由于源单元格和目标单元格之间存在 1 行的增量,因此最终会调用 UpdateFormulaReferences 并尝试调整公式。但是公式中A:B 的部分是它无法正确识别并咀嚼它的整个范围。我将在他们的 GitHub 页面上打开一个问题。

要绕过它,请执行以下操作:

//This does a literal string copy
ws.Cells[1, 1].Copy(ws.Cells[2, 1], ExcelRangeCopyOptionFlags.ExcludeFormulas);
ws.Cells[2, 1].Formula = ws.Cells[1, 1].Formula;

这避免了对该函数的调用,然后对论坛进行文字复制。无法使用 R1C1,因为它也会尝试调整公式。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
相关资源
最近更新 更多