2012-10-04 116 views
5

我正在做一個簡單的c#應用程序,它將編輯現有的excel 2003模板(xlt)並保存到一個新的* .xls文件中。它是這樣的:保存excel 2003文件

Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application(); 
Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Open("\\my_template.xlt"); 
Microsoft.Office.Interop.Excel._Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[0]; 

然後我修改一些細胞中,在不同的配方中使用的文件 內保存模板到一個新的文件:

workbook.SaveAs("newfile.xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal); 
workbook.Close(true, misValue, misValue); 
app.Quit(); 

worksheet = null; 
workbook = null; 
app = null; 

所以問題是,當新的文件成功保存後,我打開它,看到使用了我編輯的單元格的公式的結果就像「#NAME」等等。當我重新打開文件 - 一切都變好了。爲什麼會發生?

也許我是通過不正確的方式保存文件,這就是爲什麼我在第一次打開時看到錯誤?這個問題僅適用於2003年的辦公室......正如我所承認的那樣。

+0

哪個互操作程序集版本是你引用? –

+3

你是如何編輯單元格的? – oberfreak

回答

3

如前所述here,改變枚舉xlExcel8,而不是xlWorkbookNormal,這會以正確的格式保存。其次,將您的參考值設置爲null並不會在.Net中真正做任何事情,它不像VB6,垃圾收集器非常聰明,無論何時不再使用引用,都會清理乾淨。

第三,如果你使用的是.NET 4或以上,你並不需要爲工作簿關閉方法的可選參數提供值,所以這個作品一樣好:

workbook.Close(true); 

最後,你不需要投你的工作表作爲工作表,你可以這樣做:

Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0]; 

最終的一個想法,用元帥發佈應用程序對象一旦你完成,或Excel將掛在你的身邊任務管理器永遠(也許做你需要做的內部嘗試塊,然後做這在finally塊):

Marshal.ReleaseComObjct(app); 

更新方法的版本低於:

Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application(); 

try 
{ 
    Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Open(@"\my_template.xlt"); 
    Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0]; 

    //Do stuff 

    workbook.SaveAs("newfile.xls", Microsoft.Office.Interop.Excel.XlFileFormat..xlExcel8); 
    workbook.Close(true); 
    app.Quit(); 
} 
finally 
{ 
    Marshal.ReleaseComObject(app); 
} 
+0

我會在稍後測試您的建議並在此處報告結果,thx! – TakinosaJi

+0

它沒有幫助我...... – TakinosaJi

+0

好'xlExcel8'是保存Excel 2003工作簿的正確枚舉,你是用'Value'還是'Value2'屬性設置你的值? – JMK