保存excel 2003文件

时间:2012-10-04 14:32:06

标签: c# ms-office excel-2003

我正在做一个简单的c#应用程序,即编辑现有的excel 2003模板(xlt)并保存到新的* .xls文件中。它就像:

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年的办公室......正如我承认的那样。

1 个答案:

答案 0 :(得分:3)

如上所述here,请将枚举更改为 xlExcel8 ,而不是 xlWorkbookNormal ,这将以正确的格式保存。

其次,将参考值设置为null并不能真正在.Net中执行任何操作,它不像VB6,垃圾收集器足够智能,可以在不再使用引用时弄清楚,并清理它。 / p>

第三,如果您使用的是.Net 4或更高版本,则不需要为Workbook Close方法的可选参数提供值,因此这也适用:

workbook.Close(true);

最后,您不需要将工作表转换为工作表,您可以这样做:

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

最后一个想法是,一旦完成就使用marshal释放应用程序对象,或者Excel将永远在你的任务管理器中闲逛(也许在try块中做你需要做的事情,然后在最后做到这一点)块):

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);
}