复杂字段类型的导入导出

复杂字段类型的导入导出


  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

相关推荐

  • 无代码启动常见问题

    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日
    59600
  • 部署问题

    2022年3月12日
    98900
  • 常见权限问题

    一、系统权限操作手册配置 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日
    37300
  • 常见启动问题

    一、配置问题: 1.证书问题,如过期、路径等。排查文档:https://doc.oinone.top/install/backendinstall/13760.html2.模型中关系字段配置问题。排查文档:https://doc.oinone.top/wen-ti-zhen-duan/15999.html3.跨模块依赖诸多问题。排查文档:https://doc.oinone.top/install/backendinstall/14824.html4.代码问题。如枚举类忘记添加类注解等 二、 环境问题: 1.版本问题。同base库的多个环境版本不一致,从而引发系列问题,如数据表重复新增删除。2.数据表唯一键冲突。 三、场景启动问题分析及解决方案 1.后端启动慢如何排查https://doc.oinone.top/faq/16613.html 2.验证服务是否启动成功https://doc.oinone.top/oinone-faq/17905.html 3.启动时提示未配置SQL记录存储目录,然后启动失败报错https://doc.oinone.top/faq/17048.html 4.启动报错,公共环境开启了元数据保护模式,本地开发环境需配置https://doc.oinone.top/faq/17045.html 5.在docker容器里启动,路径配置正确,仍旧报错https://doc.oinone.top/faq/17040.html 6.容器启动服务,License认证报错https://doc.oinone.top/faq/17039.html 7.系统启动耗时过长,内存耗用过大https://doc.oinone.top/faq/6659.html 8.启动提示:依赖的模块不存在https://doc.oinone.top/faq/6630.html 9.协同模式下,本地开发的模型在设计器里找不到https://doc.oinone.top/faq/17110.html 10.测试服务访问测试服务里docker容器的设计器服务接口,报dubbo接口不存在https://doc.oinone.top/faq/17055.html

    2024年10月23日
    37900
  • 验证服务是否启动成功

    验证服务是否启动成功可以调用****/ruok接口,端口是服务器实际运行端口返回imok是启动成功,返回no是启动失败 @Order(Ordered.LOWEST_PRECEDENCE) @RestController public class HealthCheckController implements ApplicationListener<ApplicationStartedEvent> { private static boolean IM_OK = false; private static final String SUCCESS_STRING = "imok"; private static final String FAILURE_STRING = "no"; @GetMapping("/ruok") public String ruok() { if (IM_OK) { return SUCCESS_STRING; } return FAILURE_STRING; } @Override public void onApplicationEvent(ApplicationStartedEvent event) { IM_OK = true; } public static boolean imok() { return IM_OK; } }

    2024年9月27日
    76500

Leave a Reply

登录后才能评论