Процесс Excel выполняется в фоновом режиме, используя C# - PullRequest
0 голосов
/ 13 марта 2020

Цель:

  • Скопируйте указанный c лист из рабочей книги и вставьте его в новый файл Excel. (Готово)

  • Правильно закройте программу Excel, чтобы процесс не отображался в диспетчере задач. (Не выполнено) - Основной выпуск

Код:

public Excel.Application excelApp = null;
public Excel.Workbooks workbooks = null;
public Excel.Workbook target = null;

private void button1_Click(object sender, EventArgs e)
{
    //Excel Application
    excelApp = new Excel.Application();
    //Excel Workbooks
    workbooks = excelApp.Workbooks;
    //Excel Workbook
    target = workbooks.Add(@"C:\Users\LV98\Desktop\Test C#\test.xlsx");
    //Excel all sheets from Workbook
    Excel.Sheets sheets = target.Worksheets;
    //Get specific sheet name
    Excel.Worksheet workingSheet = (Excel.Worksheet)sheets.get_Item("Sheet2");
    //New book
    var newbook = excelApp.Workbooks.Add(1);
    //Copy selected sheet to new book
    workingSheet.Copy(newbook.Sheets[1]);

    newbook.SaveAs(@"C:\Users\LV98\Desktop\Test C#\template.xlsx");
    newbook.Close(0);

    target.Close();

    excelApp.Quit();
}

Подробности:

Работает как надо. Но исходный файл мы скопировали с листа. Процесс Excel все еще выполняется.

enter image description here

Это означает, что файл заблокирован для редактирования.

Что я пробовал :

public Excel.Application excelApp = null;
public Excel.Workbooks workbooks = null;
public Excel.Workbook target = null;

private void button1_Click(object sender, EventArgs e)
{
    //Excel Application
    excelApp = new Excel.Application();
    //Excel Workbooks
    workbooks = excelApp.Workbooks;
    //Excel Workbook
    target = workbooks.Add(@"C:\Users\LV98\Desktop\Test C#\test.xlsx");
    //Excel all sheets from Workbook
    Excel.Sheets sheets = target.Worksheets;
    //Get specific sheet name
    Excel.Worksheet workingSheet = (Excel.Worksheet)sheets.get_Item("Sheet2");
    //New book
    var newbook = excelApp.Workbooks.Add(1);
    //Copy selected sheet to new book
    workingSheet.Copy(newbook.Sheets[1]);

    newbook.SaveAs(@"C:\Users\LV98\Desktop\Test C#\template.xlsx");
    newbook.Close(0);

    target.Close();

System.Runtime.InteropServices.Marshal.ReleaseComObject(workingSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(newbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(target);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);   
}

Подробности:

Получил это здесь: { ссылка }

Это все еще делает не работа. Работает точно так же, как 1-й код, и процесс EXCEL.exe все еще выполняется.

Вопрос:

Почему он все еще выполняется как процесс? И как я могу это исправить?

1 Ответ

0 голосов
/ 13 марта 2020

Мне удалось найти одно решение для этого. Который должен просто убить процесс.

Получил его отсюда: https://social.msdn.microsoft.com/Forums/vstudio/en-US/d438c273-6876-4d2b-9f25-842838bce0b4/excel-is-still-running-though-i-quit-and-released-the-object?forum=vsto

Вот полностью рабочий код:

public Excel.Application excelApp = null;
public Excel.Workbooks workbooks = null;
public Excel.Workbook target = null;

private void button1_Click(object sender, EventArgs e)
{
    //Excel Application
    excelApp = new Excel.Application();
    //Excel Workbooks
    workbooks = excelApp.Workbooks;
    //Excel Workbook
    target = workbooks.Add(@"C:\Users\LV98\Desktop\Test C#\test.xlsx");
    //Excel all sheets from Workbook
    Excel.Sheets sheets = target.Worksheets;
    //Get specific sheet name
    Excel.Worksheet workingSheet = (Excel.Worksheet)sheets.get_Item("Sheet2");
    //New book
    var newbook = excelApp.Workbooks.Add(1);
    //Copy selected sheet to new book
    workingSheet.Copy(newbook.Sheets[1]);

    newbook.SaveAs(@"C:\Users\LV98\Desktop\Test C#\template.xlsx");
    newbook.Close(0);

    target.Close();

    excelApp.Quit();

    killExcel();
}

        private void killExcel()
        {
            System.Diagnostics.Process[] PROC = System.Diagnostics.Process.GetProcessesByName("EXCEL");
            foreach (System.Diagnostics.Process PK in PROC)
            {
                if (PK.MainWindowTitle.Length == 0)
                {
                    PK.Kill();
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...