Excel列名可能包含尾随空格,如果列因空格而不匹配,则会出现异常。
我正在寻找方法来处理数据表中列名中的尾随空格。
foreach (DataRow row in caseTable.Rows)
{
foreach (DataColumn column in caseTable.Columns)
{
if (!(string.isNullOrEmpty(column.toString())))
{
//Cannot assign value to 'column' because it is in a 'foreach iteration variable'
column = column.ToString().TrimStart().TrimEnd();
trimmed = 1;
}
}
while (trimmed == 0) ;
}
...
//errored out due to 'Excel.firstName' value not existing in DataTable due to trailing spaces
if (row[Excel.firstName].ToString().Trim() != "")
{
caseEntity.Attributes[Case.firstName] = row[Excel.firstName];
}
您的代码中有两个错误:
- 您正在使用foreach迭代序列,并试图修改迭代项;因此,抛出的异常
- 您正在尝试替换列对象而不是其名称
此外,您正在滥用ToString,并且正如Michal Turczyn所述,您没有使用专门为测试空字符串或null字符串而设计的内置String方法。
您可以尝试用替换内部循环中的代码
var oldName = column.ColumnName;
if (!string.IsNullOrEmpty(oldName))
{
var newName = oldName.Trim();
if (newName != oldName)
{
column.ColumnName = newName;
trimmed = 1;
}
}
从这个替换代码你可以看到:
- 您应该读取/写入
ColumnName
属性,而不是使用ToString
- 使用
Trim
可以避免相继调用TrimStart
和TrimEnd
(按任何顺序( - 您应该使用
string.IsNullOrEmpty
,而不是检查空字符串 - 通过声明
oldName
和newName
,您可以将列名跟踪为修剪,只有当这真的是真的时
此外,如果只为trimmed
变量分配值0和1,则应考虑将其声明为bool
,并分配false或true。否则,可以将trimmed
变量保持为一个数字,但增加其值,而不是始终指定相同的常数(1(。
如果您试图更改的不是列名,而是该列的当前行中的单元格值,那么您将无法获取(以及稍后设置(单元格值(您正在评估并试图仅更改列名(。在这种情况下,内部循环代码变为:
var oldValue = row[column] as string;
if (!string.IsNullOrEmpty(oldValue))
{
var newValue = oldValue.Trim();
if (newValue != oldValue)
{
row[column] = newValue;
trimmed = 1;
}
}