2010-09-30 93 views
5

我有以下代碼來打開Excel模板文件並將其保存爲.xlsx文件,當我嘗試打開新文件時出現以下錯誤。請幫助解決這個問題。Open XML SDK - 將模板文件(.xltx保存爲.xlsx)

由於文件格式或擴展名無效,Excel無法打開文件'sa123.xlsx'。驗證文件是否已損壞,文件擴展名是否與文件的格式相匹配。

 string templateName = "C:\\temp\\sa123.xltx"; 
     byte[] docAsArray = File.ReadAllBytes(templateName); 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      stream.Write(docAsArray, 0, docAsArray.Length); // THIS performs doc copy 
      File.WriteAllBytes("C:\\temp\\sa123.xlsx", stream.ToArray());  
     } 

回答

7

爲了做到這一點,您將需要使用Open XML SDK 2.0。下面是爲我工作,當我嘗試它的代碼片段:

byte[] byteArray = File.ReadAllBytes("C:\\temp\\sa123.xltx"); 
using (MemoryStream stream = new MemoryStream()) 
{ 
    stream.Write(byteArray, 0, (int)byteArray.Length); 
    using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Open(stream, true)) 
    { 
     // Change from template type to workbook type 
     spreadsheetDoc.ChangeDocumentType(SpreadsheetDocumentType.Workbook); 
    } 
    File.WriteAllBytes("C:\\temp\\sa123.xlsx", stream.ToArray()); 
} 

這段代碼所做的就是把你的模板文件,它通向一個SpreadsheetDocument對象。該物品的類型爲Template,但由於您希望將其作爲Workbook,因此您可以撥打ChangeDocumentType方法將其從Template更改爲Workbook。這將起作用,因爲底層XML在.xltx和.xlsx文件之間是相同的,並且它只是導致您遇到問題的類型。

+0

謝謝。這有幫助。 – 2010-10-01 12:03:04

1

Excel中看到的.xlsx擴展並嘗試打開它作爲一個工作表文件。但事實並非如此。這是一個模板文件。在Excel中打開模板並將其保存爲.xlsx文件時,會將其轉換爲工作表格式。你所做的與改變文件名中的擴展名相同。在Windows資源管理器中嘗試它,你會得到相同的結果。

我相信你應該能夠通過使用Excel Object Model完成你想要的。我沒有用過這個。

+0

任何想法我應該怎麼做才能隱藏/保存在上面的代碼中的工作表格式。 – 2010-09-30 19:56:17

+0

@SA。我通過回答編輯以包含對您問題的回答。 – YWE 2010-09-30 21:28:48

+0

你的第一段是對問題的一個很好的解釋,但是推薦有人使用excel interop來解決這個問題是有點矯枉過正的。 – 2011-01-18 22:44:17