EPPlus没有正确地调用调用不同工作表的公式

时间:2017-11-06 20:11:05

标签: c# .net excel epplus

我一直在使用EPPlus导出一个excel工作表,记录各种测试的结果,然后对它们进行基本的总结。我有这些代码行很好用

groupsheet.Cells[3, 5, 3, (25 + (tPts.Count() - 1) * 9) ].Formula = "AVERAGE(E6:E"+(5+ mCount).ToString()+")";
groupsheet.Cells[4, 5, 4, (25 + (tPts.Count() - 1) * 9) ].Formula = "STDEV(E6:E"+(5+ mCount).ToString()+")";
groupsheet.Cells[5, 5, 5, (25 + (tPts.Count() - 1) * 9) ].Formula = "MAX(E6:E"+(5+ mCount).ToString()+")";

正如我对EPPlus所期望的那样,代码范围。所以E3得到“=平均值(E6:E8)”(如果mCount是3),F3得到“=平均值(F6:F8)”等等一直到结尾(由tPts的长度定义)。同样,第4行中的所有内容都会获得所需范围的标准偏差,第5行中的所有内容都会达到所需范围的最大值。

我还有一个整体摘要表,记录了所有单个组表的数据。我目前正在使用以下代码复制确切的值。

summarysheet.Cells[3 + groupCount * 4, 5, 5 + groupCount * 4, (25 + (tPts.Count() - 1) * 9)].Value = groupsheet.Cells[3 , 5, 5 , (25 + (tPts.Count() - 1) * 9)].Value;

这可以按预期工作,将各个组表的值放在摘要表的正确位置。但是我希望如果每个单元格都包含对单个组工作表(标题为Group1,Group2,Group3 ...)上相应单元格的引用,那么摘要表格会随着对各个组表单所做的更改而动态更改。

我的直觉说,正确的方法是通过以下代码。

summarysheet.Cells[3 + groupCount * 4, 5, 5 + groupCount * 4, (25 + (tPts.Count() - 1) * 9)].Formula = "Group"+ groupNumKey.ToString() +"!E3";

然而,这只是将单元格E3的公式粘贴到每个单元格中。我无法弄清楚如何使公式调用范围与它们在一个工作表中包含的方式类似。

非常感谢!

这是我对蛮力方法的尝试

// Iterate over each column to put the references in place
int currColNum = 5; //Start at 5 (E)
string currColName = "E";
int maxColNum = (25 + (tPts.Count() - 1) * 9); // End at the last column
while (currColNum <= maxColNum)
{
    currColName = Base26Encode(currColNum); // Finds the excel column name from the row #
    summarysheet.Cells[3 + groupCount * 4, currColNum].Formula = "Group" + groupNumKey.ToString() + "!" + currColName + "3"; // Grab Average
    summarysheet.Cells[4 + groupCount * 4, currColNum].Formula = "Group" + groupNumKey.ToString() + "!" + currColName + "4"; // Grab STD
    summarysheet.Cells[5 + groupCount * 4, currColNum].Formula = "Group" + groupNumKey.ToString() + "!" + currColName + "5"; // Grab Max

    currColNum++;
}

其中“Base26Encode”是一段代码,当给定1时输出A,给定26时输出Z,给定27时输出AA,依此类推(将列索引转换为excel列名)

1 个答案:

答案 0 :(得分:1)

如果你想在另一张纸上反映单元格,你似乎有正确的公式,但你已经硬编码!E3,所以有意义的是公式将等于'GroupX!E3&#34;。好像你需要做的就是改变这个:

summarysheet.Cells[3 + groupCount * 4, 5, 5 + groupCount * 4, (25 + (tPts.Count() - 1) * 9)].Formula 
    = "Group" + groupNumKey.ToString() +"!E3";

到此:

//Use a variable to save space and avoid repeating the same calculation over and over
var row = (25 + (tPts.Count() - 1) * 9);
summarysheet.Cells[3 + groupCount * 4, 5, 5 + groupCount * 4, row].Formula 
    = "Group" + groupNumKey.ToString() +"!E" + row; 

如果我误解,请告诉我。

回复评论: @Iassac我仍然在理解你想要做的事情上有点麻烦。也许发布更多代码,因为它有点难以掌握而没有更多。如果它有帮助,这是一个单元测试,我想出了它允许我在具有公式的另一张表中引用单元格:

