【问题标题】:Excel does not closeExcel 不关闭
【发布时间】:2021-11-24 05:59:11
【问题描述】:

我的问题是我有一个从 Excel 工作表 .xlsb 读取数据的程序,但是当 Excel 文件打开时,它会要求我保存。为什么?

 async Task<bool> ReadVariable()
        {
            bool succeeded = false;
            while (!succeeded)
            {
                
                //open file excel using microsoft dll
                Excel.Application app = new Excel.Application();
                

                //open workbook
                Workbook wk = app.Workbooks.Open(excelpath, ReadOnly : true);
                //get first sheet
                Worksheet sh = wk.Worksheets[1];
                //get cell
                // Cells[unten/rechts] Example: [1,2] = B1 
                var day1tag = sh.Cells[27, 2].Value.ToString();
                exceltest1.Text = day1tag;
              
                var day1früh = sh.Cells[26, 2].Value.ToString();
                Day24oee24.Text = day1früh;


               
                app.DisplayAlerts = false;
                wk.Close(SaveChanges : false);
                app.Quit();

                await Task.Delay(15000);
                //await Task.Delay(108000000);
            }
            return succeeded;
        }

【问题讨论】:

  • 在我的小测试中,使用发布的代码,我从来没有得到提示 “要求我保存。” ...你确定这是重现的代码你的主张?此外,发布的代码是一个“无限循环”,因为succeeded 从未设置为true。请edit您的问题并提供重现您的问题的代码。抱歉,如果我遗漏了什么。我建议您仔细阅读 SO tour 部分,因为它显示了 SO 的工作原理。 How to Ask 部分可能会有所帮助。此外,您可能会发现 SO Asking 部分很有用。

标签: c# excel


【解决方案1】:

[除了@JohnG]

首先,您应该将app.Quit(); 命令行放在while 循环之外,然后执行您的算法,然后使用此代码保存您的工作簿;

xlWorkbook.SaveAs(saveFileDialog1.FileName + ".xlsx", Excel.XlFileFormat.xlWorkbookDefault, null, null, null, null, Excel.XlSaveAsAccessMode.xlExclusive, null, null, null, null, null);

然后使用

app.Quit();

另外; 毕竟进程僵尸excel会显示在你的任务管理器上来解决,我推荐如下;

导入;

using System.Diagnostics;

杀僵尸excel使用此功能;

private void KillSpecificExcelFileProcess(string excelFileName)
{
    var processes = from p in Process.GetProcessesByName("EXCEL")
                    select p;

    foreach (var process in processes)
    {
        if (process.MainWindowTitle == excelFileName)
            process.Kill();
    }
}

并调用如下函数; (Interop excel 是无名的,因为我们应该使用 ("")。

KillSpecificExcelFileProcess("");

【讨论】:

  • 感谢您的 KillSpecificExcelFileProcess("");这很棒:)
  • 但你理解错了,我不想保存,我不想让他再叫我保存
  • 那么你不应该使用wk.Close();app.Quit(); 命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多