我想在我的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;
答案 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子句。