Skip to content

Commit

Permalink
[fix]修正Excel导入中可能遇到的空引用
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Jan 13, 2025
1 parent 92227c8 commit b63b207
Showing 1 changed file with 13 additions and 5 deletions.
18 changes: 13 additions & 5 deletions NewLife.CubeNC/Common/EntityController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -412,9 +412,12 @@ public virtual ActionResult ImportExcel(IFormFile file)
var rows = reader.ReadRows().ToList();

// 读取标题行,找到对应字段
var headers = new List<String>();
var fields = new List<FieldItem>();
foreach (var item in rows[0])
{
headers.Add(item + "");

// 找到对应字段,可能为空
var field = Factory.Fields.FirstOrDefault(e => (item + "").EqualIgnoreCase(e.Name, e.DisplayName));
fields.Add(field);
Expand All @@ -425,17 +428,20 @@ public virtual ActionResult ImportExcel(IFormFile file)
{
// 实例化实体对象,读取一行,逐个字段赋值
var entity = fact.Create() as TEntity;
for (var i = 0; i < row.Length; i++)
for (var i = 0; i < row.Length && i < fields.Count; i++)
{
var field = fields[i];
if (field != null) entity.SetItem(field.Name, row[i].ChangeType(field.Type));
if (field != null)
entity.SetItem(field.Name, row[i].ChangeType(field.Type));
else
entity[headers[i]] = row[i];
}

if ((entity as IEntity).HasDirty) list.Add(entity);
}

// 保存数据
var rs = OnImport(list, fields);
var rs = OnImport(list, headers, fields);

var msg = $"导入[{file.FileName}],共[{rows.Count - 1}]行,成功[{rs}]行!";
base.WriteLog("导入Excel", true, msg);
Expand All @@ -458,14 +464,16 @@ public virtual ActionResult ImportExcel(IFormFile file)
/// 业务上,还需要考虑跟旧数据进行合并,已存在更新,不存在则新增。
/// </remarks>
/// <param name="list">导入实体列表</param>
/// <param name="headers">表头</param>
/// <param name="fields">导入字段</param>
/// <returns></returns>
protected virtual Int32 OnImport(IList<TEntity> list, IList<FieldItem> fields)
protected virtual Int32 OnImport(IList<TEntity> list, IList<String> headers, IList<FieldItem> fields)
{
// 如果存在主键或者唯一索引,先查找是否存在,如果存在则更新,否则新增
fields = fields.Where(e => e != null).ToList();
var names = fields.Select(e => e.Name).ToList();
var uk = Factory.Unique;
if (fields.Any(e => e.Name == uk.Name))
if (uk != null && fields.Any(e => e.Name == uk.Name))
{
for (var i = 0; i < list.Count; i++)
{
Expand Down

0 comments on commit b63b207

Please sign in to comment.