Excel 保存问题

Application app = new ApplicationClass();
                try{
                    //让后台执行设置为不可见
                    app.Visible = false;
                    //新增加一个工作簿
                    Workbook wBook = app.Workbooks.Add(true);
                    //如果要打开已有的工作簿,则使用下面的注释语句
                    // Workbook wBook = app.Workbooks.Open(@"D:\1.xlsx",
                    //  missing, missing, missing, missing, missing, missing, missing,
                    //  missing, missing, missing, missing, missing,missing, missing);
                    //取得一个工作表
                    //如果打开了已有的工作簿,也可以这样获取工作表Worksheet wSheet = wBook.ActiveSheet as Worksheet;
                    //wSheet = Wb.Worksheets["Sheet1"];
                    //var test = wSheet.get_Range("A1", Type.Missing);
                    Worksheet wSheet = wBook.Worksheets[1] as Worksheet;
                    wSheet.Cells[1, 1] = "this is a test&quot";
                    //设置禁止弹出保存和覆盖的询问提示框
                    app.DisplayAlerts = false;
                    app.AlertBeforeOverwriting = false;

                    wBook.Save();//保存excel文件
                    wBook.Saved = true;
                    worksheet.SaveAs(@"D:\1.xlsx", Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                        Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                    wBook.Close(false, Missing.Value, Missing.Value);

                catch
                    {
                       
                    }
                finally
                {
                    if (app != null)
                    {
                    app.Workbooks.Close();
                    app.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                    }

                }

这样的顺序,我发现我无法保存修改内容

wSheet.SaveAs(“C:abc.xls”,Missing.Value,Missing.Value,Missing.Value,Missing.Value,

Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
wBook.Save();
 
这样的顺序就可以了,我想是不是跟新建和打开excel有关呢?
wBook.Save();

wSheet.SaveAs(“C:abc.xls”,Missing.Value,Missing.Value,Missing.Value,Missing.Value,

Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
 

代码注释部分只是简单描述各语句的原由,个别的还是值得推敲的。
语句一 Workbook wBook = app.Workbooks.Add(true);Workbooks.Add的参数是个object类型,通常使用true或null,表明工作簿在默认文档下创建,或者使用枚举值 XlWBATemplate.xlWBATWorksheet,但如果传入一个excel完整文件名,却相当于打开已有工作簿。
语句二 Worksheet wSheet = wBook.Worksheets[1] as Worksheet;wBook.Worksheets虽然反映的是工作表的集合,然而新创建的工作簿中只有一个工作表,且索引是1,如果换成0将无法找到指定的WorkSheet,如果是操作多个工作表的话,建议用new WorkSheetClass()实例化之后加入到wBook.Worksheets中去。如果是打开已存在的工作簿,这条语句也可能会报错,最好是调用wBook.ActiveSheet来获取或者再加些判断。
语句三 wBook.Save();app.Save(“C:abc.xls”);这两句代码至关重要,而且必不可少,否则,保存时会弹出“是否保存sheet1.xls”的对话框。像示例中的保存,在windows server 2003中,因为权限的原因,还可能会出现这样的现象(其它操作系统的结果有待考证):生成的abc.xls除了本机上运行此代码的用户打开正常外,其他户打开后的错误信息如下:
无法访问文件。请尝试下列方法之一:
确认所指定的文件夹已存在。
确认文件所在的文件夹不是只读的。
确认给出的文件名不包含下列字符:<>?[]:Sheet1.xls或*。
确认文件/路径名长度不超过218个字符。
因为此时创建的工作簿其实是在当前用户的“我的文档”目录下自动生成了一个Sheet1.xls副本,而abc.xls是指向这个副本的快捷方式,所以导致其他用户无权访问。我采取的解决办法是将这两句替换为:
wSheet.SaveAs(“C:abc.xls”,Missing.Value,Missing.Value,Missing.Value,Missing.Value,

Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);

wBook.Save();
这样做,“我的文档”下就不会再创建Sheet1.xls,而且打开可以发现,原来工作簿里那个工作表名是sheet1.xls的也更改名字为abc.xls了。
语句四 app.Quit();
这个关闭一直有疑点,因为C#操作com非托管对象时,凭借Quit()还没有释放掉对象,excel进程不一定会终止,于是,有人使用KillProcess()(如果使用KillProcess()方法,就一定要获取到当前excel进程的句柄,在把这个excel进程kill掉)来处理,我个人认为这不是一个好主意,可能会破坏其它正在执行的excel进程。不过有一点是一定要做到,就是在Quit()前不能再有任何更改,不然还是会弹出保存的对话框。所以退出前确保一定是执行过WorkBook或是Application的Save()方法的。

退出时一定要调用GC.Collect();回收资源
而且切记!不能在线里掉用,因为这样没用,一定要到线程外,也就是某个线程所有的对象都被销毁掉,调用GC.Collect();系统才会回收资源。

比如

private void aaa()
{
execl aaa=new execl()
GC.Collect(); //如果你在这里调用系统不会回收!!!
//因为aaa还没有被销毁掉
//系统不会回收!!!
}

如果在加个方法调用

private void bbb()
{
aaa();
GC.Collect(); //就可回收!!!
}

比如写了个打开Excel方法或者创建Excel方法,GC.Collect();不能写在这个方法里面,而是应该调用完这个方法后带写这句。否则EXCEL进程无法取消。

WorkBook的SaveAs方法

'声明
Sub SaveAs ( _
     Filename As Object, _
     FileFormat As Object, _
     Password As Object, _
     WriteResPassword As Object, _
     ReadOnlyRecommended As Object, _
     CreateBackup As Object, _
     AccessMode As XlSaveAsAccessMode, _
     ConflictResolution As Object, _
     AddToMru As Object, _
     TextCodepage As Object, _
     TextVisualLayout As Object, _
     Local As Object _
)
参数
Filename
类型:System.Object
要保存的文件的名称。可以包含完整路径;否则,Microsoft Office Excel 将文件保存在当前文件夹中。

FileFormat
类型:System.Object
XlFileFormat 值之一,指定保存文件时要使用的文件格式。对于现有文件,默认格式为最后一种指定文件格式;对于新文件,默认格式为所用 Excel 版本的格式。

Password
类型:System.Object
一个区分大小写的字符串(不超过 15 个字符),指示为文件指定的保护密码。

WriteResPassword
类型:System.Object
文件的写保护密码。如果保存文件时指定了密码,但打开文件时没有提供密码,则该文件以只读方式打开。

ReadOnlyRecommended
类型:System.Object
如果为 true,则在打开该文件时显示一条消息,建议以只读方式打开该文件。

CreateBackup
类型:System.Object
如果为 true,则创建备份文件。

AccessMode
类型:Microsoft.Office.Interop.Excel.XlSaveAsAccessMode
XlSaveAsAccessMode 值之一。

ConflictResolution
类型:System.Object
XlSaveConflictResolution 值之一。

AddToMru
类型:System.Object
如果为 true,则将工作簿添加到最近使用的文件列表中。默认值为 false。

TextCodepage
类型:System.Object
对于 Microsoft Excel 中的所有语言均忽略。

说明
当 Excel 将工作簿保存为 CSV 或文本格式之一(使用 FileFormat 参数指定)时,它使用与当前计算机上使用的系统区域设置语言相对应的代码页。
 

TextVisualLayout
类型:System.Object
对于 Microsoft Excel 中的所有语言均忽略。

说明
当 Excel 将工作簿保存为 CSV 或文本格式之一(使用 FileFormat 参数指定)时,它会以逻辑布局保存这些格式。如果在文件中从右到左的文本内嵌入从左到右的文本,逻辑布局会按照文件中所有语言的正确读取顺序保存文件内容,而不管方向如何,反之亦然。当使用应用程序打开文件时,系统会根据代码页中的字符值范围按照正确方向呈现每一连串字符中的字符。(在用于显示文件的精确内存布局的应用程序(如调试器或编辑器)中打开该文件时例外。)
 

Local
类型:System.Object
如果为 true,则按照 Excel(包括控制面板设置)的语言保存文件。如果为 false(默认值),则按照 Visual Basic for Applications (VBA) 的语言保存文件。

备注
--------------------------------------------------------------------------------

Visual Studio 不支持将工作簿保存为共享工作簿。

原文地址:https://www.cnblogs.com/renfeng/p/2514488.html