2010-04-06 55 views
1

我正在使用BinaryReader從Exchange郵箱中使用OWA讀取Excel 2007文件,然後使用BinaryWriter將該文件寫入磁盤。我的問題是作者完成時兩個文件不匹配。更糟糕的是,Excel 2007不會打開該寫入文件。C#中的Excel 2007文件寫入器導致損壞的文件

以前,Excel 2003對於下面的解決方案沒有任何問題。如果文件是Excel 2003格式文件,並且文件格式爲Excel 2007(* .xlsx),則Excel 2007不存在問題。

BinaryReader在:

using(System.IO.Stream stream = resource.GetInputStream(attachedFiles[k].Address)) 
{ 
    using(System.IO.BinaryReader br = new System.IO.BinaryReader(stream)) 
    { 
     attachment.Data = new byte[attachedFiles[k].Size]; 
     int bufPosn=0, len=0; 
     while ((len = br.Read(attachment.Data, bufPosn, attachment.Data.Length-bufPosn)) > 0) 
     { 
      bufPosn += len; 
     } 
     br.Close(); 
    } 
} 

的BinaryWriter:

FileStream fs = new FileStream(fileName, FileMode.Create); 
BinaryWriter binWriter = new BinaryWriter(fs); 
binWriter.Write(content, 0, content.Length); 
binWriter.Close(); 
fs.Close(); 

建議gratfully接收。

+0

什麼是內容變量? xlsx的格式不同,所以你如何創建'content'是很重要的。 – AaronLS 2010-04-06 21:22:30

+0

只是猜測,也許你的.xlsx是Unicode,你需要用BinaryWriter(Stream,Encoding)構造函數構造你的BinaryWriter。 – 2010-04-06 21:38:10

+0

xlsx本質上是一個壓縮的xml文件。 – Asher 2010-04-07 06:10:16

回答

0

IE8和OWA存在問題,但我不確定它是否適用於您的情況。

結帳this site其中也有鏈接到this site。他們基本上解釋瞭如何解決使用OWA下載xmlx和docx文件的問題。

+1

我已經嘗試調整用於編寫文件的編碼,嘗試使用Unicode,UTF8,UTF7,ANSI,ASCII,以及其他提供給模糊問題的其他答案中引用的幾個建議代碼頁。 內容是用戶從各種各樣的用戶生成的,因此完全不可預測。 Asher引用的OWA Office 2007問題的確會影響我正在使用的系統,但問題不會影響文件的內容(即一旦保存到磁盤,Excel將打開它而不會出現問題)。 – Martin 2010-04-07 11:25:49

2

此問題是由被attachmentFiles [k] .Size返回的值引起的,該值與實際文件大小無關。似乎Excel 2003文件似乎不受此影響,但Excel 2007文件由於其壓縮性質而易受攻擊(解壓縮例程顯然會以不同方式查看文件)。

一旦我糾正了緩衝區的大小,文件很好。

感謝您的建議

+0

很好找到感謝分享提示。順便說一句,你用什麼公式來獲得正確的緩衝區大小?既然你不能直接使用附加的文件大小屬性? – 2010-12-29 21:33:37