关于若依导出表格隐藏功能延伸--适用于表格导入更新

编写目的

若依框架中,已经自带了表格导出功能,但是有时根据业务要求需要导出后进行修改后更新的操作,如果数据量大且数据库设计中不存在联合唯一索引或者不符合要求的情况下,则需要我们在导出的文档中存在一个主键id(默认该表只用于更新)。

若依现有隐藏策略

使用方法hideColumn() 进行隐藏,我查看了若依源码发现该隐藏实际为不写入。也就是说隐藏的字段不会写入到excel中。
代码如下:

1. public void hideColumn(String... fields)
	    {
	        this.excludeFields = fields;
	    }
2.  public List<Object[]> getFields()
    {
        List<Object[]> fields = new ArrayList<Object[]>();
        List<Field> tempFields = new ArrayList<>();
        tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields()));
        tempFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
        for (Field field : tempFields)
        {
            if (!ArrayUtils.contains(this.excludeFields, field.getName()))
            {
                // 单注解
                if (field.isAnnotationPresent(ExcelNew.class))
                {
                    ExcelNew attr = field.getAnnotation(ExcelNew.class);
                    if (attr != null && (attr.type() == Type.ALL || attr.type() == type))
                    {
                        field.setAccessible(true);
                        fields.add(new Object[] { field, attr });
                    }
                    if (Collection.class.isAssignableFrom(field.getType()))
                    {
                        subMethod = getSubMethod(field.getName(), clazz);
                        ParameterizedType pt = (ParameterizedType) field.getGenericType();
                        Class<?> subClass = (Class<?>) pt.getActualTypeArguments()[0];
                        this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, ExcelNew.class);
                    }
                    ........


3. 
 /**
     * 得到所有定义字段
     */
private void createExcelField()
    {
        this.fields = getFields();
        this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((ExcelNew) objects[1]).sort())).collect(Collectors.toList());
        this.maxHeight = getRowHeight();
    }

根据第二部分 我们可以发现,如果不包含这个隐藏的列,那么就会把该列加到返回值中。并且可以看到第四步中获取所有定义的字段的时候就是获取的这个返回值,并且导入时也可以看到时同样使用了getFields() 方法。

根据业务需要进行修正

编写原理

若依是使用的poi的工具包,而在poi工具包中关于操作excel的类中有一个功能是这样的。

    /**
     * Get the visibility state for a given column----获取给定列的可见性状态
     *
     * @param columnIndex - the column to get (0-based)---要获取的列(从 0 开始)
     * @param hidden - the visibility state of the column---列的可见性状态
     */
    void setColumnHidden(int columnIndex, boolean hidden);

根据上述代码可以知道,只要我在编写流数据到excel中时设置下该属性即可生效。

  • 首先先设置一个保存列号的数组
private Integer[] hiddencolumns;
  • 然后给定一个添加数组的方法
    /**
     * 隐藏性显示第几列,跟若依自带的不同,该方法是调用的sheet的隐藏功能
     * @param rows  从第0列开始
     */
    public void hideColumnNative(Integer ... rows){
        hiddencolumns=rows;
    }
  • 找到若依工具类中的writeSheet()方法,设置以下代码
if (hiddencolumns != null) {
            //设置隐藏
            for (Integer row : hiddencolumns) {
                this.sheet.setColumnHidden(row,true);
            }
        }

完毕!

优化

是否可以设置成跟若依一样,不传递列号,而是传递字段名呢?

Logo

快速构建 Web 应用程序

更多推荐