# 导入导出

导入导出管理提供了统一的管理方案,使开发人员无需编写代码或少量代码实现各个功能模块的导入导出。

# 1.导入管理

# 1.1配置导入管理

打开导入管理菜单,进入导入管理列表页

导入管理列表

# 1.1.1 新增导入管理

点击新增按钮,填写相应信息,点击保存

导入管理新增

更新页面

导入管理更新

字段信息说明

字段名     字段说明
编码 唯一标识
模板文件 导入页面提示下载的模板,如果未上传模板文件,当用户下载模板文件时,系统会生成默认的模板文件
执行前处理 在文件解析前执行,在此有三种处理方式。不处理:不执行任何操作,sql:执行前sql必填,多条sql之间用;分割,执行类:执行前执行类和执行方法必填,执行类为spring中的bean名称,调用方法参考下面示例
数据处理方式 当选择系统时,将按照配置处理数据。当选择执行类时,数据处理的执行类和执行方法必填,执行类为spring中的bean名称,调用方法参考下面示例
执行后处理 处理完数据之后执行,执行方式同执行前处理

示例:

import com.mediway.hos.app.excel.hosimport.*;
import com.mediway.hos.app.excel.hosimport.execute.ImportAfterExecute;
import com.mediway.hos.app.excel.hosimport.execute.ImportBeforeExecute;
import com.mediway.hos.app.excel.hosimport.execute.ImportExecute;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class ImportTest {

    /**
     * 执行前方法 示例
     * @param params
     */
    public void before(ImportBeforeExecute params){
        //导入配置
        ImportManagement importManagement = params.getImportManagement();

        //导入类型
        ImportType importType = params.getImportType();

        //poi 可以修改文件中信息
        Workbook wb = params.getWb();
        for(Sheet sheet : wb){
            for(Row row : sheet){
                for(Cell cell :row){
                    //修改 cell 里边的值
                }
            }
        }

    }

    /**
     * 执行后方法 示例
     * @param params
     */
    public void after(ImportAfterExecute params){
        //导入配置
        ImportManagement importManagement = params.getImportManagement();

        //导入类型
        ImportType importType = params.getImportType();

        //成功数据, key为sheet名称
        Map<String, List<ImportRow>> successData = params.getSuccess();

        //失败数据, key为sheet名称
        Map<String, List<ImportRow>> failData = params.getError();

        //可以根据成功的数据去做一些处理
        List<ImportRow> importRows = successData.getOrDefault("sheet名称", new ArrayList<>());
        importRows.forEach(importRow -> {
            //数据处理完成之后的数据, key为列配置的编码
            Map<String, ImportColumn> columnMap = importRow.getColumns();

            //saveType 表示该条数据是更新到数据库还是插入到数据库的
            SaveType saveType = importRow.getInsertOrUpdate();

            //获取该条数据行号
            int num = importRow.getNum();
        });
    }

    /**
     * 数据处理方法示例
     * @param importExecute
     */
    public void execute(ImportExecute importExecute){
        //导入类型
        ImportType importType = importExecute.getImportType();
        //导入配置
        ImportManagement importManagement = importExecute.getImportManagement();
        //poi 可以修改文件中信息
        Workbook wb = importExecute.getWb();

        for(Sheet sheet : wb){
            //处理sheet数据

            for(Row row : sheet){
                //处理行数据
                for(Cell cell : row){
                    //处理单元格数据
                }
            }
        }
    }
}



# 1.1.2 更新导入管理

点击导入管理表格行操作列编辑按钮,即可打开导入管理详情页面进行编辑操作。

导入管理更新页

# 1.1.3 删除导入管理

1.点击导入管理表格行操作列删除按钮,即可删除该行数据。

导入管理删除页1

2.选择要删除的行,点击上方删除按钮,即可批量删除

导入管理删除页2

# 1.2 sheet管理

点击导入管理列表中的sheet管理按钮,进入sheet管理页面。

sheet管理按钮

sheet管理列表 sheet管理列表

# 1.2.1 新增sheet管理

点击新增按钮,填写相应信息,点击保存

导入管理新增

字段信息说明

