C# 保存excel 2003文件

C# 保存excel 2003文件,c#,ms-office,excel-2003,C#,Ms Office,Excel 2003,我正在做一个简单的c#应用程序,它可以编辑现有的Excel2003模板(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

我正在做一个简单的c#应用程序,它可以编辑现有的Excel2003模板(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年office。。。正如我所承认的。

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

其次,在.Net中,将引用值设置为null实际上没有任何作用,这与VB6不同,垃圾收集器足够聪明,可以判断何时不再使用引用,并将其清除

第三,如果您使用的是.Net 4或更高版本,则不需要为工作簿关闭方法的可选参数提供值,因此这同样有效:

workbook.Close(true);
最后,您不需要将工作表转换为工作表,只需执行以下操作:

Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0];
最后一个想法是,完成后使用封送处理释放应用程序对象,否则Excel将永远挂在任务管理器中(可能在try块中执行需要执行的操作,然后在finally块中执行此操作):

方法的更新版本如下:

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

您引用的是哪个互操作程序集版本?如何编辑单元格?好的,
xlExcel8
是保存Excel 2003工作簿的正确枚举,您是否使用
Value
Value2
属性设置值?这并不重要。我发现了一个问题的核心-在第一次发布时没有加载加载项。。。这就是为什么所有的公式都给我带来了麻烦。现在的问题是:为什么会发生这种情况,以及如何解决这个问题(事实上,我认为这需要一个新的问题)
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);
}