精华内容
下载资源
问答
  • 动态列
    千次阅读
    2021-04-16 14:14:26

    easyExcel 动态列以及自适应列宽的实现步骤

    1.在pom.xml文件中添加依赖

    <!-- excel导出工具 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.2.0-beta2</version>
    </dependency>
    

    2.创建EasyExcelUtils工具类;

    这里主要是通过反射的方式获取动态的列名对应的数据;
    public class EasyExcelUtils {
        private static final Logger logger = LoggerFactory.getLogger(EasyExcelUtils.class);
        /**
         * @param fileName  文件路径名
         * @param sheetName sheet名
         * @param data      查询出来的数据
         * @param headList  传入的Excel头(例如:姓名,生日)
         * @param fileList  传入需要展示的字段(例如:姓名对应字段是name,生日对应字段是birthday)
         */
        
        //在导出时注册registerWriteHandler(new CustomCellWriteHandler())
        public static void noModelWrite(String fileName, String sheetName, List data, List<String> headList, List<String> fileList){
            EasyExcel.write(fileName).head(head(headList)).registerWriteHandler(new CustomCellWriteHandler()).sheet(sheetName).doWrite(dataList(data,fileList));
        }
        /**
         * 设置Excel头
         * @param headList  Excel头信息
         * @return
         */
        private static List<List<String>> head(List<String> headList) {
            List<List<String>> list = new ArrayList<>();
            for (String value : headList) {
                List<String> head = new ArrayList<>();
                head.add(value);
                list.add(head);
            }
            return list;
        }
        /**
         * 设置表格信息
         * @param dataList  查询出的数据
         * @param fileList  需要显示的字段
         * @return
         */
        private static List<List<Object>> dataList(List<Object> dataList, List<String> fileList) {
            List<List<Object>> list = new ArrayList<>();
            for (Object person : dataList) {
                List<Object> data = new ArrayList<>();
                for (String fieldName : fileList) {
                    /**通过反射根据需要显示的字段,获取对应的属性值*/
                    data.add(getFieldValue(fieldName, person));
                }
                list.add(data);
            }
            return list;
        }
        /**
         * 根据传入的字段获取对应的get方法,如name,对应的getName方法
         * @param fieldName  字段名
         * @param person    对象
         * @return
         */
        private static Object getFieldValue(String fieldName, Object person) {
            try {
                String firstLetter = fieldName.substring(0, 1).toUpperCase();
                String getter = "get" + firstLetter + fieldName.substring(1);
                Method method = person.getClass().getMethod(getter);
                return method.invoke(person);
            } catch (Exception e) {
                logger.error("使用反射获取对象属性值失败", e);
                return null;
            }
        }
    
    }
    

    3.在跟EasyExcelUtils工具类同一包下创建 列宽自适应 的类 CustomCellWriteHandler

    这里通过继承AbstractColumnWidthStyleStrategy来实现
    /*
    * 导出列的自适应宽度
    * */
    
    
    //在导出时注册registerWriteHandler(new CustomCellWriteHandler())
    
    public class CustomCellWriteHandler extends AbstractColumnWidthStyleStrategy {
        private static final int MAX_COLUMN_WIDTH = 255;
        private  Map<Integer, Map<Integer, Integer>> CACHE = new HashMap(8);
    
        public CustomCellWriteHandler() {
        }
    
        protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
            boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
            if (needSetWidth) {
                Map<Integer, Integer> maxColumnWidthMap = (Map)CACHE.get(writeSheetHolder.getSheetNo());
                if (maxColumnWidthMap == null) {
                    maxColumnWidthMap = new HashMap(16);
                    CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
                }
    
                Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
                if (columnWidth >= 0) {
                    if (columnWidth > 255) {
                        columnWidth = 255;
                    }
    
                    Integer maxColumnWidth = (Integer)((Map)maxColumnWidthMap).get(cell.getColumnIndex());
                    if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
                        ((Map)maxColumnWidthMap).put(cell.getColumnIndex(), columnWidth);
                        writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
                    }
    
                }
            }
        }
    
        private Integer dataLength(List<CellData> cellDataList, Cell cell, Boolean isHead) {
            if (isHead) {
                return cell.getStringCellValue().getBytes().length;
            } else {
                CellData cellData = (CellData)cellDataList.get(0);
                CellDataTypeEnum type = cellData.getType();
                if (type == null) {
                    return -1;
                } else {
                    switch(type) {
                        case STRING:
                            return cellData.getStringValue().getBytes().length;
                        case BOOLEAN:
                            return cellData.getBooleanValue().toString().getBytes().length;
                        case NUMBER:
                            return cellData.getNumberValue().toString().getBytes().length;
                        default:
                            return -1;
                    }
                }
            }
        }
    }
    

    4.在controller层的调用示例;

    @RestController
    public class TestController {
        @Autowired
        private SpotCheckSendingHomeExcelService spotCheckSendingHomeExcelService;
    
        @RequestMapping(value = "/auth/downloadList",method = {RequestMethod.GET, RequestMethod.POST})
        public void downloadList(){
            //将前端页面上想要导出的excel文件字段名通过查数据库中的表信息来进行动态的导入数据信息
            List<SpotCheckSendingHomeExcel> list = spotCheckSendingHomeExcelService.findAll();
    
            //可以通过前端进行参数的传入来确定表头列的数量
     		String filedNames="抽检任务编码,检测单位";
            String filedCodes="spotCheckCode,testingUnit";
            
            /**Excel头,参数格式:姓名,生日*/
            String[] head = filedNames.split(",");
            List<String> headList = new ArrayList<>(Arrays.asList(head));
            /**Excel表格内容,参数格式:name,birthday*/
    
            File file1=new File("e:/data2");
            if(!file1.exists()){
                file1.mkdir();
            }
            String[] file = filedCodes.split(",");
            List<String> fileList = new ArrayList<>(Arrays.asList(file));
            
         	//文件导出为.xls文件
            EasyExcelUtils.noModelWrite(file1+"/"+"测试例子.xls","测试例子",list,headList,fileList);
        }
    }
    

    5.文件导出模板类

    @Data
    /*@ApiModel("检测任务月报Excel")*/
    public class SpotCheckSendingHomeExcel {
    
        @ExcelProperty("上报状态")
        private String isReport;
    
        @ExcelProperty("抽检任务编码")
        private String spotCheckCode;
    
        @ExcelProperty("项目单位")
        private String company;
    
        @NumberFormat("#.###")
        @ExcelProperty("抽检数量")
        private BigDecimal spotCheckQt;
    
        @DateTimeFormat("yyyy-MM-dd")
        @ExcelProperty("送检日期")
        private Date conveyDate;
    
        @ExcelProperty("检测人")
        private String checkPerson;
    
        @DateTimeFormat("yyyy-MM-dd")
        @ExcelProperty("检测日期")
        private Date checkDate;
    
        @ExcelProperty("检测结果")
        private String isPass;
    
        @ExcelProperty("物资小类")
        private String category3;
    
        @DateTimeFormat("yyyy-MM-dd")
        @ExcelProperty("ECP同步抽检任务时间")
        private Date qmScSyncDate;
    
        @ExcelProperty("ECP同步抽检任务ID")
        private String qmScTaskId;
    
        @DateTimeFormat("yyyy-MM-dd")
        @ExcelProperty("检测结束日期")
        private Date endCheckDate;
    
        @DateTimeFormat("yyyy-MM-dd")
        @ExcelProperty("检测开始日期")
        private Date startCheckDate;
    
        @ExcelProperty("检测单位")
        private String testingUnit;
    
        @ExcelProperty("运输单位")
        private String logisticsCompany;
    
        @ExcelProperty("电压等级")
        private String voltageLevel;
    
    }
    
    更多相关内容
  • 今天小编就为大家分享一篇element ui 表格动态列显示空白bug 修复方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 主要介绍了VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • easyUI页面datagrid动态列和form字段动态添加;项目开发时用到的,废了不少事,大概总了一下,现在发出来共享给想我一样的要用到的菜鸟们,谢谢
  • 在MIS 系统的设计中, 报表输出是不可缺少的功能, FineReport 是一个非常不错的报表工具。研究了通过FineReport 设计动态列报表的技术要点。
  • 1、根据sql自动实现行转; 2、根据sql自动实现分组; 3、效果图请看下面链接: http://blog.csdn.net/navyliu520/article/details/41206483
  • C# winform datagridview 动态列值计算
  • EasyExcel支持导入动态列

    千次阅读 2022-05-03 21:24:28
    但EasyExcel这种通过注解的方式实现导入就必须使用事先定义好数据类型来接收,它不支持对象中的子对象,也不能导入excel带有动态列的数据(即相同列名下的多个数据列) 换做java的数据结构即如下结构: 这里使用...


    前言

    我们在使用EasyExcel做导入功能时,通过在实体或者VO加@ExcelProperty(“测试”)注解来实现列的一一对应,read()之后获取一个List<T>的结果集,得到java的数据类型然后在进行业务操作
    但EasyExcel这种通过注解的方式实现导入就必须使用事先定义好数据类型来接收,它不支持对象中的子对象,也不能导入excel带有动态列的数据(即相同列名下的多个数据列)
    换做java的数据结构即如下结构:
    在这里插入图片描述
    这里使用原生的EasyExcel并不能接收到多个列名为 测试1 的数据
    这里提供一种解决方式,它能够实现动态列的解析,实例化对象中的子对象这种数据结构(仅支持二级的嵌套,即一对多的这种关系)


    一、代码

    /* 注解用来支持解析构建子对象 */
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    public @interface ExcelDynamic {
    }
    
    
    /* 解析导入数据,存储解析到的动态列数据(其中用到一些工具类大家可以自己实现) */
    public class DynamicReadListener extends AnalysisEventListener<Map<Integer, ReadCellData<?>>> {
    
        /**
         * log
         */
        private final Logger log = LoggerFactory.getLogger(this.getClass());
    
        /**
         * 表头数据(存储所有的表头数据)
         */
        private final List<Map<Integer, String>> headList = new ArrayList<>();
    
        /**
         * 数据体
         */
        private final List<Map<Integer, String>> dataList = new ArrayList<>();
    
        /**
         * 动态列 索引
         */
        private final List<List<Integer>> dynamicIndex = new ArrayList<>();
    
        /**
         * 动态列数据
         */
        private final List<Map<String, List<Object>>> dynamicColumns = new ArrayList<>();
    
        /**
         * 实例化 Listener
         * @return Listener
         */
        public static DynamicReadListener init(){
            return new DynamicReadListener();
        }
    
        /**
         * 这里会一行行的返回头
         * @param headMap 表头
         * @param context 上线文
         */
        @Override
        public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
            log.info("解析到表头:{}", JsonUtil.toJson(headMap));
            //保存表头
            headList.add(headMap);
            //保存动态列索引
            //CollectUtil.repeatNode(headMap) 获取map中重复value的keys
            dynamicIndex.add(CollectUtil.repeatNode(headMap));
        }
    
    
        @Override
        public void invoke(Map<Integer, ReadCellData<?>> data, AnalysisContext context) {
            /*
             * 保存数据行
             * 这里因为接收类型是 ReadCellData 就未处理
             * ReadCellData 有getStringValue 可供获取cell值
             */
            //dataList.add(data);
            ReadSheetHolder holder = context.readSheetHolder();
            try {
                handleDynamicColumns(data, holder.getHeadRowNumber() - 1, holder.getRowIndex() - 1, headList.size());
            } catch (NoSuchFieldException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 后置处理
         * @param context 上线文
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {}
    
        /**
         * 根据当前数据行,获取动态列数据
         *
         * @param data 当前数据
         * @param dataRowIndex 数据行索引
         * @param headRowIndex 数据头索引
         * @param columnSize 列长度,初始化map需要
         */
        private void handleDynamicColumns(Map<Integer, ReadCellData<?>> data, Integer headRowIndex, Integer dataRowIndex, Integer columnSize) throws NoSuchFieldException, IllegalAccessException {
            if (!dynamicIndex.isEmpty()){
                Map<String, List<Object>> columns = new HashMap<>(columnSize);
                Map<Integer, String> targetHead = headList.get(headRowIndex);
                for (Integer targetIndex : dynamicIndex.get(headRowIndex)) {
                    String head = targetHead.get(targetIndex);
                    String value = data.get(targetIndex).getStringValue();
                    if (Objects.isNull(columns.get(head))){
                        //不要使用Arrays.asList 因为返回的list 没有重写add方法
                        columns.put(head, ListUtil.asList(value));
                    }else {
                        columns.get(head).add(value);
                    }
                }
                dynamicColumns.add(columns);
            }
        }
    
        public List<Map<Integer, String>> getHeadList() {
            return headList;
        }
    
        public List<Map<Integer, String>> getDataList() {
            return dataList;
        }
    
        public List<Map<String, List<Object>>> getDynamicColumns() {
            return dynamicColumns;
        }
    }
    
    /* easyExcel工具类 */
    public class Excels extends EasyExcel{
    
        private Excels() {}
    
        /**
         * 导入
         * @param fileStream 文件流
         * @param clazz 导入类型class
         * @param <T> 导入类型
         * @return List<T>
         */
        public static <T> List<T> imports(InputStream fileStream, Class<T> clazz){
            return read(fileStream).head(clazz).sheet().doReadSync();
        }
    
        /**
         * 导入带有动态列的数据
         *
         * @param fileStream 文件流
         * @param clazz 导入类型class
         * @param <T> 导入类型
         * @return List<T>
         */
        public static <T> List<T> importsDynamic(InputStream fileStream, Class<T> clazz) throws IllegalAccessException, InstantiationException {
            //初始化 处理动态列 readListener
            DynamicReadListener dynamicReadListener = DynamicReadListener.init();
            //初始化 同步读取数据 readListener
            SyncReadListener syncReadListener = new SyncReadListener();
            /*
             * useDefaultListener = false
             * 默认的 readListener 即 ModelBuildEventListener 会第一个去处理数据,导致ReadHolder中的 currentRowAnalysisResult 已转为 Model 类型,
             * dynamicReadListener 调用到 invoke 时会报错, 因此需要 dynamicReadListener 排在 readListenerList 的第一位,保证能够接收到 map 类型,处理动态列
             * 但我们仍需要 ModelBuildEventListener 所以我们手动注册
             */
            ExcelReaderSheetBuilder sheet = read(fileStream).useDefaultListener(false).head(clazz).sheet();
            sheet.registerReadListener(dynamicReadListener);
            //注册 map转 model readListener
            sheet.registerReadListener(new ModelBuildEventListener());
            sheet.registerReadListener(syncReadListener);
            sheet.doRead();
            return build((List<T>) syncReadListener.getList(), dynamicReadListener);
        }
    
        /**
         * 处理源数据 为其实例化其中的动态列属性
         *
         * @param targets 处理目标List<T> 中的动态列 为其实例化动态列属性
         * @param <T> 处理数据类型
         * @return 源数据
         * @throws IllegalAccessException IllegalAccessException
         */
        private static <T> List<T> build(List<T> targets, DynamicReadListener listener) throws IllegalAccessException, InstantiationException {
            if (CollectionUtils.isNotEmpty(targets)){
                for (int i = 0; i < targets.size(); i++) {
                    T target = targets.get(i);
                    // 初始化带有 @ExcelDynamic 标志的属性
                    for (Field targetField : target.getClass().getDeclaredFields()) {
                        if (Objects.nonNull(targetField.getAnnotation(ExcelDynamic.class))){
                            targetField.setAccessible(true);
                            targetField.set(target, build(listener.getDynamicColumns().get(i), targetField.getType()));
                        }
                    }
                }
            }
            return targets;
        }
    
        /**
         * 根据class、当前行动态列数据 构建动态列属性
         *
         * @param dynamicRow 当前行动态列数据
         * @param clazz 处理类型
         * @param <T> 处理类型
         * @return 多列转List
         */
        private static <T> T build(Map<String, List<Object>> dynamicRow, Class<T> clazz) throws InstantiationException, IllegalAccessException {
            if (Objects.isNull(clazz)){
                throw new NullPointerException("class not support null value");
            }
            //处理类型属性list
            Field[] fields = clazz.getDeclaredFields();
            //待处理命中动态列数据
            Map<Field, List<Object>> hitColumn = new HashMap<>(fields.length);
            //开始筛选命中动态列
            dynamicRow.forEach((head, columns)->{
                //遍历 <T> 属性
                for (Field field : fields) {
                    //获取属性注解
                    ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
                    if (Objects.nonNull(annotation)){
                        //根据注解值匹配
                        Object[] annotationKeys = annotation.value();
                        for (Object annotationKey : annotationKeys) {
                            if (!Objects.equals("", annotationKey) && Objects.equals(head, annotationKey)){
                                if (CollectionUtils.isNotEmpty(columns)){
                                    hitColumn.put(field, columns);
                                    break;
                                }
                            }
                        }
                    }
                }
            });
            return handle(hitColumn, clazz);
        }
    
        /**
         * 处理命中的动态列
         * @param hitColumn 待处理数据
         * @param clazz 类型
         * @param <T> T
         * @return T
         */
        private static <T> T handle(Map<Field, List<Object>> hitColumn, Class<T> clazz) throws InstantiationException, IllegalAccessException {
            //处理返回结果
            if(CollectionUtils.isNotEmpty(hitColumn.keySet())){
                T target = clazz.newInstance();
                    hitColumn.forEach((field, columns) -> {
                        try {
                            List<Object> targetFieldList = new ArrayList<>();
                            for (Object column : columns) {
                                try {
                                    Object targetValue = Objects.requireNonNull(getGenericClass(field)).getConstructor(String.class).newInstance((String)column);
                                    targetFieldList.add(targetValue);
                                } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
                                    e.printStackTrace();
                                }
                            }
                            field.setAccessible(true);
                            field.set(target, targetFieldList);
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }
                    });
                return target;
            }
            return null;
        }
    
        /**
         * 通过 Field 获取其泛型
         * @param field 类属性
         * @return 泛型类
         */
        private static Class<?> getGenericClass(Field field){
            Type genericType = field.getGenericType();
            if (genericType instanceof ParameterizedType) {
                ParameterizedType parameterizedType = (ParameterizedType) genericType;
                // 获取成员变量的泛型类型信息
                Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
                for (Type actualTypeArgument : actualTypeArguments) {
                    return (Class<?>) actualTypeArgument;
                }
            }
            return null;
        }
    }
    
    

    二、使用

    文件数据
    在这里插入图片描述

    测试

    	/* 测试 */
        @Test
        public void test1() throws FileNotFoundException, IllegalAccessException, InstantiationException {
            List<A> as = Excels.importsDynamic(new FileInputStream(new File("C:\\Users\\caobinghui\\Desktop\\test.xlsx")), A.class);
            as.forEach(System.out::println);
        }
    

    结果
    在这里插入图片描述

    二、结束

    代码拙劣,大家可以自己去试着优化
    觉得有帮助的可以点个赞,谢谢!!


    展开全文
  • jasperReport动态列的实现

    热门讨论 2011-11-14 15:36:09
    实现了jasperReport进行报表动态列的实现,使用者只需要利用eclipse将工程文件导入,即可查看运行结果的展示,不需要其他的配置和jar包如果想进行动态展示只需要修改构造参数就可以看到动态的展示
  • jqgrid初始化时动态创建列并对这些列数值进行合计 生成动态列的数据源可以通过ajax获取或者前端自定义数据集
  • DataTable动态行转

    2020-09-16 11:43:26
    DataTable动态行转类,设置需要装置的列名和数据后,可以动态将DataTable的进行转置。
  • 行转动态行转不定),自动转换,数限制为oracle限制
  • easypoi 详情数据+列表数据,列表数据动态列+合并单元格实现示例
  • VBA高级筛选-筛选全部数据源部分列出来(动态列可变动).xlsm 数据源包含全部列,但是条件区域可能是其中的几列,不固定 返回结果是对应的列,可以不返回全部列
  • 帆软 FineReport 动态列如何设置

    千次阅读 2021-12-20 20:36:50
    最近有个需求是用采购的帆软报表来动态展示数据,记录下来,方便备查。 环境准备 帆软 FineReport V9.0 以用户信息统计表为例,具体操作步骤如下。...定义变量${cols} 即 tb_user 表中想动态展示的,设置如

    最近有个需求是用采购的帆软报表来动态展示数据,记录下来,方便备查。
    环境准备
    帆软 FineReport V9.0
    以用户信息统计表为例,具体操作步骤如下。

    第一步、设置查询信息集

    新建信息集 Data,在编辑栏中 输入查询的SQL,查询 tb_user 表,其中 ${cols} 为变量,可以在 定义其的数值。

    // ${cols} 表示列
    SELECT
    	${cols}
    FROM
    	tb_user
    GROUP BY
    	${cols}
    

    定义变量${cols} 即 tb_user 表中想动态展示的列,设置如下图所示。
    在这里插入图片描述

    第二步、设置复选框数据集

    新增 复选框控件 clos ,设置 数据字典,这里选择自定义,手动添加 页面显示值与实际对应值的关系,即 tb_user 表中要动态显示的列。注意 实际值要与上一步 ${cols} 给定的值一致。
    在这里插入图片描述
    设置完成,切记要点击保存,在本地预览效果,复选框的值选项便添加成功了,效果如下图所示。
    在这里插入图片描述

    第三步、数据绑定

    完成上面两个步骤,接下来绘制报表,拖动左侧子查询的列,到右侧的编辑区域,效果如下图所示。
    在这里插入图片描述
    报表上添加了 制表时间 添加公式,获取当前为其值,右侧编辑栏,插入元素-插入公式。
    在这里插入图片描述
    设置公式,点击 检查合法性,来验证写入的公式是否正确。
    在这里插入图片描述
    在预览页面,查看数据绑定是否成功,点击查询后,数据展示出来,但只选中 用户名 和 性别两列,但把所有的结果都查询出来了,如下图所示。
    在这里插入图片描述

    第四步、设置动态列属性

    接上面的问题,如何让选择的列显示,其他的列不显示呢?
    以第一列为例,选中 展示列,右侧 编辑栏,添加条件属性,重命名为 用户名。
    在这里插入图片描述
    选择列宽,新增一行 列宽为0,类型选择 公式。
    在这里插入图片描述
    公式中运用 函数 INARRAY 来匹配是否存在。记得要点击添加,保存到下方区域

    INARRAY('username', $cols) = 0
    

    在页面预览,再次查看效果,只展示出选择的 用户名和性别,如下图所示。
    在这里插入图片描述

    第五步、页面显示转换

    接第四步、页面显示的性别是1和2,如何让他们显示为男或女呢?
    选中 数据栏单元格,右侧编辑栏,切换到 形态页签,选择数据字典,这里还是选择自定义,手动输入对应关系,1-男 2-女,保存,如下图所示。
    在这里插入图片描述
    重新回到预览页面,查询效果,如下图所示。
    在这里插入图片描述

    动手试试,有问题的可以下面留言哦~

    参考博客

    【1】https://help.finereport.com/finereport9.0/doc-view-1845.html

    展开全文
  • 此案例基于 基于element-ui的分页表格组件,增加了动态列的功能。墙裂建议按顺序食用。 实现思路: 实现动态列本质上是控制列的显隐状态,如果是使用jQuery的话,无非是操作dom。目前使用的是vue,其屏蔽了dom的操作...

    此案例基于 基于element-ui的分页表格组件,增加了动态列的功能。

    实现思路

      实现动态列本质上是控制列的显隐状态,如果是使用jQuery的话,无非是操作dom。目前使用的是vue,其屏蔽了dom的操作,允许我们通过变量间接的操作dom。
      之前实现过一个版本,形式类似这位仁兄写的博文(此链接),而且我是封装成了组件,父子级组件的数据、属性设置甚是繁杂。想着怎么优化,后面发现此文 Vue 动态修改dom样式,觉得是时候重新实现下这个动态列的功能了。抛弃了用变量控制显隐状态,直接操作dom。
    (之前的实现找个时间也整理一下,有对比才有伤害)

    20200728 更新:
      打脸了,本以为“直接操作dom来实现动态列”会比较简洁高效,实际使用效果却差强人意。实际使用中会出现表格中间空白,以及列宽不会自动伸缩等等问题。那么还是老老实实使用 v-if 属性控制列的显隐来实现动态列功能

    组件功能

    1. 继承 分页表格组件 的所有功能
    2. 动态列功能开关
    3. 支持动态列设置
    4. 支持初始隐藏列的设置
    5. 支持不可隐藏列的设置

    效果图
    在这里插入图片描述

    相关代码

    相关的代码托管在码云,必要的注释都注明在代码中。传送门走你:码云地址
    对应的文件目录为 src/views/PageTable/frontendPagingDynCol-v2/,PageTable.vue 为组件代码,
    frontendPagingDynColvue为使用案例。

    系列文章

    reference:
    vue:遇到的坑之-----动态控制表格列的显隐(element-ui)
    Vue 动态修改dom样式


    end

    展开全文
  • antd 表格设置动态列(动态表头)

    千次阅读 2022-01-19 09:12:47
    2、表格的 columns 动态赋值(刚开始默认全部不展示) html: <div class="checkBox"> <a-checkbox @change="changeData" :checked="dataRate"> 数据传输完整率 </a-checkbox> <a-checkbox...
  • sqlserver 动态行专列 避免了数据过多的时候大量的使用case when then...... 原数据 : UserName Subject Score Nick 语文 80 Nick 数学 90 Nick 英语 70 Nick 生物 85 Kent 语文 80 Kent 数学 90 Kent ...
  • java实现Excel动态列导出的简单例子

    千次阅读 2020-05-16 16:39:48
    可以通过该对象的set方法设置各个参数,headKey保存结果集中,数据对应的key值,ArrayList最佳,保证了导出的顺序,同时限制了每个sheet页保存的最大数据行数为5W条,这些参数也可以放到属性中进行设置。...
  • 1.数字类的变化,已知循环数量,例如a1,a2,a3的这种 2.没有规律的属性,但是前台无法直接编写的情况,prop和...一定要用template, 不要用div或者其他的标签来循环,其他的标签会导致循环前边的跑到后边去的情况。
  • element表格添加动态列

    千次阅读 2020-04-12 22:57:39
    常规的确定表格参考官网 <el-table :data="tableData"> <el-table-column prop="date" label="日期" width="180"></el-table-column> <el-table-column prop="name" label="姓名" width=...
  • 有case when方式和2005之后的内置pivot和unpivot方法来实现,行列互转,可以分为静态互转,动态互转。
  • 使用easypoi导出excel实现动态列

    万次阅读 热门讨论 2019-03-01 10:41:20
    使用easypoi导出excel实现动态列 说明: 使用的是easypoi进行导出 行头是动态生成 依据key进行列匹配,进行数据填充 第一列进行纵向动态合并 自己的一个使用,记录一下 实现效果 变更前样式 变更后样式 代码解析...
  • vue,element-ui中el-table实现动态列,列数根据接口返回 solt="header"是为了插入表头的,这里遍历listStudent[0],是因为表头都一样,所以取第一行数据的字段做为表头即可 <template> <div> <el-...
  • mybatis写动态列语法应该这么写 前缀+变量 例如下面例子标红位置写,记住不能以这个CONCAT('a',#{index}),这种写法是当作字符串处理 &lt;select id="getPersonCountByFormData" parameterType="...
  • vxe-table 动态列 tree-node功能

    千次阅读 2020-06-28 20:34:11
    vxe-table 动态列 和tree-node功能 官网参考资料 https://xuliangzhan_admin.gitee.io/vxe-table/#/table/grid/tree 组件 <vxe-table :data="tableData" :columns="tableColumn" // 动态列 :tree-config="{...
  • mysql查询动态行转动态列,并使用mybatis执行语句。 新建表 # 学生表 DROP TABLE IF EXISTS students; CREATE TABLE students( `id` INT(3) NOT NULL COMMENT '主键', `name` VARCHAR(10) NOT NULL COMMENT '姓名'...
  • layui-table动态列实现

    千次阅读 2020-04-07 16:35:32
    前两天项目遇到一个场景,使用layui table时,除了固定列之外,还需要使用动态列来展示一些动态数据。 基本思路: 从后台获取数据,处理成数组类型 声明一个二维数组,根据列需求动态添加元素作为动态列 table渲染...
  • 最近用到了EasyExcel的动态列导出,所以自己写了个工具来支持在原有的实体类注解上拓展动态列的方法。废话不多说直接上代码。 /** * EasyExcel支持动态列导出 * * @param builder 指定输出方式和样式 * @param...
  • var dataGridColumn:DataGridColumn = new DataGridColumn(arrData[2]); dataGridColumn.headerText=arrData[0]; dataGridColumn.width=150; dataGridColumn.editable=false; var arrays:Array = new Array();...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 678,411
精华内容 271,364
关键字:

动态列