我正在编写一个必须将值写入Excel电子表格中的单元格的应用程序。我可以打开工作簿,但它始终以只读模式打开。我的代码是
myExcelApp = new Excel.ApplicationClass();
myExcelApp.Visible = false;
Excel.Workbook myExcelWorkbooks = myExcelApp.Workbooks.Open(fileName, misValue, **false**, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
第三个参数是只读的,我将其指定为false。但myExcelWorkbooks.readOnly
仅显示True
。
有人可以帮我解决这个问题吗?
答案 0 :(得分:11)
如果您使用的是C#4或以上版本,请执行以下操作:
var myExcelApp = new Excel.Application()
{
Visible=false
};
Excel.Workbook myExcelWorkbooks = myExcelApp.Workbooks.Open(Filename: @"F:\oo\bar.xlsx", ReadOnly: false);
完成后,请确保执行此操作:
myExcelWorkbooks.Save();
myExcelWorkbooks.Close();
myExcelApp.Quit();
Marshal.ReleaseComObject(myExcelApp);
如果您还没有进行第二部分,请打开任务管理器并终止EXCEL.EXE的每个实例(或重新启动您的计算机),然后再次尝试第一部分。
如果Excel文件被另一个进程锁定,Excel将始终以只读模式打开工作簿。如果你一直在搞乱互操作,而不是之后杀死Excel过程,这可以解释你所看到的行为。因此,您的代码和UAC设置可能没问题,因此在进一步更改代码或使用UAC进行操作之前,我将删除所有运行的Excel实例。
答案 1 :(得分:0)
UAC可能会以某种方式干扰它。尝试以管理员身份启动您的应用程序或Visual Studio(从上下文菜单中)
答案 2 :(得分:0)
尝试使用OpenXml,在codeplex上有一个简单迭代的包装器。
答案 3 :(得分:0)
xl = new Excel.Application();
Excel.Workbooks books = xl.Workbooks;
Excel.Workbook book = books.Open(filepath);
这对我来说总是有效,默认情况下它是不可见的,并且可以读/写。您应该使用Excel.Application()
而不是Excel.ApplicationClass()
,但我怀疑这是您的问题的路径(我也找不到我读到的文章,我害怕)。还要注意我如何拆分声明工作簿和工作簿对象,再次显然是best practice,否则您启动的进程将不会总是关闭。
答案 4 :(得分:-1)
我使用Interop.excel做了一个大型项目。 陷阱是可怕的,当你开始做更高级的功能或处理大型数据集时,它是非常慢的。
试用OpenXML / ClosedXML,这将使您的生活更轻松,您的程序架构更具可扩展性。