保存 Excel 工作簿 C#

Posted

技术标签:

【中文标题】保存 Excel 工作簿 C#【英文标题】:Saving an excel workbook C# 【发布时间】:2017-01-28 09:49:54 【问题描述】:

我正忙于使用 C# 应用程序操作 excel 数据的应用程序。

xlApp = new Excel.Application();
            xlWorkbook = xlApp.Workbooks.Open(ConString, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.get_Item(1);

到目前为止,我只是通过简单地说“xlApp.Quit”来保存工作簿,这将调出您从任何 Microsoft Office 产品中获得的标准“您想保存您的更改”对话框。

但是,我在保存工作簿数据时遇到了问题,因此有人告诉我使用 Workbook.Save 方法。它现在保存正确的数据,但我无法指定文件名/位置。

我阅读了有关 .SaveCopyAs 方法的信息,我正在使用保存文件对话框来提供文件名/位置,但是当我按下保存并关闭应用程序时,找不到文件。

这是 Savefile 方法。

    private void SaveFile()
    
        using (SaveFileDialog Save = new SaveFileDialog())
        
            Save.Filter = "Excel Files (*.xlsx)|*.xlsx";
            Save.InitialDirectory = "C:";
            Save.Title = "Save";
            if (Save.ShowDialog() == DialogResult.OK)
            
                // Using .SaveCopyAs doesnt save at all
                xlWorkbook.SaveCopyAs(saveFileDialog1.FileName);
                xlWorkbook.Saved = true;
                //Using .Save saves the file, but i cannot specify the location/File name
                //xlWorkbook.Save();
                xlApp.Quit();
                ReleaseObject(xlWorksheet);
                ReleaseObject(xlWorkbook);
                ReleaseObject(xlApp);
            
        
     

不确定这是否相关,但这是我的 ReleaseObject 方法。

private void ReleaseObject(object obj)
        
            try
            
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            
            catch(Exception ex)
            
                obj = null;
                MessageBox.Show("Unable to release the object " + ex.ToString());
            
            finally
            
                GC.Collect();
            
        

我看到很多人说他们的 SaveCopyAs 方法也没有保存,这是因为他们没有给文件命名/扩展名。这是我检查的第一件事。这个互操作的东西对我来说是新的,所以请原谅任何错误。

谢谢

【问题讨论】:

个人对于 Excel 工作我使用 ClosedXML,它比 COM\Interop 对象更容易使用。它住在这里github.com/closedxml/closedxml,最初在这里,查看文档closedxml.codeplex.com 首先我同意@SimonPrice - 除非你真的想重新计算工作簿,在这种情况下你可能会更好地使用NetOffice (netoffice.codeplex.com)。同时,你试过SaveAs方法(msdn.microsoft.com/en-us/library/…)吗? 【参考方案1】:

试试xlWorkbook.SaveAs("TheSavePath") instead ofxlWorkbook.SaveCopyAs`。

并用于覆盖:

xlWorkbook.SaveAs("TheSavePath", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, true, false, XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);

【讨论】:

这是抛出“system.runtime.interopservices.comexception 文件无法访问”异常。 这显然是另一个权限问题。 尝试保存到您过去保存的其他路径,只是为了测试访问权限。 我已经尝试保存在“我的文档”和“桌面”中,过去都没有问题。尝试只保存到 C 盘,它告诉我我没有这样做的权限,请选择其他位置。 是网页应用还是桌面应用?你是从 Visual Studio 运行它的吗?

以上是关于保存 Excel 工作簿 C#的主要内容,如果未能解决你的问题,请参考以下文章

使用 Excel 并尝试在 c# 中找到保存工作簿的方法,但没有运气;我已经用尽了谷歌

excel怎样恢复未保存的工作簿文件?

Azure Blob 存储:从 Excel 工作簿中删除密码

一个Excel工作簿中的多个工作表怎么拆分成独立表格

使用 C# 代码打开 Excel 工作簿时出错

如何在保存到 OneDrive 的 Excel 工作簿中运行 SQL 查询?