复杂字段类型的导入导出

复杂字段类型的导入导出


  1. 如果想要导出的字段是该模型关联的对象里的一个字段,则需要在创建模版时使用 “对象.字段” 的方式,并在导出时手动设置该字段

    例如PamirsEmployee模型中的company,使用company.name创建值

    @Field.many2one
    @Field.Relation(relationFields = {"companyCode"}, referenceFields = {"code"})
    @Field(displayName = "所属公司")
    private PamirsCompany company;
    //定义员工导入导出模版
    @Component
    public class EmployeeTemplate implements ExcelTemplateInit {
    
        public static final String TEMPLATE_NAME = "employeeTemplate";
    
        @Override
        public List<ExcelWorkbookDefinition> generator() {
            //可以返回多个模版,导出的时候页面上由用户选择导出模版
            return Collections.singletonList(
                    ExcelHelper.fixedHeader(PetShop.MODEL_MODEL, TEMPLATE_NAME)
                            .createBlock(TEMPLATE_NAME, PetShop.MODEL_MODEL)
                            .setType(ExcelTemplateTypeEnum.EXPORT)
                            //使用company.name获取PamirsCompany里面的name字段
                            .addColumn("company.name", "所属公司")
                            .build());
        }
    }
    //手动设置该字段,如2所示
  2. 如果想要导出的字段是非存储字段,由于默认只导出存储在数据库里的字段,非存储的字段需要在导出时手动设置

    @Slf4j
    @Component
    @Ext(ExcelExportTask.class)
    public class EmpTemplateExportExtPoint extends DefaultExcelExportFetchDataExtPoint {
    
        @Override
        @ExtPoint.Implement(expression = "context.name==\"" + EmployeeTemplate.TEMPLATE_NAME + "\"")
        public List<Object> fetchExportData(ExcelExportTask exportTask, ExcelDefinitionContext context) {
            return super.fetchExportData(exportTask, context);
        }
    
        //重写rawQueryList方法,使用listFieldQuery将非存储字段单独设置
        @Override
        protected List<?> rawQueryList(IWrapper<?> wrapper) {
            List<PamirsEmployee> pamirsEmployeeProxies = (List<PamirsEmployee>) Models.data().queryListByWrapper(wrapper);
            if (CollectionUtils.isNotEmpty(pamirsEmployeeProxies)) {
                new PamirsEmployee().listFieldQuery(pamirsEmployeeProxies, PamirsEmployee::getDepartmentList);
            }
         return pamirsEmployeeProxies;
     }
    }
  3. 如果想要导入的字段存在多个,则可以创建一个代理模型,在代理模型里设置一个字段用来接受该多值字段(在Excel里一个单元格内填写多值字段,每个字段用自定义符号(如:" ; ")进行分割),在创建模版时使用该代理类的模版,在导入导出的时候再根据 “;” 截取

    @Model.model(PamirsEmployeeProxy.MODEL_MODEL)
    @Model(displayName = "员工导出代理")
    @Model.Advanced(type = ModelTypeEnum.PROXY)
    public class PamirsEmployeeProxy extends PamirsEmployee {
    
        private static final long serialVersionUID = -6582160484690807999L;
    
        public static final String MODEL_MODEL = "business.PamirsEmployeeProxy";
    
        @Field.String
        @Field(displayName = "部门编码列表")
        private String departmentCodeList;
    }

    创建模版时创建代理模型的字段

    .addColumn("departmentCodeList", "部门编码列表")

    导入:新建一个类,用来作为导入的扩展点,继承AbstractExcelImportDataExtPointImpl

    @Component
    @Ext(ExcelImportTask.class)
    @Slf4j
    public class EmpTemplateImportExtPoint extends AbstractExcelImportDataExtPointImpl<PamirsEmployeeProxy> {
    //必须加这个方法,它使用EmployeeTemplate.TEMPLATE_NAME来指定导入模版
        @Override
        @ExtPoint.Implement(expression = "importContext.definitionContext.name==\"" + EmployeeTemplate.TEMPLATE_NAME + "\"")
        public Boolean importData(ExcelImportContext importContext, PamirsEmployeeProxy data) {
            //TODO 根据逻辑校验数据
        String departmentCodeList = data.getDepartmentCodeList();
         if (StringUtils.isNotEmpty(departmentCodeList)) {
                String[] departmentCodes = departmentCodeList.split(";");
          ....
        }
          return true;
    }
    }

    导出:新建一个类,用来作为导出的扩展点,继承DefaultExcelExportFetchDataExtPoint

    @Slf4j
    @Component
    @Ext(ExcelExportTask.class)
    @SuppressWarnings({"unchecked"})
    public class EmpTemplateExportExtPoint extends DefaultExcelExportFetchDataExtPoint {
    //必须加这个方法,它使用EmployeeTemplate.TEMPLATE_NAME来指定导出模版
     @Override
     @ExtPoint.Implement(expression = "context.name==\"" + EmployeeTemplate.TEMPLATE_NAME + "\"")
     public List<Object> fetchExportData(ExcelExportTask exportTask, ExcelDefinitionContext context) {
       //TODO 根据逻辑校验数据
            return super.fetchExportData(exportTask, context);
      }
    
     @Override
      protected List<?> rawQueryList(IWrapper<?> wrapper) {
        //TODO 根据逻辑校验行数据
       List<PamirsEmployeeProxy> pamirsEmployeeProxies = (List<PamirsEmployeeProxy>) Models.data().queryListByWrapper(wrapper);
        if (CollectionUtils.isNotEmpty(pamirsEmployeeProxies)) {
        new PamirsEmployeeProxy().listFieldQuery(pamirsEmployeeProxies, PamirsEmployeeProxy::getDepartmentList);
          for (PamirsEmployeeProxy pamirsEmployeeProxy : pamirsEmployeeProxies) {
           List<PamirsDepartment> departmentList = pamirsEmployeeProxy.getDepartmentList();
                  if (CollectionUtils.isNotEmpty(departmentList)) {
                            pamirsEmployeeProxy.setDepartmentCodeList(departmentList.stream()
                                                              .map(PamirsDepartment::getCode)
                                                              .collect(Collectors.joining(";")));
                }
         }
      }
      return pamirsEmployeeProxies;
    }
    }

