Tak*_*aJi 5 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];
Run Code Online (Sandbox Code Playgroud)
然后我修改一些在文件中的各种公式中使用的单元格,并将模板保存到一个新文件:
workbook.SaveAs("newfile.xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal);
workbook.Close(true, misValue, misValue);
app.Quit();
worksheet = null;
workbook = null;
app = null;
Run Code Online (Sandbox Code Playgroud)
所以问题是当新文件被成功保存时,我打开它,看到使用我编辑过的单元格的公式结果就像"#NAME"一样.当我重新打开文件时 - 一切都变好了.为什么会这样?
也许我正在以不正确的方式保存文件,这就是我在第一次打开时看到错误的原因?这个问题仅适用于2003年的办公室......正如我承认的那样.
如此处所述,将枚举更改为xlExcel8而不是xlWorkbookNormal,这将以正确的格式保存。
其次,将引用值设置为 null 在 .Net 中并没有真正执行任何操作,它与 VB6 不同,垃圾收集器足够聪明,可以在引用不再被使用时发现并清理它。
第三,如果您使用 .Net 4 或更高版本,则无需为 Workbook Close 方法的可选参数提供值,因此这也同样有效:
workbook.Close(true);
Run Code Online (Sandbox Code Playgroud)
最后,您不需要将工作表转换为工作表,您可以这样做:
Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0];
Run Code Online (Sandbox Code Playgroud)
最后一个想法是,完成后使用编组释放应用程序对象,否则 Excel 将永远保留在任务管理器中(也许在 try 块内执行您需要执行的操作,然后在 finally 块中执行此操作):
Marshal.ReleaseComObjct(app);
Run Code Online (Sandbox Code Playgroud)
方法的更新版本如下:
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4290 次 |
| 最近记录: |