2016-07-05 49 views
0

我一直在使用NPOI來讀取Excel文件,現在我需要寫出文件。我正在嘗試使用WorkbookFactory,它並未在線顯示大量示例(也未出現在CodePlex上的NPOI示例中)。下面是代碼:NPOI ArgumentOutOfRangeException on WorkbookFactory.Create

this.FileStream = new FileStream(
    this.FilePath, 
    FileMode.OpenOrCreate, 
    FileAccess.ReadWrite); 
this.Workbook = WorkbookFactory.Create(
    this.FileStream); 

當它到達了第二份聲明,我得到以下消息的ArgumentOutOfRangeException:"Non-negative number required.\r\nParameter name: value".

接下來的幾行調用堆棧:

at System.IO.FileStream.set_Position(Int64 value) 
at NPOI.Util.PushbackStream.set_Position(Int64 value) 
at NPOI.POIXMLDocument.HasOOXMLHeader(Stream inp) 
at NPOI.SS.UserModel.WorkbookFactory.Create(Stream inputStream) 
+0

雖然我測試,我正在嘗試寫入我的桌面。 – Tim

+0

哦,對不起,我沒有仔細閱讀您的帖子,堆棧和消息明確指出Position屬性設置爲負數,而不是模式超出範圍。 – Quantic

+0

好吧,我的眼睛開始從源代碼中查看,但我敢肯定,你需要一個'.xls'文件的外殼來讓代碼工作,並且我假定你正在創建文件(由於'FileMode.OpenOrCreate'),所以你得到一個異常,因爲[源代碼](https://github.com/tonyqus/npoi/blob/master/ooxml/POIXMLDocument.cs)「讀取」4個字節,然後將數據流倒回4個字節,但對於您來說,它將從0倒退到-4,從而引發異常。 – Quantic

回答

2

WorkbookFactory(鏈接到POI文檔)從輸入流中讀取現有的文件數據,並且實時確定是創建HSSFWorkbook還是XSSFWorkbook(即無論您使用的是XLS還是類似XLSX的文件)。

從您的代碼看來,您似乎在嘗試使用此類創建新文件。這不是WorkbookFactory可以幫助您的。爲了文件,請使用以下模式:

var workbook = new XSSFWorkbook(); 
... 
using (var fileData = new FileStream(@"path\filename.xlsx", FileMode.Create)) 
{ 
    workbook.Write(fileData); 
} 

(換句話說,WorkbookFactory是工廠,而不是一個文件廠:-))