C#保存Excel文件的问题

innerorouter 2009-08-15 01:17:20
写了一个生成和保存Excel文件的方法。代码如下。
参数strName是文件的保存路径,是通过SaveFileDialog的FileName属性得到的。
每次运行到SaveAs那一行就会抛出异常提示不能访问该文件。
自己找不到原因。哪位兄弟能指点一下?谢谢!

public void GenerateExcel(string strName)
{
Application xlApp = new Application();
xlApp.Visible = false;
xlApp.Workbooks.Add(true);
Workbooks xlBooks = (Microsoft.Office.Interop.Excel.Workbooks)xlApp.Workbooks;
Workbook xlBook = (Microsoft.Office.Interop.Excel.Workbook)(xlBooks.Add(Type.Missing));
Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.ActiveSheet;

xlSheet.Name = "Modify Production Data";
xlSheet.Cells[1, 1] = "Test Header 1";
xlSheet.Cells[1, 2] = "Test Header 2";
xlSheet.Cells[1, 3] = "Test Header 3";

xlSheet.Cells[2, 1] = "Test Data 1";
xlSheet.Cells[2, 2] = "Test Data 2";
xlSheet.Cells[2, 3] = "Test Data 3";

xlSheet.Columns.EntireColumn.AutoFit();
xlSheet.SaveAs(strName, Microsoft.Office.Interop.Excel.XlFileFormat.xlXMLSpreadsheet, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing);
xlBook.Close(false, Type.Missing, Type.Missing);
xlBooks.Close();
xlApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);

GC.Collect();
System.Diagnostics.Process.Start(strName);
}
...全文
303 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
doubleu2005 2009-08-15
  • 打赏
  • 举报
回复
xlSheet.SaveAs(strName, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel8, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing);

我用vs2008试了没问题
十八道胡同 2009-08-15
  • 打赏
  • 举报
回复
在文件打开之前加上我1楼的代码
innerorouter 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lcl_data 的回复:]
如果是覆盖  直接 wbook.Save();  就可以了
SaveAs 可以是另存为
[/Quote]
不是覆盖。是创建一个新文件。比如,创建一个"D:\test.xls"。现在的问题是一走到SaveAs就抛出无法访问文件的异常,但是在"D:\"能找到一个叫做"test.xls"的空文件。
我刚才尝试了一下把SaveAs那一行注释掉,然后一直走过System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)那一段,直到GC.Collect()都没有问题。到了System.Diagnostics.Process.Start(strName);文件被打开,但是提示说该文件处于锁定状态,正在被其他用户编辑。
十八道胡同 2009-08-15
  • 打赏
  • 举报
回复
如果是覆盖 直接 wbook.Save(); 就可以了
SaveAs 可以是另存为
十八道胡同 2009-08-15
  • 打赏
  • 举报
回复
你现在是要覆盖?
十八道胡同 2009-08-15
  • 打赏
  • 举报
回复
msdn上这么说的
private void WorkbookSaveAs()
{
if (this.FileFormat == Excel.XlFileFormat.xlWorkbookNormal)
{
this.SaveAs(this.Path + @"\XMLCopy.xls",
Excel.XlFileFormat.xlXMLSpreadsheet, missing, missing,
false, false, Excel.XlSaveAsAccessMode.xlNoChange,
missing, missing, missing, missing, missing);
}
}
innerorouter 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kk3k2005 的回复:]
和excel进程的释放应该没关系
异常贴出来
IO错误原因很多
[/Quote]
异常如下:
Message:不能访问“test.xls”。
Source:"Microsoft Office Excel"
StackTrace: 在 Microsoft.Office.Interop.Excel._Worksheet.SaveAs(String Filename, Object FileFormat, Object Password, Object WriteResPassword, Object ReadOnlyRecommended, Object CreateBackup, Object AddToMru, Object TextCodepage, Object TextVisualLayout, Object Local) ...
doubleu2005 2009-08-15
  • 打赏
  • 举报
回复
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks);
xlApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);

注意红色顺序
KK3K2005 2009-08-15
  • 打赏
  • 举报
回复
和excel进程的释放应该没关系
异常贴出来
IO错误原因很多
Allen__Jo 2009-08-15
  • 打赏
  • 举报
回复
excelWorkSheet.SaveAs(paths, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value)

CloseExcelApplication();

//关闭Excel文件,释放对象;
public void CloseExcelApplication()
{
try
{
//excelWorkBook.Saved = true;
excelWorkBooks = null;
excelWorkBook = null;
excelWorkSheet = null;
excelRange = null;
if (excelApplication != null)
{
//ExcelApp.DisplayAlerts=fales
excelApplication.DisplayAlerts = false;
excelApplication.Workbooks.Close();
excelApplication.Quit();
excelApplication = null;
//ReleaseAllRef(excelApplication);//Error

}
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
Allen__Jo 2009-08-15
  • 打赏
  • 举报
回复
excelWorkSheet.SaveAs(paths, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value)

不过要看你引用的Excel是哪个版本了。。好像2000和2003,2007都不一样,要根据你的Excel版本号来写

上面的我已经用很久了都没有错误
十八道胡同 2009-08-15
  • 打赏
  • 举报
回复
执行之前你先看一下你的任务管理器里有没有excel进程,有的话先杀死在执行
innerorouter 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lcl_data 的回复:]
应该是excel进程没杀死的原因
C# code# wbook.Save();
# wbook.Close(true,null,null);
# System.Runtime.InteropServices.Marshal.ReleaseComObject(wsheet);
# System.Runtime.InteropServices.Marshal.ReleaseComObject(wbook);
# System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
# wsheet=null;
# wbook=null;
# app=null;
# GC.Collect();
这样试试
[/Quote]
多谢LCL_data的建议!我试了一下,还是同样的问题,在执行到这些代码之前就已经抛出异常了。
十八道胡同 2009-08-15
  • 打赏
  • 举报
回复
应该是excel进程没杀死的原因
#  wbook.Save();  
# wbook.Close(true, null, null);
# System.Runtime.InteropServices.Marshal.ReleaseComObject(wsheet);
# System.Runtime.InteropServices.Marshal.ReleaseComObject(wbook);
# System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
# wsheet = null;
# wbook = null;
# app = null;
# GC.Collect();

这样试试

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