Magicodes.IE
Magicodes.IE copied to clipboard
通过筛选器自定义排序列ColumnIndex 顺序无效
/// <summary>
/// 导出物料信息Dto
/// </summary>
[ExcelExporter(Name = "物料信息", ExporterHeaderFilter = typeof(ExportMaterailFilter))]
public class ExportMaterailDto
{
/// <summary>
/// 图片路径
/// </summary>
[ExportImageField]
[ExporterHeader(DisplayName = "图片")]
public string ImgUrl { get; set; }
/// <summary>
/// 物料编码
/// </summary>
[ExporterHeader(DisplayName = "物料编码")]
public string MtCode { get; set; }
/// <summary>
/// 物料名称
/// </summary>
[ExporterHeader(DisplayName = "物料名称")]
public string MtName { get; set; }
}
public class ExportMaterailFilter : IExporterHeaderFilter
{
/// <summary>
/// 表头筛选器(修改名称)
/// </summary>
/// <param name="exporterHeaderInfo"></param>
/// <returns></returns>
public ExporterHeaderInfo Filter(ExporterHeaderInfo exporterHeaderInfo)
{
//showColumn会通过其他方式动态传入,不是写死
var showColumn = new List<string> { "MtCode", "MtName", "ImgUrl" };
ExporterHeaderFilterExtensions.SetExporterHeaderData<ExportMaterailDto>(exporterHeaderInfo, showColumn);
return exporterHeaderInfo;
}
}
public static class ExporterHeaderFilterExtensions
{
public static ExporterHeaderInfo SetExporterHeaderData<TSource>(ExporterHeaderInfo exporterHeaderInfo, List<string> fieldList)
{
if (fieldList.Count == 0)
{
return exporterHeaderInfo;
}
if (fieldList.Select(z => z.ToLower()).Contains(exporterHeaderInfo.PropertyName.ToLower()))
{
//列排序 todo:注释代码 ,不生效
//var idx = fieldList.Select(z => z.ToLower()).ToList().IndexOf(exporterHeaderInfo.PropertyName.ToLower());
//if (idx > -1)
//{
// exporterHeaderInfo.Index = idx + 1;
// exporterHeaderInfo.ExporterHeaderAttribute.ColumnIndex = idx + 1;
//}
}
else
{
//忽略不查询的列
exporterHeaderInfo.ExporterHeaderAttribute.IsIgnore = true;
}
return exporterHeaderInfo;
}
}
使用筛选器修改了exporterHeaderInfo的Index 与ExporterHeaderAttribute.ColumnIndex,发现值是改了,但是导出excel时候配置无效 如果不使用筛选器类的逻辑,直接在Dto上加上ColumnIndex=x(导出excel排序有效),打了断点,监控到 exporterHeaderInfo.Index跟exporterHeaderInfo.ExporterHeaderAttribute.ColumnIndex是保持一致的
/// <summary>
/// 图片路径
/// </summary>
[ExportImageField]
[ExporterHeader(DisplayName = "图片", ColumnIndex = 3)]
public string ImgUrl { get; set; }
/// <summary>
/// 物料编码
/// </summary>
[ExporterHeader(DisplayName = "物料编码",ColumnIndex =1)]
public string MtCode { get; set; }
/// <summary>
/// 物料名称
/// </summary>
[ExporterHeader(DisplayName = "物料名称", ColumnIndex = 2)]
public string MtName { get; set; }
2.6.7
2022.10.12
- ExporterHeaderFilter支持修改列索引,以支持动态排序,需设置ExporterHeaderAttribute.ColumnIndex属性(注意不应修改Index属性),值范围为0~10000。设置错误会自动调整到相近的边界值。
- 提供ExporterHeadersFilter筛选器,以支持批量修改列头。
- 重构、优化列排序代码。
2.6.7
2022.10.12
- ExporterHeaderFilter支持修改列索引,以支持动态排序,需设置ExporterHeaderAttribute.ColumnIndex属性(注意不应修改Index属性),值范围为0~10000。设置错误会自动调整到相近的边界值。
- 提供ExporterHeadersFilter筛选器,以支持批量修改列头。
- 重构、优化列排序代码。
排序是可以了,但是排序错乱,未按照设置的排序顺序正确排序
/// <summary>
/// 按列集合导出显示列
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <param name="exporterHeaderInfos"></param>
/// <param name="columnList">导出的列集合,如果为空则全部,如果不为空,则只导出集合类的列</param>
/// <returns></returns>
public static IList<ExporterHeaderInfo> SetExporterHeadersData<TSource>(IList<ExporterHeaderInfo> exporterHeaderInfos, List<string> columnList)
{
if (columnList.Count == 0)
{
return exporterHeaderInfos;
}
foreach (var item in exporterHeaderInfos)
{
if (columnList.Select(z => z.ToLower()).Contains(item.PropertyName.ToLower()))
{
if (item.PropertyName.ToLower() == "mtcode")//物料编码
{
item.ExporterHeaderAttribute.ColumnIndex = 1;
}
if (item.PropertyName.ToLower() == "mtname")//物料名称
{
item.ExporterHeaderAttribute.ColumnIndex = 2;
}
if (item.PropertyName.ToLower() == "imgurl")//图片
{
item.ExporterHeaderAttribute.ColumnIndex = 3;
}
if (item.PropertyName.ToLower() == "mttypename")//物料类型
{
item.ExporterHeaderAttribute.ColumnIndex = 4;
}
}
else
{
//忽略不查询的列(图片列不能忽略,Magicodes无法实现此功能,只能过滤数据源,把imgurl的值清空来不显示图片)
if (item.PropertyName.ToLower() != "imgurl")
{
item.ExporterHeaderAttribute.IsIgnore = true;
}
}
}
//exporterHeaderInfos.RemoveAll(x => x.ExporterHeaderAttribute.IsIgnore);
return exporterHeaderInfos;
}
导出来顺序变成了

@chai-chai 能否PR一个单元测试到Develop分支,我看看如何优化。
@xl-wenqiang ExportHelper ReorderHeaders 重新排序方法有些问题。 当给定得数据列中ExporterHeaderAttribute含有IsIgnore忽略时。 _exporterHeaderList.RemoveAt(i); _exporterHeaderList.Insert(index, item); 插入得位置并不是排序得index,会导致得到得结果并不是所设定得排序顺序。(忽略字段也暂用了位置) 提供了一个简单得修正是 新序列重排后再赋值给原来序列: //修改列位置 _exporterHeaderList = _exporterHeaderList.OrderBy(p => p.ExporterHeaderAttribute?.ColumnIndex ?? 10000).ToList();