请参阅此.xlsx文件。当然没有宏!
当您打开文件时,您将看到以下单元格:
[Series ]
[10 ]
[20 ]
[30 ]
[ ]
[ ]
[=SUM(B3:B7)]
总和不会计算,除非您双击,然后按Enter键,在底部的三个单元格之一(例如,两个空白,= SUM(B3:B7))
如果你保存工作簿并重新打开工作簿,那么一旦你将公式付诸实践,Weirder仍然会表现得很好。我已经尝试将扩展名更改为.zip,并使用Xml来查看是否可以识别在开始工作后保存更改所做的更改,但我只能看到版本号已更改。
我们。 IRD。
另外,我尝试将其保存为早期的Excel格式,问题仍然存在。
我只想重申 - 附加的电子表格是.xlsx文件,因此没有任何宏!没有附加的电子表格,没有其他方法可以解释这个问题。希望通过提高50分的声望,有人会相信我不是一个脚本小子并看看!
我使用EPPlus和以下C#代码创建了文件:
public void Generate(string outputPath)
{
using (FileStream fsTemplate = new FileStream(TemplatePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (FileStream fsReport = new FileStream(outputPath, FileMode.Create, FileAccess.ReadWrite, FileShare.None))
{
using (ExcelPackage ep = new ExcelPackage(fsReport, fsTemplate))
{
using (ExcelWorksheet ws = ep.Workbook.Worksheets[TemplateSheetName])
{
//
int iHeadingsRow = 2;
int dataRowIndex = iHeadingsRow + 1;
//
List<decimal> list = new List<decimal>() { 10, 20, 30 };
//
foreach (var number in list)
{
ws.Cells[dataRowIndex, 2].Value = list[dataRowIndex - iHeadingsRow - 1];
//
ws.InsertRow(dataRowIndex + 1, 1, iHeadingsRow + 1);
//
dataRowIndex++;
}
//
ep.Save();
}
}
}
}
}
我想强调一点,这不是EPPlus问题!这是Excel打开有效工作簿并拒绝计算公式的常见问题。将单元格格式化为数字没有区别。我已经使用EPPlus创建了几个月的工作Excel文件,我还没有安装任何EPPlus更新,所以它一定是Excel的问题,对吧?!
解决方案必须在于原始文件与已经生效然后保存的版本之间的区别。我似乎无法确切地指出这种差异究竟是什么......
= SUM(B3:B7)已经存在于模板文件中,还有文本“Series”。该代码仅将{10,20,30}项添加到电子表格中。
答案 0 :(得分:1)
您正在将数据添加到已包含=SUM(B3:B7)
公式的现有Excel工作表中。
我猜是 EPPlus问题。也就是说,问题是您在输入数据后没有调用Calculate()方法:
...您可以让EPPlus计算工作簿中公式的结果。
这是通过调用Calculate()方法完成的,该方法在Workbook,Worksheet和Range级别上可用。当调用Calculate()时,EPPlus将评估公式的结果并将结果存储为单元格的值 - 就像Excel一样。
在Excel中键入公式后,Excel会计算该值并将其与值一起存储在文件中。
例如,您有一张表格:
100
200
=SUM(A1:A2)
Excel存储了这个(我删除了不相关的XML属性):
<sheetData>
<row r="1">
<c r="A1">
<v>100</v>
</c>
</row>
<row r="2">
<c r="A2">
<v>200</v>
</c>
</row>
<row r="3">
<c r="A3">
<f>SUM(A1:A2)</f>
<v>300</v></c>
</row>
</sheetData>
当您在没有值的情况下将数据插入XLSX文件时,Excel尚未存储缓存值并显示0
。您的XLSX文件(您上传的文件)包含在sheet1.xml
中:
<row r="8">
<c r="B8">
<f>SUM(B3:B7)</f>
<v>0</v>
</c>
</row>
在类似的Java库Apache POI中有一些解释:
有时Excel会注意到自己,并在加载时触发重新计算,但除非您知道使用的是volatile函数,否则通常最好触发重新计算。
从Java的角度来看,存在类似的问题Excel cell displaying zero instead of a calculated / referenced value。