所以我有以下代码。如果我注释掉它的行就可以了,但是一旦我取消注释,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);
}
答案 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。
//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工作。