我希望有人可以帮助我使用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出口商(即使它的付费)会有所帮助!
答案 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]。但是,您必须像我一样在每一行中分别进行操作。