Excel 删除使用 EPPlus 添加的公式
Excel removes formula added with EPPlus
我有一个使用 EPPlus 库创建的电子表格,包含单位 (C
)、数量 (D
)、比率 (E
) 和总计 (F
) 列。确定一行总数的公式有点复杂,因为我试图避免空白单元格等的 #Value
错误。因此,公式中的所有 ISNUMBER
函数调用。
公式为:
=SWITCH(C3; ISBLANK(D3); ""; "Percentage"; IF(ISNUMBER(D3); D3; 0) * IF(ISNUMBER(E3); E3; 0) / 100; IF(ISNUMBER(D3); D3; 0) * IF(ISNUMBER(E3); E3; 0))
当我将其粘贴到电子表格中的单元格 F3 (Total)
中并将其拖到电子表格中的所有其他行时,它工作正常,在所有行上给出正确的总计。然而,当我在创建电子表格时尝试添加公式时,如下所示:
for (var r = startAt + 2; r < endAt; r++)
{
var amountFormula =
$"=SWITCH(C{r}; ISBLANK(D{r}); \"\"; \"Percentage\"; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0) / 100; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0))";
ws.Cells[$"F{r}"].Formula = amountFormula;
}
我对每组使用公式的行进行循环,因为它不是在每一行中都使用,例如标题、组总计等
当我尝试打开 Excel 中的电子表格时,它说它会删除有问题的内容,如果我说是,它会删除任何公式痕迹,如果我说不是,它不会打开电子表格。当我尝试通过代码添加公式时,我觉得存在某种字符编码问题或类似问题。公式在粘贴时如何工作,但在通过代码添加时会失败?
我不得不用逗号替换分号。我认为这对你来说是一个区域问题,但 EPPlus 不支持它们:
https://github.com/JanKallman/EPPlus/wiki/Formula-Calculation
还必须指定 SWITCH
函数是 Excel 中的原生函数。否则,Excel 将假定它是用户定义的并在单元格中给出 $NAME
错误:
[TestMethod]
public void IsNumber_Formula_Test()
{
//
//Throw in some data
var dataTable = new DataTable("tblData");
dataTable.Columns.AddRange(new[]
{
new DataColumn("Col1", typeof(int)),
new DataColumn("Col2", typeof(int)),
new DataColumn("Col3", typeof(int))
});
for (var i = 0; i < 10; i++)
{
var row = dataTable.NewRow();
row[0] = i;
row[1] = i * 10;
row[2] = i * 100;
dataTable.Rows.Add(row);
}
var fi = new FileInfo(@"c:\temp\IsNumber_Formula_Test.xlsx");
if (fi.Exists)
fi.Delete();
using (var package = new ExcelPackage(fi))
{
var workbook = package.Workbook;
var ws = workbook.Worksheets.Add("Sheet1");
var cells = ws.Cells;
cells["C1"].LoadFromDataTable(dataTable, true);
var startAt = 0;
var endAt = dataTable.Rows.Count + 2;
for (var r = startAt + 2; r < endAt; r++)
{
//Had to use commas and specify the function domain
//var amountFormula = $"=SWITCH(C{r}; ISBLANK(D{r}); \"\"; \"Percentage\"; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0) / 100; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0))";
var amountFormula = $"=_xlfn.SWITCH(C{r}, ISBLANK(D{r}), \"\", \"Percentage\", IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0) / 100, IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0))";
ws.Cells[$"F{r}"].Formula = amountFormula;
}
package.Save();
}
}
给出这个:
我有一个使用 EPPlus 库创建的电子表格,包含单位 (C
)、数量 (D
)、比率 (E
) 和总计 (F
) 列。确定一行总数的公式有点复杂,因为我试图避免空白单元格等的 #Value
错误。因此,公式中的所有 ISNUMBER
函数调用。
公式为:
=SWITCH(C3; ISBLANK(D3); ""; "Percentage"; IF(ISNUMBER(D3); D3; 0) * IF(ISNUMBER(E3); E3; 0) / 100; IF(ISNUMBER(D3); D3; 0) * IF(ISNUMBER(E3); E3; 0))
当我将其粘贴到电子表格中的单元格 F3 (Total)
中并将其拖到电子表格中的所有其他行时,它工作正常,在所有行上给出正确的总计。然而,当我在创建电子表格时尝试添加公式时,如下所示:
for (var r = startAt + 2; r < endAt; r++)
{
var amountFormula =
$"=SWITCH(C{r}; ISBLANK(D{r}); \"\"; \"Percentage\"; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0) / 100; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0))";
ws.Cells[$"F{r}"].Formula = amountFormula;
}
我对每组使用公式的行进行循环,因为它不是在每一行中都使用,例如标题、组总计等
当我尝试打开 Excel 中的电子表格时,它说它会删除有问题的内容,如果我说是,它会删除任何公式痕迹,如果我说不是,它不会打开电子表格。当我尝试通过代码添加公式时,我觉得存在某种字符编码问题或类似问题。公式在粘贴时如何工作,但在通过代码添加时会失败?
我不得不用逗号替换分号。我认为这对你来说是一个区域问题,但 EPPlus 不支持它们:
https://github.com/JanKallman/EPPlus/wiki/Formula-Calculation
还必须指定 SWITCH
函数是 Excel 中的原生函数。否则,Excel 将假定它是用户定义的并在单元格中给出 $NAME
错误:
[TestMethod]
public void IsNumber_Formula_Test()
{
//
//Throw in some data
var dataTable = new DataTable("tblData");
dataTable.Columns.AddRange(new[]
{
new DataColumn("Col1", typeof(int)),
new DataColumn("Col2", typeof(int)),
new DataColumn("Col3", typeof(int))
});
for (var i = 0; i < 10; i++)
{
var row = dataTable.NewRow();
row[0] = i;
row[1] = i * 10;
row[2] = i * 100;
dataTable.Rows.Add(row);
}
var fi = new FileInfo(@"c:\temp\IsNumber_Formula_Test.xlsx");
if (fi.Exists)
fi.Delete();
using (var package = new ExcelPackage(fi))
{
var workbook = package.Workbook;
var ws = workbook.Worksheets.Add("Sheet1");
var cells = ws.Cells;
cells["C1"].LoadFromDataTable(dataTable, true);
var startAt = 0;
var endAt = dataTable.Rows.Count + 2;
for (var r = startAt + 2; r < endAt; r++)
{
//Had to use commas and specify the function domain
//var amountFormula = $"=SWITCH(C{r}; ISBLANK(D{r}); \"\"; \"Percentage\"; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0) / 100; IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0))";
var amountFormula = $"=_xlfn.SWITCH(C{r}, ISBLANK(D{r}), \"\", \"Percentage\", IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0) / 100, IF(ISNUMBER(D{r}), D{r}, 0) * IF(ISNUMBER(E{r}), E{r}, 0))";
ws.Cells[$"F{r}"].Formula = amountFormula;
}
package.Save();
}
}
给出这个: