【问题标题】:Why is the Excel formula not formulating?为什么Excel公式没有公式?
【发布时间】:2016-08-22 22:32:06
【问题描述】:

我正在使用 EPPlus 创建一个电子表格。我正在尝试使用此代码获取一个公式来计算值的总和:

using (var totalOccurrencesCell = priceComplianceWorksheet.Cells[rowToPopulate, 2])
{
    totalOccurrencesCell.Style.Font.Size = DATA_FONT_SIZE;
    totalOccurrencesCell.Style.Numberformat.Format = NUMBER_FORMAT_THOUSANDS;
    if (rowToPopulate <= SUMMARY_HEADING_ROW + 1)
    {
        totalOccurrencesCell.Value = "0";
    }
    else
    {
        //totalOccurrencesCell.Formula = string.Format("SUM(B5:B{0})", rowToPopulate - 1);
        // TODO: Comment out or remove below after finding out why the above is not working
        totalOccurrencesCell.Formula = "SUM(B5:B19)";
        totalOccurrencesCell.Calculate();
    }
}

我认为正确的是应用于该单元格,如这里所示,即“=SUM(B5:B19)”:

那么为什么结果是“0”呢? C 栏也是如此,D 栏也因某种原因被猛烈地吃掉了。

这个类似的代码确实在工作表的其他地方工作:

using (var totalVarianceCell = priceComplianceWorksheet.Cells[rowToPopulate, DETAIL_TOTALVARIANCE_COL])
{
    totalVarianceCell.Style.Font.Size = DATA_FONT_SIZE;
    totalVarianceCell.Style.Numberformat.Format = NUMBER_FORMAT_CURRENCY;
    totalVarianceCell.Formula = string.Format("SUM(J{0}:J{1})", _firstDetailDataRow, rowToPopulate - 1);
    totalVarianceCell.Calculate();
}

它将J列(10)的适当范围内的值相加,当点击“sum”单元格时,它会显示“=SUM(J23:J39)”作为那里的值。

为什么它在一种情况下有效,但在其他情况下却失败了?

注意:我正在像这样填充单元格(“total”是一个 int):

totalOccurrencesCell.Value = total.ToString("N0", CultureInfo.CurrentCulture);

更新

这很不雅,有点令人失望,但至少到目前为止,我不得不以这种方式“暴力破解”:

totalOccurrencesCell.Value = SumCellVals(2, 5, rowToPopulate - 1);
. . .
private string SumCellVals(int colNum, int firstRow, int lastRow)
{
    double runningTotal = 0.0;
    double currentVal;
    for (int i = firstRow; i <= lastRow; i++)
    {
        using (var taterTotCell = priceComplianceWorksheet.Cells[i, colNum])
        {
            currentVal = Convert.ToDouble(taterTotCell.Value);
            runningTotal = runningTotal + currentVal;
        }
    }
    return runningTotal.ToString();
}

【问题讨论】:

  • B 列中的单元格是否可以填充文本而不是整数?如果我尝试对 Excel 中的一个数据列求和,并且该列被“格式化”为“文本”,我的 SUM(A1:A4) 返回 0,即使我的 4 个单元格填充了 numbers实际上被当作文本阅读。这可以解释为什么您需要Convert.ToDouble(taterTotCell.Value) 才能使其正常工作?
  • 我必须检查填充数据的方式与使用公式的其他情况之间是否有任何区别;不过,在我看来,SUM() 应该在必要时将值转换为数字值。我正在像这样填充单元格(“total”是一个 int):totalOccurrencesCell.Value = total.ToString("N0", CultureInfo.CurrentCulture);
  • 我建议您在Excel中打开文件,看看数据列是否标记为文本?在我的 Excel 电子表格中,包含将被读取为文本的数字的单元格用“绿色角”标识,还有一个“!”选择单元格时出现的图标。
  • 不,我都看不到 - 没有绿色角落,选择任何这些单元格时也没有感叹号。我想我会保留更新中显示的手动求和代码。不过,谢谢。
  • 似乎计算设置为手动。你可以试试 =SUMPRODUCT(B5:B19*1)

标签: c# excel-formula sum epplus epplus-4


【解决方案1】:

行为的线索在你问题的这句话中:

注意:我正在像这样填充单元格(“total”是一个 int):

totalOccurrencesCell.Value = total.ToString("N0", CultureInfo.CurrentCulture);

在将数值分配给单元格的 Value 属性之前,无需将它们转换为字符串。

我可以通过运行 MCVE 来重现您看到的内容:

static void test4()
{
    var fs = new System.IO.FileInfo(@"c:\temp\test4.xlsx");

    if (fs.Exists) fs.Delete();

    using (ExcelPackage package = new ExcelPackage(fs))
    {

        ExcelWorksheet worksheet = package.Workbook.Worksheets["Test"];
        if (worksheet == null) worksheet = package.Workbook.Worksheets.Add("Test");
        var WS = worksheet;
        WS.Workbook.CalcMode = ExcelCalcMode.Manual;

        // strings with .
        WS.Cells[1, 1].Value = "100.0";
        WS.Cells[2, 1].Value = "42.1";
        using (var sum = WS.Cells[3, 1])
        {
            sum.Formula = "SUM(A1:A2)";
            sum.Calculate();
        }

        // strings with ,
        WS.Cells[1, 2].Value = "100,0";
        WS.Cells[2, 2].Value = "42,1";
        using (var sum = WS.Cells[3, 2])
        {
            sum.Formula = "SUM(B1:B2)";
            sum.Calculate();
        }

        // strings with ,
        WS.Cells[1, 3].Value = "1,100";
        WS.Cells[2, 3].Value = "42";
        using (var sum = WS.Cells[3, 3])
        {
            sum.Formula = "SUM(C1:C2)";
            sum.Calculate();
        }

        // let EPPLUS handle it 
        WS.Cells[1, 4].Value = 100; // int
        WS.Cells[2, 4].Value = 42.1d; // double
        using (var sum = WS.Cells[3, 4])
        {
            sum.Formula = "SUM(D1:D2)";
            sum.Calculate();
        }

        package.Save();
    }
}

这是我在 Excel 工作表中得到的结果:

您注意到有些单元格有错误指示器,但有些则没有。这很容易被误导。此效果受分隔符设置的影响:

然而,在我的测试中,总是计算 D 列,无论我如何更改千位和小数分隔符,总是计算 SUM。特别是如果您要转换为字符串,使用当前区域性并不能保证这将起作用,因为 Excel 中的设置可能已被过度使用。

tl;dr; 不要将数字(int、double、float)转换为字符串,而是按原样将它们分配给单元格的值。 EPPLUS 和 Excel 都将处理正确的表示。

【讨论】:

  • 绿色小工具是个问题,用户不想为了摆脱它们而胡乱设置。
猜你喜欢
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多