C#操作NPOI插件的HSSFWorkBook,常見的那些坑


  使用HSSFWorkBook類實例化時,經常會遇到一個問題:HSSFWorkBook.isReadOnly。

  HSSFWorkBook.isReadOnly,貌似是異常,但它又不影響你正常導出Excel模板,但是必須注意的是,Excel模板的后綴名要為.xls,如果是.xlsx,那么就會出現打開文件錯誤,其實是Excel版本的兼容性問題。

  有時候HSSFRow sheetRow = (HSSFRow)sheet.CreateRow(index);創建新的row,接着使用sheetRow.CreateCell(2).SetCellValue(new HSSFRichTextString("字符串"));給每個cell賦值時,有可能遇到一個問題:

for (int i=0; i<ts.Days; i++) { HSSFRow sheetRow = (HSSFRow)sheet.CreateRow(4+i); sheetRow.CreateCell(0).SetCellValue(new HSSFRichTextString(startDate.AddDays(i).ToString("yyyy-MM-dd")));//日期:2018-01-01
                sheetRow.CreateCell(1).SetCellValue(new HSSFRichTextString(startDate.AddDays(i).ToString("dddd")));//周一、周二...... //必須添加上"",如果沒有給空字符串,該cell為null,上傳模板的時候,Cells的個數會根據user是否輸入數據而有所改變
                sheetRow.CreateCell(2).SetCellValue(new HSSFRichTextString("")); sheetRow.CreateCell(3).SetCellValue(new HSSFRichTextString("")); sheetRow.CreateCell(4).SetCellValue(new HSSFRichTextString("")); }

 注意,代碼里頭有3個cell的值設置為"",如果不設置,那么這3個cell根本就是null,再者,當用戶把這個模板下載下來,有些cell輸入值,有些cell沒有輸入,如:

test1 test2 test3 test4 test5
  test2   test4  
    test3    
test1       test5
         

那么在讀取數據的時候,第一行的Cells.Count==5,第二、四行的Cells.Count==2,第三行的Cells.Count==1,第五行的Cells.Count==0。如果像代碼里面設置空字符串,就不管后續用戶有沒有輸入新數據,都可以確保取到相關位置的值,不會出現out of range的異常。

  使用GetCell(index)方法精確找位:

  有時候你需要將上傳的excel表格的值顯示在客戶端,同時還要根據某幾個cell值是否為空值,或者null來進行剔除,如果真出現不定量的值為null的Cell個數,顯然用Cells[index]是不行的,上面提及到,Cells.Count不統計null的Cell格子,譬如對於上圖的第二行,Cells[0]的值可能就是test2,如何精確找到對應Cell的位置呢?為了應對此情況,NPOI還提供了一個方法來精確尋找Cell格子,就是GetCell(index)。那么通過GetCell(index)可以精確找到相應位置,進而可以判斷是否為空,是否為null,然后進行篩選,賦值等操作。

  使用StringCellValue方法,通常我們想要取出某個cell的值,可能會使用:

 

string resGp = sheet.GetRow(0).Cells[1].StringCellValue; //但如果,sheet.GetRow(0).Cells[1]的值是一個數值, //這里不是說數據類型,是形式上就是阿拉伯數字, //那么調用StringCellValue就會拋出異常 //不調用StringCellValue,其效果一樣,而且解決值為阿拉伯數字的情況
string resGp = sheet.GetRow(0).Cells[1];
//上面一句雖然避免了異常問題,但是,如果想獲取阿拉伯數值的數據,那就使用ToString()
string resGp = sheet.GetRow(0).Cells[1].ToString();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM