怎么做下载网站吗,四川建设考试网,软件外包公司排名前十名,村网通为每个农村建设了网站关于若依导出表格隐藏功能延伸--适用于表格导入更新 编写目的若依现有隐藏策略根据业务需要进行修正编写原理 优化 编写目的
若依框架中#xff0c;已经自带了表格导出功能#xff0c;但是有时根据业务要求需要导出后进行修改后更新的操作#xff0c;如果数据量大且数据库设… 关于若依导出表格隐藏功能延伸--适用于表格导入更新 编写目的若依现有隐藏策略根据业务需要进行修正编写原理 优化 编写目的
若依框架中已经自带了表格导出功能但是有时根据业务要求需要导出后进行修改后更新的操作如果数据量大且数据库设计中不存在联合唯一索引或者不符合要求的情况下则需要我们在导出的文档中存在一个主键id默认该表只用于更新。
若依现有隐藏策略
使用方法hideColumn() 进行隐藏我查看了若依源码发现该隐藏实际为不写入。也就是说隐藏的字段不会写入到excel中。 代码如下
1. public void hideColumn(String... fields){this.excludeFields fields;}
2. public ListObject[] getFields(){ListObject[] fields new ArrayListObject[]();ListField 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){hiddencolumnsrows;}找到若依工具类中的writeSheet()方法设置以下代码
if (hiddencolumns ! null) {//设置隐藏for (Integer row : hiddencolumns) {this.sheet.setColumnHidden(row,true);}}完毕
优化
是否可以设置成跟若依一样不传递列号而是传递字段名呢