做了一個 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-真正删除行(非清空数据)的方法》

arrow
arrow

    小攻城師 發表在 痞客邦 留言(1) 人氣()