打开Excel文件会提示“只读”

时间:2015-11-10 17:09:16

标签: c# excel office-interop

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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);
}

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

祝你好运!