C# Excel 强制只读,没有编辑权限

San*_*nya 0 c# excel readonly

我有一个 Excel 工作簿(“test.xlsx”),它有一个名为“gv_epxsize”的单元格。我的目标是打开 excel 工作簿并在名称为“gv_epxsize”的单元格中写下字符串“101”。

问题是我的代码一直将文件设为只读,因此它不会将字符串“101”写入命名单元格。我一直收到 Windows 提示,我已经使用 Windows 权限打开了该文件,并询问我是否要打开只读副本。问题是我没有打开文件,并且在我启动代码之前没有运行 EXCEL.EXE 进程。

我已经做了什么:

  • 我已将文件以不同的名称保存在不同的文件夹中 - 仍然没有运气。
  • 该文件未保存在共享文件夹中。
  • 在我运行我的代码之前,我已经确保我的 TaskManager 已经杀死了每个 EXCEL.EXE 进程。

有人可以告诉我我在这里做错了什么吗?

这是 C# 的片段

  string filePath = "C:\\Users\\ussatdafa\\Desktop\\Work\\Projects\\test.xlsx";

  Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();

        if (xlApp == null)
        {
            MessageBox.Show("Excel has not been properly installed");
        }
        else
        {
            //string fileName = Path.Combine(Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath), filePath);
            Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
            Workbooks wbs = excelApp.Workbooks;
            Workbook wb = wbs.Open(filePath, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false);


            Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);
            wb.Names.Item("gv_epxsize").RefersToRange.Value = "101";
        }
Run Code Online (Sandbox Code Playgroud)

Ham*_*one 5

老实说,我不确定发生了什么,但我有两个观察结果:

  1. 您打开 Excel 两次——这似乎是肯定的。一个实例是xlApp,另一个实例是excelApp。如果您在实例化时打开任务管理器,excelApp我很确定您会发现两个 Excel 实例正在运行。我不知道这是否会导致您的问题
  2. 我总是发现在调试时使 Excel 可见很有帮助。您始终可以在部署之前注释掉该行,但在调试期间这很好,因为在调试期间公开 COM 对象不如本机 .NET 对象有用——这样您就可以以本机形式查看它

我使用这些更改运行了您的代码版本,并且在更改命名范围“gv_epxsize”的单元格值时没有遇到任何问题。

string filePath = "C:\\Users\\ussatdafa\\Desktop\\Work\\Projects\\test.xlsx";
Microsoft.Office.Interop.Excel.Application excelApp =
    new Microsoft.Office.Interop.Excel.Application();

if (excelApp == null)
{
    MessageBox.Show("Excel has not been properly installed");
}
else
{
    excelApp.Visible = true;
    Workbook wb = excelApp.Workbooks.Open(filePath, 0, false, 5, "", "", false,
        XlPlatform.xlWindows, "", true, false, 0, true, false, false);
    Worksheet ws = wb.Sheets[1];

    wb.Names.Item("gv_epxsize").RefersToRange.Value = "101";
}
Run Code Online (Sandbox Code Playgroud)

这对我来说完美无缺。这是证明:

在此处输入图片说明

所以这让我想到了几种可能性:

(Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);
Run Code Online (Sandbox Code Playgroud)

不是你想的那样。或者,它与我使用的不同,它是:

Worksheet ws = wb.Sheets[1];
Run Code Online (Sandbox Code Playgroud)

这将返回第一个工作表(新工作簿上的“Sheet1”)。

当然,打开两个 Excel 可能会导致问题。