ClosedXML格式单元格包含公式

时间:2015-08-20 08:02:42

标签: c# asp.net webforms closedxml

我希望有人可以帮助我使用ClosedXML,因为我是Excel新手导出的,而且从我所看到的ClosedXML,文档在某些方面相当有限。

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

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

我试图将公式简单地添加为一个字符串,然后我可以在导出文件时突出显示并转换,这显然不是理想的。我发现了一个名为XLFormula的XML类,它完全没有文档,但我认为我应该对此做些什么。

目前我已经(注释掉我使用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出口商(即使它的付费)会有所帮助!

3 个答案:

答案 0 :(得分:9)

万一有人偶然发现了我处于相同位置的人,那么closedXML中的公式非常简单。

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

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

//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++

这对我来说已经好几次了,并且为多个列/单元添加了多个公式。

希望这有助于某人!

答案 1 :(得分:0)

我在调试您遇到的相同问题时遇到了这篇文章。浏览了有关ClosedXML Github问题跟踪器的一些评论,并发现了a comment on this thread

  

还不支持表列引用。请使用常规的 A1 样式参考。

如果愿意,还可以使用较旧的“ R1C1”样式引用,但是要实现所需的功能,可以使用类似于以下内容的东西:

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

答案 2 :(得分:0)

@Lovethenakedgun引用的报价的其他注释:

还不支持表列引用。请使用普通的A1样式引用。

。据我了解,这仍然是正确的,但是有一种解决方法。如果查看包含该表的sheet.xml文件,您会看到表样式引用已转换为类似的内容:

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

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

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]。但是,您必须像我一样在每一行中分别进行操作。