【问题标题】:C# EPPlus not evaluating formula SUM(A3:B3)C# EPPlus 不计算公式 SUM(A3:B3)
【发布时间】:2018-12-31 18:14:19
【问题描述】:

我刚刚开始使用 EPPlus。我有数据表,其中包含一些数字数据和公式。当我通过 EPPlus 加载数据表并保存到 excel 时,当我打开同一个 excel 文件时,我发现没有计算公式。公式位于 excel 单元格中作为字符串,如 SUM(A3:B3)

为了评估配方,我尝试了许多 EPPLUS 选项,这些选项都列在这里

pack.Workbook.Worksheets["Test"].Calculate();
pack.Workbook.Worksheets["Test"].Cells["A3"].Calculate();
pack.Workbook.Worksheets["Test"].Cells["B3"].Calculate();
ws.Calculate();

这里我指的是我的完整示例代码,其中公式不起作用。请看一下并告诉我我需要在代码中添加什么来评估公式。

private void button1_Click(object sender, EventArgs e)
{
    DataTable dt = GetDataTable();
    string path = @"d:\EPPLUS_DT_Excel.xlsx";
    Stream stream = File.Create(path);

    using (ExcelPackage pack = new ExcelPackage())
    {
        ExcelWorksheet ws = pack.Workbook.Worksheets.Add("Test");
        ws.Cells["A1"].LoadFromDataTable(dt, false);
        //pack.Workbook.Worksheets["Test"].Calculate();
        //pack.Workbook.Worksheets["Test"].Cells["A3"].Calculate();
        //pack.Workbook.Worksheets["Test"].Cells["B3"].Calculate();
        ws.Calculate();
        pack.SaveAs(stream);
        stream.Close();
        MessageBox.Show("Done");
    }
}

public DataTable GetDataTable()
{
    string strSum = "", strColName, strImmediateOneUp = "", strImmediateTwoUp = "";

    int startsum = 0;
    int currow = 0;
    bool firstTimeSum = true;

    int NumRows = 3;
    int NumColumns = 2;

    DataTable dt = new DataTable();

    for (int col = 0; col < NumColumns; col++)
    {
        strColName = GenerateColumnText(col);
        DataColumn datacol = new DataColumn(strColName, typeof(object));
        dt.Columns.Add(datacol);
    }


    for (int row = 0; row < NumRows; row++)
    {
        dt.Rows.Add();

        for (int col = 0; col < NumColumns; col++)
        {
            if (row < 2)
            {
                dt.Rows[row][col] = Convert.ToInt32(new Random().Next(1, NumRows));
            }
            else
            {
                if (firstTimeSum)
                {
                    if (row - currow == 2)
                    {
                        currow = row;
                        startsum = 0;
                        firstTimeSum = false;
                    }
                    else
                    {
                        startsum = 1;
                    }
                }
                else
                {
                    if (row - currow == 3)
                    {
                        currow = row;
                        startsum = 0;
                    }
                }


                if (startsum == 0)
                {
                    strColName = GenerateColumnText(col);
                    strImmediateOneUp = strColName + ((row + 1) - 1).ToString();
                    strImmediateTwoUp = strColName + ((row + 1) - 2).ToString();
                    strSum = string.Format("+SUM({0}:{1})", strImmediateTwoUp, strImmediateOneUp);
                    dt.Rows[row][col] = strSum;
                }
                else
                {
                    dt.Rows[row][col] = Convert.ToInt32(new Random().Next(1, NumRows));
                }
            }

        }

        startsum = 1;
    }
    return dt;
}

private string GenerateColumnText(int num)
{
    string str = "";
    char achar;
    int mod;
    while (true)
    {
        mod = (num % 26) + 65;
        num = (int)(num / 26);
        achar = (char)mod;
        str = achar + str;
        if (num > 0) num--;
        else if (num == 0) break;
    }
    return str;
} 

【问题讨论】:

  • 如果您在单元格中看到“SUM(A3:B3)”,您要么缺少“=”符号,要么单元格被格式化为文本。检查您的单元格格式。
  • 这是 EPPlus 的公式约定,我们不应该提供 = 符号。这就是我从总和中删除 = 符号的原因。看到这个stackoverflow.com/a/45138440/10839668
  • 基本操作页面is here。所以不要用“+SUM()”,只用“SUM”。

标签: c# excel epplus


【解决方案1】:

向单元格添加公式时,您使用Formula 属性。当您使用 LoadFromDataTableDataTable 加载范围时,它无法知道某些值是要被解释为公式的。

您可以使用LoadDataTable 填充公式将在其上运行的单元格,但对于公式,您需要设置Formula 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多