我正在从excel导入数据到sqlserver..i已经用excel表中的数据填充了数据集...现在iam操纵数据集中的数据,比如从sheet中删除空行。我编写了这段代码来消除空行但是它向我显示一个错误,“18位没有排。”而且空行的数量是11.这是代码片段:
public DataSet GetExcelData()
{
DataTable ExcelTable = new DataTable();
List<int> rowToRemove = new List<int>();
//DataRow ExcelRow = new DataRow();
foreach (DataRow excelrow in dsExcel.Tables[0].Rows)
{
bool IsEmpty = false;
foreach (object item in excelrow.ItemArray)
{
if (String.IsNullOrEmpty(item.ToString()))
{
IsEmpty = true;
break;
}
else
{
IsEmpty = false;
}
}
if (IsEmpty)
{
**rowToRemove.Add((dsExcel.Tables[0].Rows.IndexOf(excelrow)));**
}
}
for (int i = 0; i < rowToRemove.Count; i++)
{
**dsExcel.Tables[0].Rows.RemoveAt(rowToRemove[i]);**
//dsExcel.Tables[0].Rows.Remove(rowNumber); ; ;
}
return dsExcel;
}
我在那边标记的线条我遇到了问题。没有采取适当的行。 我已经放置了一个断点,并且还检查了..以这种方式显示:
[0] 0
[1] 2
[2] 4
[3] 6
[4] 8
[5] 10
[6] 12
[7] 14
[8] 16
[9] 18
[10] 20
它正在计算从0位置开始的行...它根本不存在。并且它没有在22位置取空行。 请告诉我我需要做什么。
答案 0 :(得分:4)
只要从列表中删除了第一项,就会关闭以下所有索引。 您可能希望先删除最后一个:
for (int i = rowToRemove.Count - 1; i >= 0; --i)
{
dsExcel.Tables[0].Rows.RemoveAt(rowToRemove[i]);
}
答案 1 :(得分:0)
我认为这里的循环是问题
for (int i = 0; i < rowToRemove.Count; i++)
{
**dsExcel.Tables[0].Rows.RemoveAt(rowToRemove[i]);**
//dsExcel.Tables[0].Rows.Remove(rowNumber); ; ;
}
现在你继续删除索引搞砸了,所以一旦你删除/删除了一行索引重建并且你正在访问另一行,你就永远不会真正处于特定索引。 尝试从集合的最后开始
for (int i = rowToRemove.Count - 1; i >= 0; i--)
{
dsExcel.Tables[0].Rows.RemoveAt(rowToRemove[i]);
//dsExcel.Tables[0].Rows.Remove(rowNumber); ; ;
}
答案 2 :(得分:0)
另一种可能性是使用行本身而不是它们的索引:
public DataSet GetExcelData()
{
DataTable ExcelTable = new DataTable();
List<DataRow> rowToRemove = new List<DataRow>();
foreach (DataRow excelrow in dsExcel.Tables[0].Rows)
{
foreach (object item in excelrow.ItemArray)
{
if (String.IsNullOrEmpty(item.ToString()))
{
rowToRemove.Add(excelRow);
break;
}
}
}
foreach (DataRow row in rowToRemove)
{
dsExcel.Tables[0].Rows.Remove(rowToRemove[i]);
}
return dsExcel;
}