# 导入导出
导入导出管理提供了统一的管理方案,使开发人员无需编写代码或少量代码实现各个功能模块的导入导出。
# 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.点击导入管理表格行操作列删除按钮,即可删除该行数据。
2.选择要删除的行,点击上方删除按钮,即可批量删除
# 1.2 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管理详情页面进行编辑操作。
# 1.2.3 删除sheet管理
1.点击sheet管理表格行操作列删除按钮,即可删除该行数据。
2.选择要删除的行,点击上方删除按钮,即可批量删除
# 1.2.4 复制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.点击列管理表格行操作列删除按钮,即可删除该行数据。
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.点击导出管理表格行操作列删除按钮,即可删除该行数据。
2.选择要删除的行,点击上方删除按钮,即可批量删除
# 2.2 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管理详情页面进行编辑操作。
# 2.2.3 删除sheet管理
1.点击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.点击列管理表格行操作列删除按钮,即可删除该行数据。
2.选择要删除的行,点击上方删除按钮,即可批量删除
# 2.4 导出组件使用
导出组件的使用
<hos-biz-down
code="hos_organization"
:data="pageAllIds"
:ids="ids"
:params="form.model"
></hos-biz-down>
其中code
为导出Sheet接口的入参,需传入该页面对应的code编码。
data
、ids
、params
,分别对应导出当前页
、导出所选数据
、导出查询数据
三个选项。
data
参数传入本页面数据的所有id
,类型为Array
。
ids
参数传入本页面中勾选数据的id
,类型为Array
。
params
参数传入本页面的查询参数,类型为Object
。
# 2.5 导出流程
点击导出按钮,展示导出弹窗,首先选择导出类型。导出类型分为:导出当前页、导出所选数据、导出查询数据三种。
导出类型说明
- 导出当前页: 只导出当前页的数据。
- 导出所选数据: 导出勾选的行数据
- 导出查询数据: 根据检索框的信息,查询符合条件的数据进行导出
点击导出类型,进入导出页,选择要导出的sheet和列,由于导出所选数据只能选择一张表,所有目前只支持单个sheet页导出