【问题标题】:Unable to Save Excel File Using C#无法使用 C# 保存 Excel 文件
【发布时间】:2013-08-30 05:03:13
【问题描述】:

我正在尝试在 Excel 中修改和保存数据。使用下面的代码,我正在访问工作表,执行修改,然后保存文件。我无法保存文件。这是我的代码:

Application excel = new Application();
        excel.Visible=true;
        Workbook wb = (Workbook)excel.Workbooks.Open(@"C:\Users\dnyanesh.wagh\Desktop\BookExcel1.xlsx");
        Worksheet ws = (Worksheet)wb.Worksheets[1];
        ws.Cells[1, 1] = "sagar";
        ws.Cells[2, 1] = "sagar";
        ws.Cells[3, 1] = "sagar";
        wb.Save();
        wb.close();

我收到此错误:“此位置已存在名为‘BookExcel1.xlsx’的文件。要替换它吗?”

所以我把代码改成:

Workbook wb = (Workbook)excel.Workbooks.Open(@"C:\Users\dnyanesh.wagh\Desktop\BookExcel1.xlsx",0, false, 5, "", "",
            false, XlPlatform.xlWindows, "", true, false,
            0, true, false, false););

然后错误是:“BookExcel1.xlsx 正在被 user_name.open 修改为只读”。如果我单击“取消”按钮,我会收到上面的异常“HRESULT 异常:0x800A03EC”

我也试过了:

wb.SaveAs(@"C:\Users\dnyanesh.wagh\Desktop\BookExcel1.xlsx");
wb.Close(true,null,null);

我收到了同样的错误,上面的文件显示了修改。

谁能告诉我如何保存修改后的文件?

【问题讨论】:

  • 不太清楚,只是快速思考一下……您确定可以使用与SaveAs 相同的文件路径吗?通常这会创建一个新文档。您可以使用Save() 函数吗?
  • 不要让它可见。
  • 我没有看到您释放创建的 COM 对象。请记住始终释放您创建/使用的每个 Excel 对象。如果您收到错误并且不关闭工作簿,它可能会保持打开状态,因此对于新实例是只读的... 更多:excel 未关闭(使用excel.Quit()),因此您可以在内存中有很多 Excel 进程。 .
  • @musefan 我尝试过,首先但无法保存它。即使我尝试使其不可见,但仍然出现错误“BookExcel1.xlsx”是只读的。要保存副本,请单击“确定”,然后在“另存为”对话框中为工作簿指定一个新名称。'
  • @Marco 我试了一下,还是无法保存。

标签: c# excel save


【解决方案1】:

检查您是否还没有运行 Excel.exe 进程。 此外,您应该打开工作簿以使其可编辑。

此代码有效:

string txtLocation = Path.GetFullPath(InputFile);

object _missingValue = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.Application excel = new   Microsoft.Office.Interop.Excel.Application();
Excel.Workbook theWorkbook = excel.Workbooks.Open(txtLocation,
                                                        _missingValue,
                                                        false,
                                                        _missingValue,
                                                        _missingValue,
                                                        _missingValue,
                                                        true,
                                                        _missingValue,
                                                        _missingValue,
                                                        true,
                                                        _missingValue,
                                                        _missingValue,
                                                        _missingValue);

//refresh and calculate to modify
theWorkbook.RefreshAll();
excel.Calculate();
theWorkbook.Save();
theWorkbook.Close(true);
excel.Quit();

【讨论】:

    【解决方案2】:

    发生这种情况是因为我试图打开的文件已经在 excel 应用程序中打开。在我的代码中,我没有在某些条件下关闭 excel 应用程序。这就是为什么它以只读权限打开它的原因。所以更新后我无法保存该文件。要以读写方式打开它,您必须先关闭该文件。之后,您可以打开它,轻松地对文件进行读写操作。

    您可以使用以下代码关闭并查看所有已打开的 Excel 应用程序:

    Application excel = (Application)Marshal.GetActiveObject("Excel.Application");
    Workbooks wbs = excel.Workbooks;
    foreach (Workbook wb in wbs)
    {
        Console.WriteLine(wb.Name); // print the name of excel files that are open
        wb.Save();
        wb.Close();
    }
    excel.Quit();
    

    在顶部,添加以下代码并引用Microsoft.Office.Interop.Excel

    using Microsoft.Office.Interop.Excel;
    using System.Runtime.InteropServices;
    

    【讨论】:

      【解决方案3】:

      这个problem 用于向后兼容的工作表(.xls)而不是.xlsx。

      要允许在 Pre office 2007 版本中打开工作表,它不能 包含超过 65k 行。你可以检查你的行数 使用 ctrl+arrowdown 直到到达底部。如果你尝试 获取大于该行数的范围会产生错误

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-30
        • 2022-08-22
        • 1970-01-01
        相关资源
        最近更新 更多