ClosedXML 格式化单元格以包含公式

ClosedXML Format cell to contain formula

我希望有人可以帮助我解决 ClosedXML,因为我是 Excel 导出的新手,而且从我所看到的 ClosedXML 文档来看,文档相当不错部分地区受限。

目前我正在将数据放入数据表,将行格式化为正确的类型并使用正确的布局导出。

当我尝试导出在每个单元格中包含重复公式的一行时出现问题。

我曾尝试将公式简单地添加为一个字符串,然后我可以在导出文件时突出显示并进行转换,这显然不是理想的做法。我在 XML 中找到了一个名为 XLFormula 的 class,它完全没有文档,但假设我应该用它做点什么。

目前我已经(注释掉了我使用 XLFormula 的方式,试图将 XLFormula 公式作为字符串传递并设置为每单位总出价:

dt.Columns.Add("Qty", typeof(int));
dt.Columns.Add("Bid Per Unit GBP", typeof(double));
dt.Columns.Add("Total Bid GBP"); //typeof(XLFormula)
foreach (DataRow dr in dt.Rows)
{
    //XLFormula totalBidFormula = new XLFormula();

    dr["Qty"] = 1;
    dr["Bid Per Unit GBP"] = 0.00;
    dr["Total Bid GBP"] = "=[@Qty]*[@[Bid Per Unit GBP]]";

任何帮助将不胜感激。如果我尝试使用 ClosedXML 无法做到这一点,请告诉我,如果您可以建议替代 XML 出口商(即使它已付费),那将有所帮助!

以防万一有人和我处于相同的位置,closedXML 中的公式非常简单。

据我了解,在添加值后必须将公式直接应用于单元格。

我使用简单的 for 循环获取当前单元格,因为 sheet 已处理,因为我需要一整列来保存公式

//get all rows in my datatable 
int totalRows = dt.Rows.Count;

//set the first that will be filled with data
int currentRow = 1;

//loop through each row.
for(int i = 0; i < totalRows; i++){

//the current cell will be whatever column you wish to format + the current row
string currentCell = "F" + currentRow;

//create your formula
string AdjustedPriceFormula = "=C" + currentRow + "*" + "D" + currentRow;

//apply your formula to the cell.
theSheet.Cells(currentCell).FormulaA1 = AdjustedPriceFormula;

//increment your counters to apply the same data to the following row
currentRow++

从那以后,这对我有用了好几次,并将多个公式添加到多个 columns/cells。

希望这对某人有帮助!

我在调试与您遇到的相同问题时遇到了这个 post。浏览了关于 ClosedXML Github 问题跟踪器的一些评论并发现了 a comment on this thread:

Table column references are not supported yet. Please use normal A1 style references.

如果您愿意,您也可以使用较旧的 "R1C1" 样式引用,但要实现您想要的效果,您可以使用类似于以下内容的内容:

dr["Total Bid GBP"].FormulaR1C1 = "=RC[-2]*RC[-1]";

对@Lovethenakedgun 引用的引用的补充评论:

Table column references are not supported yet. Please use normal A1 style references.

。据我所知,这仍然是正确的,但有一个解决方法。如果您查看包含 table 的 sheet.xml 文件,您会看到 table-style 引用被翻译成类似这样的内容:

"Table1[[#This Row],[testedName]]"

现在,您实际上可以在 FormulaA1 属性 的代码中使用它,就像我在下面所做的那样(在 F# 中,tb 只是一个 table 对象...):

tb.Name <- "Table1"
tb.Field(0).Name <- "testedName"
tb.Row(2).Cell(2).FormulaA1 <- "Table1[[#This Row],[testedName]]"
tb.Row(3).Cell(2).FormulaA1 <- "Table1[[#This Row],[testedName]]"
tb.Row(4).Cell(2).FormulaA1 <- "Table1[[#This Row],[testedName]]"

翻译成工作簿中的 [@testedName]。不过,你必须像我一样在每一行中分别进行。