救命!! Excel进程使用Interop保持runnung导出excel [英] Help!! Excel process keep runnung export excel with Interop

查看:72
本文介绍了救命!! Excel进程使用Interop保持runnung导出excel的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
Microsoft.Office.Interop.Excel._Worksheet worksheet1 = null;
//Microsoft.Office.Interop.Excel._Worksheet worksheet2 = null;
app.Visible = true;
worksheet1 = workbook.Sheets["Sheet1"];
worksheet1 = workbook.ActiveSheet;
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(worksheet1);

worksheet1.Cells[1, 1] = "รางงานการจัดการโครงการโดยการใช้ Program evaluation and review technique";
worksheet1.Cells[3, 2] = "ตารางแสดงค่าต่างๆของกิจกรรมแต่ละตัวในโครงการนี้";
Excel.Range Chartrange = Chartrange = worksheet1.get_Range("A1", "A1"); ;
Chartrange.Font.Bold = true;
GC.Collect();
Marshal.ReleaseComObject(Chartrange);
//GC.Collect();



for (int i = 1; i < 7 + 1; i++)
{
    worksheet1.Cells[5, i] = dataGridView1.Columns[i - 1].HeaderText;
    Excel.Range kk = worksheet1.get_Range("A5","G5");
    Excel.Borders borders = kk.Borders;
    borders.LineStyle = Excel.XlLineStyle.xlContinuous;
    borders.Weight = 3d;
    GC.Collect();
    Marshal.ReleaseComObject(borders);
    Marshal.ReleaseComObject(kk);

}
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
    for (int j = 0; j < 7; j++)
    {
        int excel_cell = dataGridView1.Rows.Count - 1 + 5;
        if (dataGridView1.Rows[i].Cells[j].Value != null)
        {
            int k = i + 6;
            worksheet1.Cells[i + 6, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
            Excel.Range kk = worksheet1.get_Range("A" + k, "G" + k);
            Excel.Borders borders = kk.Borders;
            borders.LineStyle = Excel.XlLineStyle.xlContinuous;
            borders.Weight = 3d;
            GC.Collect();
            Marshal.ReleaseComObject(borders);
            Marshal.ReleaseComObject(kk);
            //GC.Collect();
            //GC.WaitForPendingFinalizers();
        }
        else
        {
            worksheet1.Cells[i + 2, j + 1] = "";
        }
    }
}





