做了一個 Excel 2007 的範本 (*.xlsx),原本這樣載入:

using (FileStream fsIn = new FileStream(strXlsTemplate, FileMode.Open))
{
  // open Excel
  HSSFWorkbook workbook = new HSSFWorkbook(fsIn);
  fsIn.Close();
}

結果冒出以下錯誤:

"The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)"

後來查到《java用poi操作excel .xls和.xlsx格式》,原來不同版本的 Office 要搭配不同的 NPOI 函式:

  • Excel 2007 (*.xlsx):使用 XSSFWorkbook
  • Excel 2003 以前 (*.xls):使用 HSSFWorkbook

 

【提升 NPOI 產製 Excel 效率的方式:做一份範本】

附帶一提,建議最好是先設計一份範本,不要直接畫格子、一格格設定樣式。用一格格慢慢刻的方式寫,只要資料量稍微多一點(也不過就是兩百多筆)就會慢得非常誇張,吃光測試機上的記憶體。

可以先設計範本後,利用 CopyRow() 來增加資料內容。

 

【特別奇妙的 NPOI:RemoveRow() 與 ShiftRows()】

覺得 NPOI 真的是個滿奇怪(奇妙?)的 library,在 NPOI 裡頭有 RemoveRow(),但不會真正的刪除整列,只會清理掉該列的資料與格式。真的要刪除一列,像我們在 Excel 裡刪除後往上移一列,要搭配 ShiftRows()。

詳情可參考這篇文章:《NPOI-真正删除行(非清空数据)的方法》

文章標籤
創作者介紹
創作者 fannys23 的頭像
fannys23

小攻城師的戰場筆記

fannys23 發表在 痞客邦 留言(1) 人氣()


留言列表 (1)

發表留言
  • 貓老大
  • 由於 Excel 檔的樣式是有數量限制的,當然不可以一格一格設定樣式,得先把需要使用的樣式建立出來,然後指派給 Cell
  • 謝謝指教,不過知識在學會之前都沒有「當然」啊,那種逐格畫樣式的程式碼在網路上非常多,並不是每個人都理解這件事。

    fannys23 於 2018/07/05 12:01 回覆