最近在作一個打印發票的程序,要求保存打印記錄,因此用到了NPOI往Excel裏導入數據,可是遇到了一些問題無法解決,最後看了別人的Java程序後才明白。下面只是說明幾個問題,而不是怎樣使用NPOIweb
問題1:Invalid header signature; read 0x0000000000000000, expected 0xE11AB1A1E011CF測試
緣由:一般的緣由是讀取的文件頭信息不對,多是相似於將txt文件的後綴名直接改爲xls,或者由其餘軟件導出成的Excel。ui
意思是咱們用FileStream fs=new FileStream("demo.xls");建立的Excel表,這實際上是一個文本文件,因此不能用這種方式建立。spa
解決: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文件裏追加記錄code
試了不少方法使用FileMode.Append會報錯、利用sheet.LastRowNum+1建立一行再往裏添加數據可是最後Excel裏並無顯示orm
解決:blog
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必須有字段列頭即,字段列頭,便於賦值 ip
若是你遇到了我沒遇到的問題,請分享給你們內存