【问题标题】:System.OutOfMemoryException in foreach loop over worsheet rows工作表行的 foreach 循环中的 System.OutOfMemoryException
【发布时间】:2014-10-14 19:01:06
【问题描述】:

我正在尝试打开一个 excel 文件并将内容放入数据表中,以便在我的程序中进一步使用。程序收到主题标题中的错误。

private void ReadExcelToDataSet(string FileName,string Worksheet)
    {
        Microsoft.Office.Interop.Excel.Application xlApp;
        Microsoft.Office.Interop.Excel.Workbook xlWorkbook;
        Microsoft.Office.Interop.Excel.Worksheet xlWorksheet;

        xlApp = new Microsoft.Office.Interop.Excel.Application();
        xlWorkbook = xlApp.Workbooks.Open(FileName);
        xlWorksheet = xlWorkbook.Sheets[Worksheet];

        System.Data.DataTable ReadExcel = new System.Data.DataTable();
        Range UsedRange = xlWorksheet.UsedRange;

        foreach(Range row in xlWorksheet.Rows)
        {
            ReadExcel.Rows.Add(xlWorksheet.Rows.Value);
        }

        dataGridViewTest.DataSource = ReadExcel;
    }

程序失败上线:

ReadExcel.Rows.Add(xlWorksheet.Rows.Value);

工作表不是特别大,所有数据都是字符串或数字(没有图像或图表)。我假设尝试将 Excel 行添加到数据表行中存在根本性错误。使用 Interop 将 Excel 读取到数据表的正确方法是什么,或者我应该怎么做才能防止内存不足问题?提前感谢您的帮助。

【问题讨论】:

  • 您确定您的foreach 循环只读取非空行吗?你能在里面放一个计数器看看它有多大,或者调试一下看看xlWorksheet.Rows.Count的值是多少?
  • 我没有碰巧使用这些互操作工具,所以请原谅我的无知,但这是正常的,您不在循环中使用foreach 变量row,而是添加@ 987654327@?
  • Floremin 给我带来了一些有趣的信息。 xlWorksheet.Rows.Count 返回的行数等于 65536,这比实际使用的要多。奇怪的是,内存不足发生在 foreach 循环的第一次迭代中。我假设它可能还试图将最大数量的列放入数据表中。我一定是在阅读 excel 方面做错了。

标签: c# excel office-interop


【解决方案1】:
var ReadExcel = new System.Data.DataTable();
var UsedRange = xlWorksheet.UsedRange;
// Add a new column to the DataTable
var column = new DataColumn();
column.ColumnName = "rowValue";
ReadExcel.Columns.Add(column);

foreach (Range row in xlWorksheet.Rows)
{               
    var newrow = ReadExcel.NewRow();
    // Add row.Value NOT xlWorksheet.Rows.Value
    newrow["rowValue"] = row.Value;
    ReadExcel.Rows.Add(newrow);
}

基本上,您使用的是xlWorksheet.Rows.Value 而不是row.Value。但我猜你也想正确使用DataTable。有关示例,请参见此处:DataTable.NewRow Method 。我也用过implicit typing。对眼睛更容易。

【讨论】:

  • 这似乎可行。我的代码行是:dataGridViewTest.DataSource = ReadExcel;每行只放入信息System.Object[,],数据只有一列。这是预期的结果吗?
  • 我看不到dataGridViewTest 是什么。这取决于你如何看待它。
  • 您基本上会在dataGridViewTest.DataSource 中存储一个DataTable 对象。要阅读内容,您应该使用Rows 方法。
  • 如果没有理由使用DataTable(我以前没有使用过),你也可以使用List。使用起来更容易。您可能在这里有特定需求,我不知道,但 List 应该更容易。
  • 谢谢,我试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 2019-01-31
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
相关资源
最近更新 更多