【问题标题】:ReleaseObject Error while exporting into Excel导出到 Excel 时 ReleaseObject 错误
【发布时间】:2014-07-18 13:33:38
【问题描述】:

我在 WPF 中有一个 treeView。现在根据我的要求,我想将它导出到 excel 中。我在堆栈溢出中有一个代码 LINK

这是我在 c# 中的代码 sn-p..

 private void button1_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog browse = new OpenFileDialog();
        browse.Filter = "Excel Worksheets|*.xls";
        if (browse.ShowDialog() == true)
        {
            Microsoft.Office.Interop.Excel.Application xlApp;
            Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
            Microsoft.Office.Interop.Excel.Range range;

            string str;
            int rCnt = 0;
            int cCnt = 0;

            xlApp = new Microsoft.Office.Interop.Excel.Application();
            xlWorkBook = xlApp.Workbooks.Open(browse.FileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            range = xlWorkSheet.UsedRange;

            TreeViewItem father = new TreeViewItem();

            for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++)
            {
                for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
                {

                    str = (string)(range.Cells[rCnt, cCnt] as Microsoft.Office.Interop.Excel.Range).Value2;
                    if (str != null)
                    {
                        father = new TreeViewItem();
                        father.Header = str;
                        GetChilds(father, cCnt + 1, rCnt, range);
                        treeView_items.Items.Add(father);

                    }

                } break;
            }


            xlWorkBook.Close(true, null, null);
            xlApp.Quit();



            releaseObject(xlWorkSheet);
            releaseObject(xlWorkBook);
            releaseObject(xlApp);
        }
    }

    private void GetChilds(TreeViewItem father, int cCnt, int rCnt, Microsoft.Office.Interop.Excel.Range range)
    {
        int col = cCnt;
        int row = rCnt;
        TreeViewItem child = new TreeViewItem();
        for (; col <= range.Columns.Count; col++)
        {
            for (; row <= range.Rows.Count; row++)
            {
                string str = (string)(range.Cells[row, col] as Microsoft.Office.Interop.Excel.Range).Value2;
                if (str != null)
                {
                    child = new TreeViewItem();
                    child.Header = str;
                    GetChilds(child, col + 1, row, range);
                    father.Items.Add(child);
                }
            } break;
        }

    }
}

}

现在在上面的代码 sn-p 我不知道如何添加 ..

treeView_items.Items.Add(father);

我也无法为 Excel 释放对象,并为这些行提供错误..

releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);

请帮助我。在此先感谢..

【问题讨论】:

  • 你实现了releaseObject方法吗?
  • 这些行出现错误。请告诉我如何实施?
  • @DhavalPatel Sir 如何删除这个 treeView_items.Items.Add(father);问题先生

标签: c# wpf excel treeview


【解决方案1】:

您必须以正确的顺序释放 COM 对象。我的ExcelManager 类中有一个辅助方法:

    private void ReleaseComObjects(bool isQuitting)
    {
        try
        {
            if (isQuitting)
            {
                workbook.Close(false, missing, missing); 
                excelApplication.Quit();
            }
            Marshal.ReleaseComObject(workbooks);
            Marshal.ReleaseComObject(workbook);
            if (worksheets != null) Marshal.ReleaseComObject(worksheets);
            Marshal.ReleaseComObject(worksheet);
            Marshal.ReleaseComObject(excelApplication);
            workbook = null;
            worksheets = null;
            worksheet = null;
            excelApplication = null;
        }
        catch { }
        finally { GC.Collect(); }
    }

您可以选择删除代码的isQuitting 部分。

【讨论】:

  • 非常感谢您的解决方案。您能指出如何解决此问题吗..treeView_items.Items.Add(father);
  • 我不知道你指的是什么问题,你想要做什么以及问题是什么......我不是读心术。另外,为什么要复制您不理解的代码,甚至不知道它是否有效?您从问题中复制了它,甚至从答案中都没有……这绝对是疯狂的。问题作者发布它是因为他们有问题而您复制了它?此问题现已得到解答,因此我建议您提出与您的其他问题相关的新问题,并提供尽可能多的相关信息。
  • 非常感谢!指导我。我也会这样做。实际上我的 wpf 窗口中有一个树视图。现在我希望将该树视图导出到 excel 中,但没有办法做到这一点。
  • 在 WPF 中,我们将属性数据绑定到 UI 控件,因此在您的情况下,您应该将集合属性数据绑定到 TreeViewItem.ItemsSource 属性,如果您这样做了,那么您需要做的就是是遍历该集合并直接从中填充您的 Excel 数据。当您学习如何正确编码并且不复制无效代码时,这很容易。在您返回此网站之前,您真的需要阅读 MSDN 上的Data Binding Overview‎ 页面。
猜你喜欢
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多