TIPS-NPOI修改Excel欄位後自動更新公式計算結果

最近專案裡,我都開始改用NPOI來處理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)設成3
    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();
    }

既然花了時間才找到,就留個記錄幫助有類似需求的朋友吧!

歡迎推文分享:
Published 16 December 2010 06:18 PM 由 Jeffrey
Filed under: , ,
Views: 42,743



意見

# lijinan said on 08 March, 2011 02:56 AM

太感謝你了。這個問題困擾了我一天!NPOI官方支持的力度不夠呀。找了一天才解決

# 李政忠 said on 23 April, 2012 04:22 AM

小弟的需求是必須資料異動之後,在不開啟Excel的情形下,就得取得公式重新計算的值,使用版主大人的方式行不通,後來爬文得到下述方法,供作參考。

               Dim eva As HSSFFormulaEvaluator = New HSSFFormulaEvaluator(workbook)

               Dim cell_F17 As NPOI.SS.UserModel.ICell = eva.EvaluateInCell(sheet.GetRow(16).GetCell(5))

               Response.Write(String.Format("F17={0}!!", cell_F17.NumericCellValue))

# 小米 said on 30 May, 2013 01:53 AM

太感謝了~~~~~~~~~~~~~~~

# 月夜微醺 said on 19 August, 2014 02:49 AM

简直了,感激不尽!!!

# hybirx said on 13 November, 2014 10:41 AM

太感谢了,找了好久都想完全写入了,十分感谢

# 猫出没 said on 24 July, 2017 03:22 AM

太感谢了!我一开始找的是用的:

//HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook);

//ICell cell02 = sheet.GetRow(0).GetCell(2);

//cell02 = e.EvaluateInCell(cell02);

但是觉得挺奇葩的,看完楼主,瞬间大亮啊!!!

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<December 2010>
SunMonTueWedThuFriSat
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication