我正在尝试使用以下代码将数据从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++)
我认为问题在于,许多在线指南和教程都表明,当你计算Lists<>
的Arrays
,rows/columns
和Table
时,你需要添加+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的情况。现在我希望你能理解出了什么问题以及原因。
尝试:
sheet.GetRow(rowNumber).CreateCell(columnNumber);
然后填充单元格值。