Oinone社区 作者:yexiu原创文章,如若转载,请注明出处:https://doc.oinone.top/oinone-faq/14289.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

(0)
yexiu的头像yexiu数式员工
上一篇 2024年7月1日 pm1:58
下一篇 2024年7月2日 pm7:32

相关推荐

  • 常见权限问题

    一、系统权限操作手册配置 https://doc.oinone.top/chan-pin-shi-yong-shou-ce/17797.html 二、常见权限问题分析及解决 1.函数如何跳过权限拦截https://doc.oinone.top/wen-ti-zhen-duan/16299.html 2.工作流工作台无权限排查路径https://doc.oinone.top/wen-ti-zhen-duan/15924.html 3.windows环境npm安装依赖提示无权限https://doc.oinone.top/faq/14590.html 4.权限异常排查路径参考https://doc.oinone.top/faq/14391.html 5.自定义RSQL占位符(placeholder)及在权限中使用https://doc.oinone.top/backend/6393.html 6.自定义数据权限拦截处理https://doc.oinone.top/backend/4737.html 7.如何扩展行为权限https://doc.oinone.top/dai-ma-shi-jian/18976.html 8.跳转动作无权限问题排查https://doc.oinone.top/wen-ti-zhen-duan/18678.html

    2024年10月23日
    75300
  • 无代码启动常见问题

    1、执行yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo出现问题: 报错: Could not fetch/save url https://download.docker.com/linux/centos/docker-ce.repo to file /etc/yum.repos.d/docker-ce.repo: [Errno 14] curl#35 – "TCP connection reset by peer 解决方案: # 把docker-ce镜像源设置到阿里云 yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 2、如果重新运行startup.sh失败,可能是docker前面已经启过了还在运行。 解决方案: docker stop designer-allinone docker rm designer-allinone sh startup.sh 3、启动无代码失败 报错: 依赖包版本不匹配 pamirs-business-api已安装版本:[5.1.24],启动中包含的版本:[5.1.12] pamirs-data-audit-api已安装版本:[5.1.24],启动中包含的版本:[5.1.12] pamirs-sys-setting-core已安装版本:[5.1.24],启动中包含的版本:[5.1.12] ······ 解决方案:修改 startup.sh 中的版本修改docker pull 命令中的版本(注意:具体版本号查看https://doc.oinone.top/xin-ren-ru-men/18758.html中) 4、执行vi startup.sh出错,可能是没有修改这个文件的权限,执行chmod 777 startup.sh即可授权

    2024年11月8日
    1.3K00
  • 数据大屏如何绑定页面

    第一步:数据可视化创建大屏。 第二步:界面设计器创建页面,在页面设计时,拖一个数据大屏组件,将大屏绑定到页面中,点击右上角显示母版,准备将页面绑定到菜单上。 第三步:在oinone功能展示应用下,创建一个菜单,点击绑定当前页面,将该页面绑定到菜单上,点击发布。 第四步:进入刚才菜单所属的应用(oinone功能展示),可以看到刚刚新增的菜单,数据大屏就成功绑定到页面上了。

    2024年12月11日
    95600
  • 请确认函数是否存在报错排查路径

    当函数不存在的时候,可能有的原因如下:先确认引入启动环境: 是否引入distribution-session包?(Y/N) 如果 distribution-session 包被引入,可能的原因如下: 先检查 base_function 根据 namespace 和 fun 检查函数是否存在,如果存在,检查 openLevel 是否包含 API 级别(二进制值为 14/12/8)。 在 base_model_data 中根据 res_id 检查 load_module,同一环境中所有jvm服务,加载模块必须在启动模块或启动模块的依赖模块中。 检查 redis 中 base.Model:${modelModel}:model_model 键值是否存在,如果存在,根据函数关键字尝试搜索。 如果上面三步没有找到问题,且所有元数据都存在。distribution-session 包可能没有引入,确认是否需要使用 distribution-session 包。 如果 distribution-session 包没有被引入,可能的原因如下: 先检查 base_function 根据 namespace 和 fun 检查函数是否存在,如果存在,检查 openLevel 是否包含 API 级别。 在 base_model_data 中根据 res_id 检查 load_module,加载模块必须在启动模块中。 自定义gql进行请求报函数是否存在可能的原因 检查Gql请求是否符合规范:参考文章GraphQL Service检查请求类型query/mutation是否和函数定义一致。

    2025年8月29日
    86600
  • 组件问题

    2022年2月12日
    1.2K00

Leave a Reply

登录后才能评论