最近在做一個打印發票的程序,要求保存打印記錄,所以用到了NPOI往Excel里導入數據,但是遇到了一些問題沒法解決,最后看了別人的Java程序后才明白。下面只是說明幾個問題,而不是怎樣使用NPOI
問題1:Invalid header signature; read 0x0000000000000000, expected 0xE11AB1A1E011CF
原因:通常的原因是讀取的文件頭信息不對,可能是類似於將txt文件的后綴名直接改成xls,或者由其他軟件導出成的Excel。
意思是我們用FileStream fs=new FileStream("demo.xls");創建的Excel表,這其實是一個文本文件,所以不能用這種方式創建。
解決:
MemoryStream ms = new MemoryStream(); //創建內存流用於寫入文件 IWorkbook workbook = new HSSFWorkbook(); //創建Excel工作部 ISheet sheet = workbook.CreateSheet("EquipBill");//創建工作表 IRow row = sheet.CreateRow(sheet.LastRowNum);//在工作表中添加一行 ICell cell = row.CreateCell(0);//創建單元格 cell1.SetCellValue("領用單位");//賦值 workbook.Write(ms);//將Excel寫入流 ms.Flush(); ms.Position = 0; FileStream dumpFile = new FileStream(“demo.xls”, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite); ms.WriteTo(dumpFile);//將流寫入文件
問題2:不能往Excel文件里追加記錄
試了很多方法使用FileMode.Append會報錯、利用sheet.LastRowNum+1創建一行再往里添加數據但是最后Excel里並沒有顯示
解決:
FileStream fs = new FileStream(“demo.xls”, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);//讀取流 POIFSFileSystem ps=new POIFSFileSystem(fs);//需using NPOI.POIFS.FileSystem; IWorkbook workbook = new HSSFWorkbook(ps); ISheet sheet = workbook.GetSheetAt(0);//獲取工作表 IRow row = sheet.GetRow(0); //得到表頭 FileStream fout = new FileStream(“demo.xls”, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);//寫入流 row = sheet.CreateRow((sheet.LastRowNum + 1));//在工作表中添加一行 ICell cell1 = row.CreateCell(0); cell1.SetCellValue(“測試數據”);//賦值 fout.Flush(); workbook.Write(fout);//寫入文件 workbook = null; fout.Close();
一看代碼就明白了,先讀取,再寫入。為什么要得到表頭,因為一個excel必須有字段列頭即,字段列頭,便於賦值
如果你遇到了我沒遇到的問題,請分享給大家
轉 :https://www.cnblogs.com/liuxiaobo93/p/3570654.html