最近都在參與公司的狐小E項目(https://www.hixiaoe.com/),一天到晚都是Mysql相關的知識,弄多了難免乏味,正好其他兄弟團隊碰到了一個 C#用NPOI生成Excel模板的小問題,幫助解決了一下,換一下腦子還是不錯的。
兄弟團隊是想用NPOI生成一個下載模板,讓用戶能把在系統里配置好的模板模板,生成Excel下載下來,並且在填Excel的時候有一些限制,比如產品分類,只能選定固定一些值,這些值是系統里提前配置好的。如下圖。

基本功能是實現了,但是保存的時候會提醒“顯著功能損失”,如下圖。
這樣保存過后,再打開,產品分類的選擇控制就沒有了。

看了一下他們的代碼,發現哥們用的是HSSFWorkbook,建議他們換成了XSSFWorkbook。
HSSFWorkbook是解析出來excel 2007 以前版本的,后綴名為xls的。XSSFWorkbook是解析excel 2007 版的,后綴名為xlsx。
換成XSSFWorkbook,又出一個問題,“無法訪問已關閉的流“,如下圖。

完整的錯誤信息 “System.ObjectDisposedException”類型的異常在 mscorlib.dll 中發生,但未在用戶代碼中進行處理,其他信息: 無法訪問已關閉的流。
出現這個錯誤,是因為在使用book.Write方法后,會關閉流,這樣導致再次使用Respons輸出流的時候就出錯了。
為了解決這個問題,需要從MemoryStream派生一個新類,專給NPOI用,解決流關閉的問題。這個方法是從網絡上搜來了的,實測可用。具體內容如下圖。

建好新的類以后,該造相關的代碼,總是解決了。

在公司狐小E(https://www.hixiaoe.com/)的項目里不斷的成長,學習Mysql的更多知識,偶爾切出去做點別的事情也挺好,換換腦子。
這個MemoryStream的派生類也是從網絡上找來的,謝謝大家的幫助,讓我能夠解決這個問題,也希望這個小文章能幫到碰到一樣問題的朋友們。
