C#Application.Excel.Quit由于1行代码而无法正常工作

时间:2016-05-17 21:02:23

标签: c# excel

所以我有以下代码。如果我注释掉它的行就可以了,但是一旦我取消注释,Excel就不会正常关闭。

我不确定下一步该尝试什么。我远离2点问题并试图坚持1点。但现在我不确定现在该做什么。

代码中的dt是我正在填充的DataTable。

Excel.Application app = null;
        Excel.Workbooks books = null;
        Excel.Workbook book = null;
        Excel.Sheets sheets = null;
        Excel.Worksheet sheet = null;
        Excel.Range range = null;

        try
        {
            app = new Excel.Application();
            books = app.Workbooks;
            book = books.Open(FilePath);
            sheets = book.Sheets;
            sheet = book.ActiveSheet;

            int rcount = 45;
            UpdateProgressBarMaxMethod(pbAssets, rcount);

            int i = 0;

            for (; i < rcount; i++)
            {
                //Comment out the below line and it works fine
                dt.Rows.Add(sheet.Cells[i + 1, 1].Value, 
                    sheet.Cells[i + 1, 2].Value, 
                    sheet.Cells[i + 1, 3].Value, 
                    sheet.Cells[i + 1, 4].Value, 
                    sheet.Cells[i + 1, 5].Value, 
                    sheet.Cells[i + 1, 6].Value, 
                    sheet.Cells[i + 1, 7].Value, 
                    sheet.Cells[i + 1, 8].Value, 
                    sheet.Cells[i + 1, 9].Value);

                UpdateProgressBarMethod(pbAssets, i);
            }
            UpdateProgressBarMethod(pbAssets, 0);
            book.Close();
            app.Quit();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
        }
        finally
        {
            if (range != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
            if (sheet != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
            if (sheets != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets);
            if (book != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
            if (books != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(books);
            if (app != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
        }

2 个答案:

答案 0 :(得分:2)

你实际上并没有遵循两点规则。 sheet.Cells[i + 1, 2].Value - 这是两个点。它创建了对Range对象(单元格)的引用。

显然,为每个单元创建和清理Range对象是一件痛苦的事。 This link显示了如何创建一个 Range并将值读入数组。

另一个选择是根本不使用Excel.Interop,因为处理所有这些COM对象的巨大痛苦。

Here's a link使用EPPlus的一些代码,它们将在没有COM对象的情况下执行相同的操作。关于使用命名范围也有一些建议,这样您就不必处理所有这些行和列号。

答案 1 :(得分:0)

Essential XlsIO可以将数据从Excel导入Datable。

Example code

//The first worksheet object in the worksheets collection is accessed.
IWorksheet sheet = workbook.Worksheets[0];
//Get as DataTable
DataTable datatable = sheet.ExportDataTable(sheet.UsedRange, ExcelExportDataTableOptions.ColumnNames);
//Upload to dataset
DataSet ds = new DataSet();
ds.Tables.Add(datatable);

如果符合条件(收入少于100万美元),可通过community license计划免费提供整套控件(商业应用程序)。社区许可是完整的产品,没有任何限制或水印。

注意:我为Syncfusion工作。