Cell currentCell = currentRow.getCell(columnNum); if (currentCell.getCellType() == STRING) {
时间: 2024-04-27 16:24:30 浏览: 13
这是一段代码,可以看出是在读取 Excel 表格中某一行的某一列的数据,并判断该单元格中的数据类型是否为字符串类型。其中,currentRow 表示当前所在的行,columnNum 表示要读取的列的编号。getCell(columnNum) 方法用于获取指定列的单元格对象,getCellType() 方法用于获取该单元格的数据类型。如果该单元格的数据类型为字符串类型,就会进入 if 语句中执行相应的操作。
相关问题
private static Dictionary<string, int> GenerateFieldColumnMapping(List<FieldTitleMapping> attrs, Worksheet worksheet) { var propColumnIndexDict = new Dictionary<string, int>(); try { var importExcelTitleRow = worksheet.Cells.Rows[0]; if (importExcelTitleRow[0].IsMerged) { importExcelTitleRow = worksheet.Cells.Rows[1]; } var titleRowEnumerator = attrs.GetEnumerator(); var rowEnumerator = importExcelTitleRow.GetEnumerator(); while (titleRowEnumerator.MoveNext()) { var currentConfigField = titleRowEnumerator.Current; bool isGetMapperSuccess = false; var columIndex = 0; while (rowEnumerator.MoveNext()) { var currentCell = rowEnumerator.Current as Cell; if (!string.IsNullOrEmpty(currentCell.StringValue)) { var curTitleI18nName = currentConfigField.FieldAttribute.TitleKey.Trim(); if (curTitleI18nName.Equals(RemoveBadgeOfTitle(currentCell.StringValue), StringComparison.OrdinalIgnoreCase)) { propColumnIndexDict.Add(currentConfigField.FieldName, columIndex); isGetMapperSuccess = true; break; } } columIndex++; } if (!isGetMapperSuccess) { //propColumnIndexDict.Clear(); //return propColumnIndexDict; } rowEnumerator.Reset(); } } catch (Exception ex) { propColumnIndexDict.Clear(); } return propColumnIndexDict; } worksheet使用的是 Aspose.Cells,优化这段代码
首先,可以将 `importExcelTitleRow` 的判断和赋值提取到一个方法中,避免重复代码:
```
private static Row GetImportExcelTitleRow(Worksheet worksheet)
{
var importExcelTitleRow = worksheet.Cells.Rows[0];
if (importExcelTitleRow[0].IsMerged)
{
importExcelTitleRow = worksheet.Cells.Rows[1];
}
return importExcelTitleRow;
}
```
接着,可以将 `titleRowEnumerator` 和 `rowEnumerator` 的初始化提取到 `while` 循环外部,避免每次循环都创建新的实例:
```
var titleRowEnumerator = attrs.GetEnumerator();
var rowEnumerator = GetImportExcelTitleRow(worksheet).GetEnumerator();
while (titleRowEnumerator.MoveNext())
{
var currentConfigField = titleRowEnumerator.Current;
bool isGetMapperSuccess = false;
var columIndex = 0;
while (rowEnumerator.MoveNext())
{
var currentCell = rowEnumerator.Current as Cell;
if (!string.IsNullOrEmpty(currentCell.StringValue))
{
var curTitleI18nName = currentConfigField.FieldAttribute.TitleKey.Trim();
if (curTitleI18nName.Equals(RemoveBadgeOfTitle(currentCell.StringValue), StringComparison.OrdinalIgnoreCase))
{
propColumnIndexDict.Add(currentConfigField.FieldName, columIndex);
isGetMapperSuccess = true;
break;
}
}
columIndex++;
}
if (!isGetMapperSuccess)
{
//propColumnIndexDict.Clear();
//return propColumnIndexDict;
}
rowEnumerator.Reset();
}
```
最后,可以将 `columIndex` 的自增放到 `if` 判断的外部,避免不必要的计算:
```
var titleRowEnumerator = attrs.GetEnumerator();
var rowEnumerator = GetImportExcelTitleRow(worksheet).GetEnumerator();
while (titleRowEnumerator.MoveNext())
{
var currentConfigField = titleRowEnumerator.Current;
bool isGetMapperSuccess = false;
var columIndex = 0;
while (rowEnumerator.MoveNext())
{
var currentCell = rowEnumerator.Current as Cell;
if (!string.IsNullOrEmpty(currentCell.StringValue))
{
var curTitleI18nName = currentConfigField.FieldAttribute.TitleKey.Trim();
if (curTitleI18nName.Equals(RemoveBadgeOfTitle(currentCell.StringValue), StringComparison.OrdinalIgnoreCase))
{
propColumnIndexDict.Add(currentConfigField.FieldName, columIndex);
isGetMapperSuccess = true;
break;
}
}
else
{
columIndex++;
}
}
if (!isGetMapperSuccess)
{
//propColumnIndexDict.Clear();
//return propColumnIndexDict;
}
rowEnumerator.Reset();
}
```
综上所述,优化后的代码如下:
```
private static Dictionary<string, int> GenerateFieldColumnMapping(List<FieldTitleMapping> attrs, Worksheet worksheet)
{
var propColumnIndexDict = new Dictionary<string, int>();
try
{
var titleRowEnumerator = attrs.GetEnumerator();
var rowEnumerator = GetImportExcelTitleRow(worksheet).GetEnumerator();
while (titleRowEnumerator.MoveNext())
{
var currentConfigField = titleRowEnumerator.Current;
bool isGetMapperSuccess = false;
var columIndex = 0;
while (rowEnumerator.MoveNext())
{
var currentCell = rowEnumerator.Current as Cell;
if (!string.IsNullOrEmpty(currentCell.StringValue))
{
var curTitleI18nName = currentConfigField.FieldAttribute.TitleKey.Trim();
if (curTitleI18nName.Equals(RemoveBadgeOfTitle(currentCell.StringValue), StringComparison.OrdinalIgnoreCase))
{
propColumnIndexDict.Add(currentConfigField.FieldName, columIndex);
isGetMapperSuccess = true;
break;
}
}
else
{
columIndex++;
}
}
if (!isGetMapperSuccess)
{
//propColumnIndexDict.Clear();
//return propColumnIndexDict;
}
rowEnumerator.Reset();
}
}
catch (Exception ex)
{
propColumnIndexDict.Clear();
}
return propColumnIndexDict;
}
private static Row GetImportExcelTitleRow(Worksheet worksheet)
{
var importExcelTitleRow = worksheet.Cells.Rows[0];
if (importExcelTitleRow[0].IsMerged)
{
importExcelTitleRow = worksheet.Cells.Rows[1];
}
return importExcelTitleRow;
}
```
接着要调用endedit,把dataGridView1.CurrentCell = null;会不会影响endedit触发
`dataGridView1.CurrentCell = null;` 不会影响 `EndEdit()` 方法的触发。实际上,取消当前单元格的选择不会阻止 `EndEdit()` 方法的执行。
`EndEdit()` 方法用于提交当前正在编辑的单元格的更改,并触发相应的事件,如 `CellValidating` 和 `CellValidated`。无论当前单元格是否被选择,都可以调用 `EndEdit()` 方法来提交更改。
因此,您可以在取消当前单元格的选择后调用 `EndEdit()` 方法,以确保正在编辑的单元格的更改被提交。
以下是一个示例:
```csharp
// 取消当前单元格的选择
dataGridView1.CurrentCell = null;
// 结束编辑并提交更改
dataGridView1.EndEdit();
```
这样做不会影响 `EndEdit()` 方法的触发,并且可以确保更改被正确提交。