字段名     字段说明
名称 excel文件中sheet页的名称
编码 sheet页中数据插入数据库表名称
开始行 sheet页中开始读取数据的行号,不能小于1
导入排序 sheet页处理导入顺序,按照升序处理
执行前处理 在文件解析前执行,在此有三种处理方式。不处理:不执行任何操作,sql:执行前sql必填,多条sql之间用;分割,执行类:执行前执行类和执行方法必填,执行类为spring中的bean名称,调用方法参考下面示例
数据处理方式 当选择系统时,将按照配置处理数据。当选择执行类时,数据处理的执行类和执行方法必填,执行类为spring中的bean名称,调用方法参考下面示例
唯一字段 用来做唯一校验,校验不通过时可以通过错误数据下载查看。多个唯一字段可以用;分割,联合唯一字段用|分割,比如配置为A;B|C表示A为单一唯一字段,B、C为联合唯一字段
执行后处理 处理完数据之后执行,执行方式同执行前处理

示例:

import com.mediway.hos.app.excel.hosimport.ImportRow;
import com.mediway.hos.app.excel.hosimport.ImportType;
import com.mediway.hos.app.excel.hosimport.SheetManagement;
import com.mediway.hos.app.excel.hosimport.execute.*;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SheetTest {

    /**
     * sheet 导入前处理
     * @param sheetBeforeExecute
     */
    public void before(SheetBeforeExecute sheetBeforeExecute){
        //sheet管理配置信息
        SheetManagement sheetManagement = sheetBeforeExecute.getSheetManagement();
        //导入类型
        ImportType importType = sheetBeforeExecute.getImportType();
        //poi Sheet  存放sheet数据
        Sheet sheet = sheetBeforeExecute.getSheet();

        for(Row row : sheet){
            for(Cell cell : row){

            }
        }
    }

    /**
     * sheet导入后处理
     * @param sheetAfterExecute
     */
    public void after(SheetAfterExecute sheetAfterExecute){
        //sheet管理配置信息
        SheetManagement sheetManagement = sheetAfterExecute.getSheetManagement();
        //导入类型
        ImportType importType = sheetAfterExecute.getImportType();
        //成功数据 (当处理方式为 系统时才会有值)
        List<ImportRow> successRows = sheetAfterExecute.getSuccessRows();
        //失败数据 (当处理方式为 系统时才会有值)
        List<ImportRow> errorRows = sheetAfterExecute.getErrorRows();
    }

    /**
     * 自定sheet处理逻辑
     * @param sheetExecute
     */
    public void execute(SheetExecute sheetExecute){
        //sheet管理配置信息
        SheetManagement sheetManagement = sheetExecute.getSheetManagement();
        //导入类型
        ImportType importType = sheetExecute.getImportType();

        Sheet sheet = sheetExecute.getSheet();

        for(Row row : sheet){
            for(Cell cell : row){

            }
        }
    }
}

# 1.2.2 更新sheet管理

点击sheet管理表格行操作列编辑按钮,即可打开sheet管理详情页面进行编辑操作。

sheet更新页面

# 1.2.3 删除sheet管理

1.点击sheet管理表格行操作列删除按钮,即可删除该行数据。

sheet管理删除页1

2.选择要删除的行,点击上方删除按钮,即可批量删除

sheet管理删除页2

# 1.2.4 复制sheet管理

点击sheet管理表格行操作列复制按钮,即可复制该行数据以及其列管理数据。

sheet管理复制

# 1.3 列管理

点击sheet管理列表中的列管理按钮,进入列管理页面。 列管理按钮

列管理列表 列管理列表

# 1.3.1 新增列管理

点击新增按钮,填写相应信息,点击保存

新增列管理

字段信息说明