[TestMethod]
public void SheetReferenceTest()
{
    //https://stackoverflow.com/questions/47144930
    var file = new FileInfo(@"c:\temp\SheetReferenceTest.xlsx");
    if (file.Exists)
        file.Delete();

    using (var pck = new ExcelPackage(file))
    {
        var group = 1;
        var workbook = pck.Workbook;    
        var group1 = workbook.Worksheets.Add($"group{group}");
        var summarysheet = workbook.Worksheets.Add("summarysheet");

        group1.Cells["A1"].Value = 2;
        group1.Cells["A2"].Value = 3;
        group1.Cells["A3"].Value = 6;
        group1.Cells["A4"].Value = 27;
        group1.Cells["A5"].Formula = "Average(A1:A4)";

        //This shows "=group1!A5" in Excel when the cell is selected
        summarysheet.Cells["A1"].Formula = $"group{group}!A5";

        pck.Save();
    }
}

回复编辑

好的,现在我得到了你想要的东西。似乎你是对的,我无法获得excel来处理共享字符串公式。我不确定这是一个Epplus问题,因为我甚至不知道这是否是excel可以做的事情?以下是我想出的单元测试问题:

[TestMethod]
public void SheetReferenceTest()
{
    //https://stackoverflow.com/questions/47144930
    var file = new FileInfo(@"c:\temp\SheetReferenceTest.xlsx");
    if (file.Exists)
        file.Delete();

    using (var pck = new ExcelPackage(file))
    {
        var group = 1;
        var workbook = pck.Workbook;    
        var group1 = workbook.Worksheets.Add($"group{group}");
        var summarysheet = workbook.Worksheets.Add("summarysheet");
        var random = new Random();

        const int rows = 10;
        const int cols = 15;
        for (var r = 0; r < rows; r++)
            for (var c = 0; c < cols; c++)
                group1.Cells[r + 1, c + 1].Value = random.Next(100);

        //This works fine and auto increments the formala to B1:B10, C1:C10, etc.
        group1.Cells[rows + 1, 1, rows + 1, cols].Formula = $"AVERAGE(A1:A{rows})";

        //This does not, it just does group1!A1:A10 for all cells.
        summarysheet.Cells[rows + 1, 1, rows + 1, cols].Formula = $"AVERAGE(group1!A1:A{rows})";

        pck.Save();
    }
}

以下是工作表的xml:

<row r="11">
    <c r="A11" s="0">
        <f ref="A11:O11" t="shared" si="1">AVERAGE(A1:A10)</f>
    </c><c r="B11" s="0">
        <f t="shared" si="1"/>
    </c><c r="C11" s="0">
        <f t="shared" si="1"/>
    </c><c r="D11" s="0">
        <f t="shared" si="1"/>
    </c><c r="E11" s="0">
        <f t="shared" si="1"/>
    </c><c r="F11" s="0">
        <f t="shared" si="1"/>
    </c><c r="G11" s="0">
        <f t="shared" si="1"/>
    </c><c r="H11" s="0">
        <f t="shared" si="1"/>
    </c><c r="I11" s="0">
        <f t="shared" si="1"/>
    </c><c r="J11" s="0">
        <f t="shared" si="1"/>
    </c><c r="K11" s="0">
        <f t="shared" si="1"/>
    </c><c r="L11" s="0">
        <f t="shared" si="1"/>
    </c><c r="M11" s="0">
        <f t="shared" si="1"/>
    </c><c r="N11" s="0">
        <f t="shared" si="1"/>
    </c><c r="O11" s="0">
        <f t="shared" si="1"/>
    </c>
</row>

但对于非工作摘要表:

<row r="11">
    <c r="A11" s="0">
        <f ref="A11:O11" t="shared" si="1">AVERAGE(group1!A1:A10)</f>
    </c><c r="B11" s="0">
        <f t="shared" si="1"/>
    </c><c r="C11" s="0">
        <f t="shared" si="1"/>
    </c><c r="D11" s="0">
        <f t="shared" si="1"/>
    </c><c r="E11" s="0">
        <f t="shared" si="1"/>
    </c><c r="F11" s="0">
        <f t="shared" si="1"/>
    </c><c r="G11" s="0">
        <f t="shared" si="1"/>
    </c><c r="H11" s="0">
        <f t="shared" si="1"/>
    </c><c r="I11" s="0">
        <f t="shared" si="1"/>
    </c><c r="J11" s="0">
        <f t="shared" si="1"/>
    </c><c r="K11" s="0">
        <f t="shared" si="1"/>
    </c><c r="L11" s="0">
        <f t="shared" si="1"/>
    </c><c r="M11" s="0">
        <f t="shared" si="1"/>
    </c><c r="N11" s="0">
        <f t="shared" si="1"/>
    </c><c r="O11" s="0">
        <f t="shared" si="1"/>
    </c>
</row>