5

我正在做一个简单的 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 年的办公室……正如我所承认的那样。

4

1 回答 1

4

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

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

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

workbook.Close(true);

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

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

最后一个想法,完成后使用 marshal 释放应用程序对象,否则 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);
}
于 2012-10-04T15:25:35.920 回答