C#Excel强制ReadOnly没有Edit Priveledges

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

问题是,我的代码不断使文件只读,所以它不会写入string“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"; } 

我真的不知道发生了什么,但我有两个意见:

  1. 你打开Excel两次 – 这似乎是确定的。 一个是xlApp ,另一个是excelApp 。 如果你打开你的任务pipe理器的Excel实例化我很确定你会发现两个Excel运行的实例。 我不知道这是否有助于你的问题
  2. debugging时,我总是发现它很有用,使Excel可见。 你可以在部署之前总是注释掉这条线,但是在debugging过程中它是很好的,因为在debugging过程中公开COM对象并不像本机.NET对象那样有用 – 这样你可以看到它的本地forms

我用这些更改运行了代码的一个版本,并且没有更改命名范围“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"; } 

这对我来说完美无瑕。 这是certificate:

在这里输入图像说明

所以这导致了几种可能性:

 (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1); 

不是你所想的那样。 或者,也许和我用过的不一样,那就是:

 Worksheet ws = wb.Sheets[1]; 

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

当然,有两个Excels可能会导致问题。

我很确定你的问题是在你的代码中的WHERE保存文件。 从你发布的代码中,有一件事实际上并不能解决你的问题。 看看下面的代码片段:

 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"; } 

这是if (xlApp == null)语句的else部分。 首先在这个部分中,创build一个名为excelApp的新Excel应用程序:

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

为什么你这样做是未知的,因为你已经创build了一个名为xlApp 。 但是这还是可以的。 您可以打开多个Excel应用程序。

然后打开文件并进行更改:

 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"; 

使用filePath打开一个工作簿并调用woorkbook wb 。 然后抓住wb的第一个工作表并将其分配给工作表variablesws 。 请记住,在这个else子句中打开工作簿。 对工作簿进行更改,然后退出else子句。 所有似乎都OK除了…因为我们已经退出else子句… excelAppwbswbwsvariableswbs存在。 即使您试图保存或closures此else子句之外的文件,您也无法引用它,因为您在else子句中创build了这些variables。

既然你不能创build一个名为wb的新variables,如果它已经存在的话……那么清楚的是,工作簿wb永远不会被保存或closures。

我把下面几行INSIDE语句放到else子句中,即使程序正在运行也能正确的打开这个文件。 很明显你可能会在代码的某个地方保存和closures文件,但是这不是你在这个else子句中打开的文件。

 else { 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"; wb.Save(); wb.Close(); excelApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); } 

希望这是有道理的。