打开Excel文件时不断提示“只读”

3

我想在我的C#应用程序中打开现有的Excel文件(xls),并向特定的列写入内容,但每次打开文件时都会提示只能读取,有什么办法可以保存更改吗?

以下是我的当前代码:

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

string myPath = txtPath.Text.ToString();

excelApp.Workbooks.Open(myPath);

excelApp.Cells[8, 3] = txtSum1.Text.ToString();
excelApp.Cells[8, 4] = txtId1.Text.ToString();
excelApp.Visible = true;

需要更多信息。这个文件是否保存在网络共享上?除了“MyDocuments”之外的任何地方?在Excel中,单击“开始”=>“选项”,然后单击“安全中心”。在设置中,请确保文件的位置是受信任的位置。这有帮助吗? - LocEngineer
它保存在C盘上,因此文件位置可能不是问题。 - HyperX
如果您手动在Excel中打开它会怎样?也是只读的吗?关闭Excel,在TaskManager中检查是否有多余的Excel进程在运行,如果有则结束它。然后再尝试。 - LocEngineer
好的,我发现后台有大约10个Excel进程,似乎它总是打开一个新的进程而不关闭...我应该怎么做才能不这样? - HyperX
如果这被证明是解决方案,我会在 OP 或 @LocEngineer 发布他们的解决方案后删除我的答案。 - Just Do It
1
如果你只是想写入Excel文件,那么你不应该使用Interop类,而应该使用由Microsoft提供的Office Open XML SDK。这个库专门设计用于读写所有Microsoft Office文档格式。 - Scott Chamberlain
2个回答

1

多个工作簿被打开,无法覆盖之前的一个。因此,关闭一个实例并打开下一个实例即可解决问题。

 Microsoft.Office.Interop.Excel.Application excelApp = new 
 Microsoft.Office.Interop.Excel.Application();
 string myPath = txtPath.Text.ToString();

 excelApp.Workbooks.Open(myPath, 0, false, 5, "", "", false,  
 Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "",
            true, false, 0, true, false, false);
 excelApp.Cells[8, 3] = txtSum1.Text.ToString();
 excelApp.Cells[8, 4] = txtId1.Text.ToString();

excelApp.ActiveWorkbook.Save();
excelApp.Workbooks.Close();
excelApp.Quit();

我应该怎么做?我正在检查,如果在结尾处调用excelApp.Workbooks.Close();,仍然会打开新的实例。 - HyperX
移除 excelApp.Visible = true; 并以编程方式保存并关闭工作簿。 - Sudipta Kumar Maiti

0

你的问题出在这里:

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

这行代码一旦执行,就会启动一个新的Excel进程。现在,如果您调试并逐步执行代码,并决定“哦,嘿,在这里我得做点别的事情”,然后点击停止按钮 - 您的Excel应用程序不会神奇地消失,而是保持打开状态!如果您在此行之后点击停止按钮,则...

excelApp.Workbooks.Open(myPath);

然后您的文件将被该进程锁定。

改为执行以下操作:

using Excel=Microsoft.Office.Interop.Excel

var excelApp = (Excel.Application) System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
if(excelApp==null)
  excelApp = new Excel.Application();

这应该能帮助你将其保持在至少运行1个Excel进程。

还有

Excel.Workbook wb;
try
{
  wb = excelApp.Workbooks[System.IO.Path.GetFileName(myPath)];
}
catch
{
  wb = excelApp.Workbooks.Open(myPath);
}

关于最后一部分我不太确定。我不确定通过名称引用不存在的工作簿会返回错误还是空值。如果它返回空值,只需检查 if(wb == null) 而不是 catch 子句。

祝您好运!


1
如果我没记错的话,OP也可以只使用excelApp.Quit(); - Just Do It
1
是的,但是 excelApp.Visible = true; 这一行让我认为他不想要那个。当然还是正确的。 - LocEngineer
1
同意,只是想要帮忙。 - Just Do It
1
在C#中使用Excel Interop不是写入Excel文件的“正确”方式。 - Aron
1
@LocEngineer OP应该使用由Microsoft提供的Open XML SDK for Office,而不是使用Office互操作性。这个库专门用于读写所有Microsoft Office文档格式。 - Scott Chamberlain
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接