2012-03-10 48 views
0

「MS-XLS文件格式包含流,子流和記錄。」 - Understanding the Excel MS-XLS Binary Format檢測子流

給定一個xls文件流:

FileStream stream = System.IO.File.Open(filePath, FileMode.Open, FileAccess.Read); 
var xs = new List<int>(); 
for(int i = 0; i < stream.Length;i++) 
{ 
xs.Add(stream.ReadByte()); 
} 

我怎麼會去檢測子?這個名稱是否因爲子流實際上以某種順序包含在流中而受到欺騙?

+0

@DanielMošmondor - 這裏有一個具體的問題,不幸的是我認爲你誤解了正在發生的事情。我正在使用文件流來編寫.net文件中的.xls文件中的一個字節數組。因此,我的文件流包含一個xls結構化流。它由子流等組成。請在您評論之前閱讀。 – 2012-03-10 23:10:57

回答

1

XLS(以及Office 2007之前的其他MS Office格式)是一個結構化的存儲文件aka複合二進制文件(參見https://en.wikipedia.org/wiki/COM_Structured_Storage)。結構化存儲就像文件內的文件系統,文件被稱爲「流」,目錄稱爲「存儲」。一個結構化的存儲文件有一個單獨的根「存儲」,它可以包含流和其他存儲,看起來就是xls文件中所有流所在的位置(這可能是爲什麼他們的文檔跳過了「存儲」的概念,並且引用流爲「子流」)。

通常情況下,您可以使用IStorage接口訪問結構化存儲(請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/aa380015%28v=vs.85%29.aspx),但這可能不是.NET中最方便的方法。

爲了在.NET中訪問結構化存儲中的數據,我建議使用OpenMCDF - http://sourceforge.net/projects/openmcdf/ - 但我沒有自己嘗試過,所以我無法對其質量作出任何承諾。

「記錄」不是結構化存儲文件格式的一部分,我認爲你需要自己解析它們。

根據您要做的事情,使用更高級別的接口可能是合適的,而不必擔心XLS格式的細節。

+0

我想解析出xls文件的格式。我有單元格的數據,但無法弄清楚如何獲取它們的格式。 – 2012-03-11 00:11:02

0

「OLE複合文件:一種結構化存儲形式,如[MS-CFB]中所述。複合文件允許獨立的存儲和流存在於單個文件中。」 -MS

基本上,這個流反映了用於存儲文件的結構,術語「子流」應該至少在MSDN庫中定義。

所有文件都可以表示爲從流中讀取的字節數組,並且構造流是非常普遍的。在.NET中,文件流用於收集這些數據,並且可以用於任何文件,如.xls,.jpg,.doc等。