导出到Excel时索引超出范围错误

问题描述 投票:0回答:2

我正在尝试使用以下代码将数据从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();
    }
}

我收到以下错误:

指数超出范围。必须是非负数且小于集合的大小。参数名称:index。

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

for ( int i = -1; i < DataGridView1.Columns.Count; i++)
c# excel export-to-excel
2个回答
1
投票

我认为问题在于,许多在线指南和教程都表明,当你计算Lists<>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的情况。现在我希望你能理解出了什么问题以及原因。


0
投票

尝试:

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

然后填充单元格值。

© www.soinside.com 2019 - 2024. All rights reserved.