2012-10-04 84 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