字段名     字段说明
名称 列管理的名称
编码 如果为入库字段,则与数据字段保持一致。非入库字段可以自定义编码,但是同一sheet管理下编码不可重复
是否隐藏 开启时表示该配置不为sheet中的列,当关闭时表示该配置为sheet中的列,并且所占列 字段不能为空
所占列 该列在sheet中所占列,例如B、C等,如果不为sheet中列字段,该字段为空
列类型 文件中该列对应excel的类型
值来源 该列管理的值来源,详情请看下面值来源说明
配置信息 当值来源为字典项或联表时需配置
表名 当值来源为联表时需配置,表示关联的哪张表
对比字段 当值来源为联表时需配置,表示关联查询时需根据哪个字段查询。例如配置 userId-user_id;code-user_code,表示用配置的userId列中的值与表中user_id对比,配置的code列与表中user_code对比。生成的查询条件为 where user_id=#{userId} and user_code = #{code}
查询条件 当值来源为联表时需配置。表示关联查询时静态查询条件
数据策略 当值来源为联表时需配置。逐条查询:每处理一条数据,查询一次;全查对比:导入前通过配置将数据全部查出放入缓存,每处理一条数据,只会从缓存中查询数据
单选/多选 当值来源为联表或字段项时生效,当选择多选时,表示该值有多个选项,每个选项用,分割。例如excel中的值为“篮球,羽毛球”,通过字典映射到数据中的值为“basketball,badminton”
数据验证 开启数据验证,在入库时会根据配置验证数据是否满足。如果不满足则在错误数据中展示
是否为空 开启数据验证并且关闭是否为空,则会判断数据不为空
长度 开启数据验证并且配置长度,则会判断数据长度是否小于配置的长度
最小值 开启数据验证并且配置最小值,则会判断数据是否大于配置的最小值
最大值 开启数据验证并且配置最大值,则会判断数据是否小于配置的最大值
是否入库 关闭表示该配置字段不会插入数据库,开启时表示该字段会插入数据库
导入更新 开启状态并更新数据时,则会将该配置的字段更新,关闭状态更新时,该字段将不会更新。通常创建时间、创建人等会关闭导入更新
是否主键 当开启时,会根据该字段的值,判断数据是否存在,如果存在则更新数据,如果不存在则插入数据。可以开启多列主键,判断规则为联合主键。
示例 自动生成模板文件时,生成的示例数据

值来源说明
  • 系统主键: 系统自动为该字生成唯一ID,生成规则为UUID。
  • 直接导入: 将文件中解析的值,插入到数据库中,如果开启数据验证,则会校验数据
  • 字典项: 查询 数据字典 中编码为配置信息的字典信息,根据文件中值与字典名称对比,将匹配数据的字典key插入数据库。 需要配置 配置信息(数据字典中的编码)和单选多选
  • 登陆者ID: 将当前登录者的id插入数据库。
  • 登陆者部门ID: 将当前登录者的部门id插入数据库。
  • 当前时间: 将当前时间插入数据库,常用于创建时间、更新时间。
  • 联表: 通过数据库查询,将结果赋值给该字段。表名填写查询的数据库表名,例如:user。配置信息填写数据库表中要查询的字段名,例如id。如需其他条件可以填写查询条件,例如sex='man' and dept_id=21。如果该字段为多选可以配置为多选。当数据策略选择逐条查询时,处理每条数据时都会先查询缓存,如果缓存不存在,则查询数据库,当数据策略选择全查对比时,处理数据前会通过表名、配置信息、查询条件,将查询数据加载入缓存,处理每条数据时,只会查询缓存。
  • 父子: 处理数据时将按照从父到子的顺序处理数据,并将查询到的值,赋值给该字段。如下图配置代表,首先根据配置查询 `select id from table_name where name=#{pname}`,如果数据存在,将id赋值给pid字段。如果数据不存在,会在当前sheet页中查找name等于pname字段值的数据,如果存在,将id赋值给pid字段。如果数据库和sheet页中都不存,则将pname的值赋值给pid,适用于顶级数据。
  • 默认值: 将 配置信息 直接入库,通常可以配置is_deleted等字段。
父子关系配置图:

新增列管理

# 1.3.2 更新列管理

点击列管理表格行操作列编辑按钮,即可打开列管理详情页面进行编辑操作。

新增列管理

# 1.3.3 删除列管理

1.点击列管理表格行操作列删除按钮,即可删除该行数据。

sheet管理删除页1

2.选择要删除的行,点击上方删除按钮,即可批量删除

sheet管理删除页2

# 1.4 导入组件使用

导入组件的使用

<hos-button
    icon="hos-icom-import"
    @click="importDict()">
    {{ $t("operation.import") }}
</hos-button>

<hos-biz-dialog
    :title="$t('operation.import')"
    uid="uploadDialog"
    :close-on-click-modal="false"
></hos-biz-dialog>

importDict() {
    this.$store.commit("OPEN_DIALOG", {
        component: require("@sys/components/upload/index.vue").default,
        _uid: "uploadDialog",
        props: {
            moduleCode:"test11"
        },
    });
}

其中moduleCode值为导入管理列表中各个规则的编码

# 1.5 导入流程

点击导入按钮,展示导入弹窗,首先选择导入类型。导入类型分为:只添加、只更新、更新或添加 三种。

