Magicodes.IE icon indicating copy to clipboard operation
Magicodes.IE copied to clipboard

通过筛选器自定义排序列ColumnIndex 顺序无效

Open chai-chai opened this issue 3 years ago • 4 comments

   /// <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; }

chai-chai avatar Sep 21 '22 03:09 chai-chai

2.6.7

2022.10.12

  • ExporterHeaderFilter支持修改列索引,以支持动态排序,需设置ExporterHeaderAttribute.ColumnIndex属性(注意不应修改Index属性),值范围为0~10000。设置错误会自动调整到相近的边界值。
  • 提供ExporterHeadersFilter筛选器,以支持批量修改列头。
  • 重构、优化列排序代码。

xl-wenqiang avatar Oct 12 '22 09:10 xl-wenqiang

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;
        }

导出来顺序变成了 image

chai-chai avatar Oct 12 '22 12:10 chai-chai

@chai-chai 能否PR一个单元测试到Develop分支,我看看如何优化。

xl-wenqiang avatar Oct 14 '22 01:10 xl-wenqiang

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

xiedaibin avatar Oct 18 '22 02:10 xiedaibin