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

本文关键字:只读 提示 Excel 文件 打开 | 更新日期: 2023-09-27 18:21:28

我想打开我的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;

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

多个工作簿正在打开,无法覆盖前一个工作簿。所以关闭一个实例并打开下一个实例,它应该可以工作。

 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();

您的问题就在这里:

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

对最后一部分不太确定。我不确定按名称寻址不存在的工作簿是否会重新转换为错误或null。如果返回null,只需检查if(wb == null)而不是catch子句。

祝你好运!