【问题标题】:Index was out of range error while exporting to Excel导出到 Excel 时索引超出范围错误
【发布时间】:2019-04-12 16:39:48
【问题描述】:

我正在尝试使用以下代码将数据从 c# 导出到 excel:

enter  worksheet = workbook.ActiveSheet;
worksheet.Name = "ExportedFromDatGrid";

//Loop through each row and read value from each column. 
for (int i = 0; i < dataGridView1.Rows.Count + 1; i++)
{
    worksheet.Cells[1, i] = dataGridView1.Columns[i - 1].HeaderText;
}

for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    for (int j = 0; j < dataGridView1.Columns.Count - 1; j++)
    {
        // Excel index starts from 1,1. As first Row would have the Column headers, 
        // adding a condition check. 

        worksheet.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
    }
}

我收到以下错误:

索引超出范围。必须为非负数且小于集合的大小。参数名称:索引。

更新我通过更改这个 for 语句解决了这个问题:

for ( int i = -1; i < DataGridView1.Columns.Count; i++)

【问题讨论】:

  • dataGridView1.Rows.Count 代替dataGridView1.Rows.Count + 1 怎么样
  • 嗯,是的,您对i 的限制非常可疑。如果您更仔细地格式化代码,显示错误所在,并告诉我们您在调试时观察到的情况,将会有所帮助。

标签: c# excel export-to-excel


【解决方案1】:

我认为问题在于,许多在线指南和教程都解释说,当您计算 Lists&lt;&gt;Arraysrows/columnsTable 时,您需要添加 +1,因为所有这些对象容器都有一个开始索引为 0。

作为一个新手,一开始可能很难弄清楚你必须在哪里放置 +1,尤其是在你必须这样做的时候。也许您感到困惑,因为您希望将总行数作为i 的最大定义。但是,当您使用int i = 0 开始循环时(这是正确的,因为您不想跳过索引为 0 的行),您也从点 0 而不是 1 开始。所以不需要添加 +1最大断点,因为您仍然会通过行进行dataGridView1.Rows.Count 次(


这个异常Index was out of range 告诉您您想要对超出范围的行执行某些操作。它超出了范围,因为该行的项目不存在。假设您有 10 行,索引为 0 - 9。现在您从 0 开始遍历它们。因此在执行 10 次后,您遍历了第 0 - 9 行。dataGridView1.Rows.Count 为您提供总行数,在此示例中为 10。但是您将断点设置为 dataGridView1.Rows.Count + 1,因此循环希望第 11 次使用索引为 10 的行执行您的任务,但最后一行的索引为 9。所以它不能找到这一行,这就是它给你Index out of range execption 的情况。现在我希望你明白出了什么问题以及为什么。

【讨论】:

    【解决方案2】:

    试试:

    sheet.GetRow(rowNumber).CreateCell(columnNumber);
    

    然后填充单元格值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      相关资源
      最近更新 更多