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

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

其次,将引用值设置为 null 在 .Net 中并没有真正执行任何操作,它不像 VB6,垃圾收集器足够聪明,可以找出何时不再使用引用,并清理它。

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

workbook.Close(true);

最后,您不需要将工作表转换为工作表,只需执行以下操作:

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

最后一个想法,完成后使用封送器释放应用程序对象,否则 Excel 将永远挂在您的任务管理器中(也许在 try 块中执行您需要做的事情,然后在 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);
}

最新更新