导入选择类型

点击下一步,进入文件上传步骤。如果没有数据模板可以在页面上下载,编辑完成之后上传文件。

导入上传文件

点击下一步,解析文件然后可以下载错误数据

导入错误数据下载

错误信息会在每行最后一列展示,例如:

导入错误数据展示

# 2.导出管理

# 2.1配置导出管理

打开导出管理菜单,进入导出管理列表页

导出管理列表

# 2.1.1 新增导出管理

点击新增按钮,填写相应信息,点击保存

导出管理新增

字段信息说明

字段名     字段说明
编码 唯一标识
名称 导出管理名称
是否启用 启用或停用导出管理
备注 为该条导出管理配置添加备注信息

# 2.1.2 更新导出管理

点击导出管理表格行操作列编辑按钮,即可打开导出管理详情页面进行编辑操作。

导出管理更新

# 2.1.3 删除导出管理

1.点击导出管理表格行操作列删除按钮,即可删除该行数据。

导出管理删除页1

2.选择要删除的行,点击上方删除按钮,即可批量删除

导出管理删除页2

# 2.2 sheet管理

点击导出管理列表中的sheet管理按钮,进入sheet管理页面。由于实际导出时选择的导出数据只能对应一个表格,所有目前一个导出管理配置只能维护一个sheet管理。

sheet管理按钮

sheet管理列表 sheet管理列表

# 2.2.1 新增sheet管理

点击新增按钮,填写相应信息,点击保存

导出管理新增

字段信息说明

字段名     字段说明
名称 导出excel文件中sheet页的名称
编码 sheet页编码,唯一字段
开始行 sheet页中开始导出数据的行号,不能小于2 ,不设置默认第2行(第1行为列表头)
是否启用 启用或停用sheet管理配置
执行脚本 导出此sheet页配置的查询脚本,可拼接sql语句,目前只支持JS语言脚本

执行脚本示例:

(function() {
    var sql ="select code,name,remark,url,state,http_method,max_call_minute,auth_type,api_category_code,header_structure,path_structure,query_structure,body_structure,response_structure from hos_openapi_info";
    if(exportType=="pageData" || exportType=="selectData"){
        var arr =[];
        for(var id in ids){
            arr.push("'" +ids[id] + "'");
        }
        sql= sql + " where id in (" + arr.join(",") + ")";
    }else if(exportType=="queryData"){
        sql=sql+" where 1=1 ";
        if(params.get("code")!=""){
            sql= sql+" and code like CONCAT('%',CONCAT('"+ params.get("code")+ "','%'))";
        }
        if(params.get("name")!=""){
            sql= sql+" and name like CONCAT('%',CONCAT('"+ params.get("name")+ "','%'))";
        }
        if(params.get("apiCategoryCode")!=""){
            sql= sql + " and api_category_code = '" + params.get ("apiCategoryCode") + "'";
        }
    }
    return sql;
})()

其中exportType是导出类型,分别是导出当前页(pageData)、导出所选数据(selectData)、导出查询数据(queryData);ids是选择的导出数据id集合。还可以传入一些查询参数params,将参数放到Map<String, Object> map集合中,例如:示例脚本中有检索框中的字段code和name,根据实际情况增减查询字段。在点击导出按钮时将参数传入后台解析成一段sql查询语句。其中sql语句中的as别名要和列管理的code值保持一致,之后导出时要根据此code进行匹配查询。

public class GroovyScriptEngineUtil {
    public String getTableData(String scriptContent, SelectExportDTO sDto){
        Map<String,Object> map = new HashMap<>();
        map.put("ids",sDto.getIds());
        map.put("exportType",sDto.getExportType());
        map.put("params", sDto.getParams());
        return groovyUtil.runGroovyScript(scriptContent, map).toString();
    }
    public Object runGroovyScript(String script, Map<String, Object> params) {
        try {
            ScriptEngineManager factory = new ScriptEngineManager();
            ScriptEngine engine = factory.getEngineByName("JS");
            Bindings bindings = engine.createBindings();
            bindings.putAll(params);
            return engine.eval(script, bindings);
        } catch (Exception e) {
            log.error("解析错误", e);
            throw new BaseCommonBusinessException("解析脚本异常");
        }
    }
}

# 2.2.2 更新sheet管理

