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"; }
我真的不知道发生了什么,但我有两个意见:
- 你打开Excel两次 – 这似乎是确定的。 一个是
xlApp
,另一个是excelApp
。 如果你打开你的任务pipe理器的Excel实例化我很确定你会发现两个Excel运行的实例。 我不知道这是否有助于你的问题 - 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
子句… excelApp
, wbs
, wb
和ws
variableswbs
存在。 即使您试图保存或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); }
希望这是有道理的。