任何人都知道如何杀死进程EXCEL。 EXE它关闭所有东西时继续运行:(

i尝试了许多像Marshel.releaseComObject(工作表1)

app = null;请帮助

Thax为您解答



anyone know how to kill process EXCEL.EXE it keep running when i close everything :(
i have try many thing like Marshel.releaseComObject(worksheet1)
app = null; help please
Thax for you answer

推荐答案

您需要在修改资源后关闭并释放资源。

您需要使用try finally block和最后阻止调用app.Quit()方法。



You need to close and release the resources after modifying it.
you need to use try finally block and in finally block call app.Quit() method.

public void ExcelMethod()
        {
            Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
            Microsoft.Office.Interop.Excel._Worksheet worksheet1 = null;
 
            try
            {
                //Microsoft.Office.Interop.Excel._Worksheet worksheet2 = null;
                app.Visible = true;
                worksheet1 = workbook.Sheets["Sheet1"];
                worksheet1 = workbook.ActiveSheet;
                Marshal.ReleaseComObject(workbook);
                Marshal.ReleaseComObject(worksheet1);
 
                worksheet1.Cells[1, 1] = "รางงานการจัดการโครงการโดยการใช้ Program evaluation and review technique";
                worksheet1.Cells[3, 2] = "ตารางแสดงค่าต่างๆของกิจกรรมแต่ละตัวในโครงการนี้";
                Microsoft.Office.Interop.Excel.Range Chartrange = Chartrange = worksheet1.get_Range("A1", "A1");
                ;
                Chartrange.Font.Bold = true;
                GC.Collect();
                Marshal.ReleaseComObject(Chartrange);
                //GC.Collect();

 

                for (int i = 1; i < 7 + 1; i++)
                {
                    worksheet1.Cells[5, i] = dataGridView1.Columns[i - 1].HeaderText;
                    Microsoft.Office.Interop.Excel.Range kk = worksheet1.get_Range("A5", "G5");
                    Microsoft.Office.Interop.Excel.Borders borders = kk.Borders;
                    borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                    borders.Weight = 3d;
                    GC.Collect();
                    Marshal.ReleaseComObject(borders);
                    Marshal.ReleaseComObject(kk);
 
                }
                for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
                {
                    for (int j = 0; j < 7; j++)
                    {
                        int excel_cell = dataGridView1.Rows.Count - 1 + 5;
                        if (dataGridView1.Rows[i].Cells[j].Value != null)
                        {
                            int k = i + 6;
                            worksheet1.Cells[i + 6, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
                            Microsoft.Office.Interop.Excel.Range kk = worksheet1.get_Range("A" + k, "G" + k);
                            Microsoft.Office.Interop.Excel.Borders borders = kk.Borders;
                            borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                            borders.Weight = 3d;
                            GC.Collect();
                            Marshal.ReleaseComObject(borders);
                            Marshal.ReleaseComObject(kk);
                            //GC.Collect();
                            //GC.WaitForPendingFinalizers();
                        }
                        else
                        {
                            worksheet1.Cells[i + 2, j + 1] = "";
                        }
                    }
                }
            }
            finally
            {
                releaseObject(workbook);
                releaseObject(worksheet1);
 
                if (app != null)
                {
                    app.Quit();
 
                }
                releaseObject(app);
            }
        }
 
        private void releaseObject(object obj)
        {
            if (obj != null && Marshal.IsComObject(obj))
            {
                Marshal.ReleaseComObject(obj);
            }
            obj = null;
        }

[Agent_Spock]

- 添加了缺少的代码括号

[Jafarinejajadvazifehkhorani]

-I为这个问题增加了一个我不能做的解决方案,我应该更新当前的答案。

[Agent_Spock]
- Added missing code brackets
[Jafarinejajadvazifehkhorani]
-I added one more solution to this question that I mustn't have done it, I should have updated the current answer.


为了释放excel对象,你需要关闭工作簿对象,退出应用程序对象并在创建excel文件时释放我们的每个com对象。





请参考链接



使用Interop后发布Excel [ ^ ]
In order to release excel object you need to close workbook object , quit application object and release each com object that us while creating excel file.


please refer link

Releasing Excel after using Interop[^]


Pease尝试此代码它会释放所有内容



Pease Try this Code it releases everything

public void ExcelMethod()
       {
           Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
           Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
           Microsoft.Office.Interop.Excel._Worksheet worksheet1 = null;

           try
           {
               //Microsoft.Office.Interop.Excel._Worksheet worksheet2 = null;
               app.Visible = true;
               worksheet1 = workbook.Sheets["Sheet1"];
               worksheet1 = workbook.ActiveSheet;
               Marshal.ReleaseComObject(workbook);
               Marshal.ReleaseComObject(worksheet1);

               worksheet1.Cells[1, 1] = "รางงานการจัดการโครงการโดยการใช้ Program evaluation and review technique";
               worksheet1.Cells[3, 2] = "ตารางแสดงค่าต่างๆของกิจกรรมแต่ละตัวในโครงการนี้";
               Microsoft.Office.Interop.Excel.Range Chartrange = Chartrange = worksheet1.get_Range("A1", "A1");
               ;
               Chartrange.Font.Bold = true;
               GC.Collect();
               Marshal.ReleaseComObject(Chartrange);
               //GC.Collect();



               for (int i = 1; i < 7 + 1; i++)
               {
                   worksheet1.Cells[5, i] = dataGridView1.Columns[i - 1].HeaderText;
                   Microsoft.Office.Interop.Excel.Range kk = worksheet1.get_Range("A5", "G5");
                   Microsoft.Office.Interop.Excel.Borders borders = kk.Borders;
                   borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                   borders.Weight = 3d;
                   GC.Collect();
                   Marshal.ReleaseComObject(borders);
                   Marshal.ReleaseComObject(kk);

               }
               for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
               {
                   for (int j = 0; j < 7; j++)
                   {
                       int excel_cell = dataGridView1.Rows.Count - 1 + 5;
                       if (dataGridView1.Rows[i].Cells[j].Value != null)
                       {
                           int k = i + 6;
                           worksheet1.Cells[i + 6, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
                           Microsoft.Office.Interop.Excel.Range kk = worksheet1.get_Range("A" + k, "G" + k);
                           Microsoft.Office.Interop.Excel.Borders borders = kk.Borders;
                           borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                           borders.Weight = 3d;
                           GC.Collect();
                           Marshal.ReleaseComObject(borders);
                           Marshal.ReleaseComObject(kk);
                           //GC.Collect();
                           //GC.WaitForPendingFinalizers();
                       }
                       else
                       {
                           worksheet1.Cells[i + 2, j + 1] = "";
                       }
                   }
               }
           }
           finally
           {
               releaseObject(workbook);
               releaseObject(worksheet1);

               if (app != null)
               {
                   app.Quit();

               }
               releaseObject(app);
           }
       }

       private void releaseObject(object obj)
       {
           if (obj != null && Marshal.IsComObject(obj))
           {
               Marshal.ReleaseComObject(obj);
           }
           obj = null;
       }


这篇关于救命!! Excel进程使用Interop保持runnung导出excel的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