NPOI修改Excel单元格后自动更新公式计算结果
最近程序里,我都开始用NOPI來处理Excel文档的读写输出,感觉上比Excel DOM、OLE DB for JET、甚至CSV来得稳定轻巧,而NPOI功能的齐全程度更是让我惊喜连连。
今天写了个简单程序要实现类似以下的功能:
Template.xls中有写好的公式计算两个单元格的相加值,A3 = SUM(A1:A2)

程序会打开Template.xls,將A1改成3、A2改成4,另存为Result.xls。(关于NPOI的基本介紹,可以參考MSDN上的中文教学)
using (FileStream fsIn = new FileStream("Template.xls", FileMode.Open))
{
//打开Excel
HSSFWorkbook workbook = new HSSFWorkbook(fsIn);
fsIn.Close();
//取得第一个工作表
Sheet sheet = workbook.GetSheetAt(0);
//将第一列第一个单元格(A1)设成3
sheet.GetRow(0).GetCell(0).SetCellValue(3);
//将第二列第一个单元格(A2)设成3
sheet.GetRow(1).GetCell(0).SetCellValue(4);
//另存为Result.xls
using (FileStream fsOut = new FileStream("Result.xls", FileMode.Create))
{
workbook.Write(fsOut);
fsOut.Close();
}
}
预计在Result.xls,A3 应该 = SUM(A1:A2) = 3 + 4 = 7才对,结果...

我发现NPOI产出的文件,SUM(A1:A2)仍是停留旧值3,要重新指定一次A3公式,才会更新为7。
花了一阵子,我才找出NPOI控制自动重算公式结果的属性: Sheet.ForceFormulaRecalculation。
//将第一列第一行(A1)设成3
sheet.GetRow(0).GetCell(0).SetCellValue(3);
//将第二列第一行(A2)设成4
sheet.GetRow(1).GetCell(0).SetCellValue(4);
//要求公式重算結果
sheet.ForceFormulaRecalculation = true;
//另存为Result.xls
using (FileStream fsOut = new FileStream("Result.xls", FileMode.Create))
{
workbook.Write(fsOut);
fsOut.Close();
}
既然花了时间才找到,就留个记录帮助有类似需求的朋友吧!

627

被折叠的 条评论
为什么被折叠?