点击sheet管理表格行操作列编辑按钮,即可打开sheet管理详情页面进行编辑操作。

sheet更新页面

# 2.2.3 删除sheet管理

1.点击sheet管理表格行操作列删除按钮,即可删除该行数据。

sheet管理删除页1

2.选择要删除的行,点击上方删除按钮,即可批量删除

sheet管理删除页2

# 2.3 列管理

点击sheet管理列表中的列管理按钮,进入列管理页面。 列管理按钮

列管理列表 列管理列表

# 2.3.1 新增列管理

点击新增按钮,填写相应信息,点击保存

新增列管理

字段信息说明

字段名     字段说明
名称 列管理及列表头的名称
编码 列管理编码,唯一字段。与sheet管理执行脚本中配置的查询字段要保持一致
是否隐藏 开启时导出excel里不显示此列,默认不隐藏
所占列 该列在sheet中所占列,例如A、B、C等,列类型为多表头时不填,其他类型必填
列类型 导出的excel中该列对应的类型,有多表头、字符型、日期型、数字型、函数型。
值来源 该列管理的值来源,有直接导出、字典项、函数、联表。其中直接导出指直接导出表中查询的数据;字典项指通过字典项code进行值转换,例如性别字段:数据库中存入的值是0、1,而导出的excel需要的值是男、女,此时需要在配置信息字段里配置性别字典code;函数 指定义一些函数来调用获取值,目前先预留此功能;联表指通过sql进行查询数据,需要配置表名配置信息对比字段查询条件 ,例如表名、配置信息、对比字段、查询添加分别配置值为hos_org_employee、relation-pa_person_id、id-org_id、where is_activity=1,表示将对比字段配置的id(已渲染数据列的列code)的值赋给hos_org_employee表的org_id(hos_org_employee标准实际的字段名)字段,然后根据org_id字段的值取配置信息中pa_person_id(hos_org_employee标准实际的字段名)字段的值,将值赋给relation(需要赋值的列code)。查询条件是一个where条件语句,可以不填。配置信息对比字段维护的内容用-分隔开,前面的都是列code,后面的都是表中的实际字段名。
配置信息 当值来源为字典项或联表时需配置
表名 当值来源为联表时需配置,表示关联的哪张表
对比字段 当值来源为联表时需配置,表示关联查询时需根据哪个字段查询
查询条件 当值来源为联表时需配置,表示关联查询时静态查询条件
单选/多选 当值来源为联表或字段项时生效,当选择多选时,表示该值有多个选项,每个选项用,分割。例如excel中的值为“篮球,羽毛球”,通过字典映射到数据中的值为“basketball,badminton”
宽度 改列所占宽度长度,非多表头列需配置,数字值表示几个汉字所占的宽度
颜色 导出时列的背景色,默认无
对齐方式 导出时列的对齐方式,有居中、居左、居右三种方式,默认居左对齐
所属多表头 该列所属多表头,不选默认根表头

# 2.3.2 更新列管理

点击列管理表格行操作列编辑按钮,即可打开列管理详情页面进行编辑操作。

新增列管理

# 2.3.3 删除列管理

1.点击列管理表格行操作列删除按钮,即可删除该行数据。

sheet管理删除页1

2.选择要删除的行,点击上方删除按钮,即可批量删除

sheet管理删除页2

# 2.4 导出组件使用

导出组件的使用

<hos-biz-down
    code="hos_organization"
    :data="pageAllIds"
    :ids="ids"
    :params="form.model"
></hos-biz-down>

导出组件

其中code为导出Sheet接口的入参,需传入该页面对应的code编码。
dataidsparams,分别对应导出当前页导出所选数据导出查询数据三个选项。
data参数传入本页面数据的所有id,类型为Arrayids参数传入本页面中勾选数据的id,类型为Arrayparams参数传入本页面的查询参数,类型为Object

# 2.5 导出流程

点击导出按钮,展示导出弹窗,首先选择导出类型。导出类型分为:导出当前页、导出所选数据、导出查询数据三种。

导出选择类型1


导出类型说明
  • 导出当前页: 只导出当前页的数据。
  • 导出所选数据: 导出勾选的行数据
  • 导出查询数据: 根据检索框的信息,查询符合条件的数据进行导出

点击导出类型,进入导出页,选择要导出的sheet和列,由于导出所选数据只能选择一张表,所有目前只支持单个sheet页导出

导出选择类型2