diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java index b22e6f987..9773a737f 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java @@ -74,6 +74,26 @@ public class ExcelUtil { return listener.getExcelResult(); } + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param response 响应体 + * @param params 导出参数 + */ + public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response, Map params) { + try { + resetResponse(sheetName, response); + ServletOutputStream os = response.getOutputStream(); + List columnNameList = StringUtils.splitList((String) params.get("columnNames"), ","); + exportExcel(list, sheetName, clazz, false, os, null, columnNameList); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + /** * 导出excel * @@ -203,6 +223,36 @@ public class ExcelUtil { builder.doWrite(list); } + /** + * 导出excel + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param clazz 实体类 + * @param merge 是否合并单元格 + * @param os 输出流 + * @param columnNames 列名集合,为空时根据类注解导出所有字段 + */ + public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, + OutputStream os, List options, Collection columnNames) { + ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz) + .includeColumnFieldNames(columnNames) + .autoCloseStream(false) + // 自动适配 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .registerWriteHandler(new DataWriteHandler(clazz)) + .sheet(sheetName); + if (merge) { + // 合并处理器 + builder.registerWriteHandler(new CellMergeStrategy(list, true)); + } + // 添加下拉框操作 + builder.registerWriteHandler(new ExcelDownHandler(options)); + builder.doWrite(list); + } + /** * 单表多数据模板导出 模板格式为 {.属性} * diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java index f31c54074..1b632baa9 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java @@ -92,7 +92,7 @@ public class TestDemoController extends BaseController { // for (TestDemoVo vo : list) { // vo.setId(1234567891234567893L); // } - ExcelUtil.exportExcel(list, "测试单表", TestDemoVo.class, response); + ExcelUtil.exportExcel(list, "测试单表", TestDemoVo.class, response, bo.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm index 64389717d..137b99703 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -63,7 +63,7 @@ public class ${ClassName}Controller extends BaseController { @PostMapping("/export") public void export(${ClassName}Bo bo, HttpServletResponse response) { List<${ClassName}Vo> list = ${className}Service.queryList(bo); - ExcelUtil.exportExcel(list, "${functionName}", ${ClassName}Vo.class, response); + ExcelUtil.exportExcel(list, "${functionName}", ${ClassName}Vo.class, response, bo.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm index a92d19adc..ef4854e88 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm @@ -245,6 +245,8 @@ + + @@ -258,6 +260,7 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { ${dictsNoSymbol} } = toRefs(proxy?.useDict(${dicts})); #end +const exportSelector = ref(null); const ${businessName}List = ref<${BusinessName}VO[]>([]); const buttonLoading = ref(false); const loading = ref(true); @@ -448,11 +451,15 @@ const handleDelete = async (row?: ${BusinessName}VO) => { /** 导出按钮操作 */ const handleExport = () => { - proxy?.download('${moduleName}/${businessName}/export', { - ...queryParams.value - }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`) + exportSelector.value.init(); } +/** 导出动态列回调 */ +const exportCallback = (columnNames: string[]) => { + const params = proxy?.addExportClassNameAndColumnNames(queryParams.value, columnNames); + proxy?.download('${moduleName}/${businessName}/export', params, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`) +}; + onMounted(() => { getList(); }); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java index 98ac2d58f..e155fe4e4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java @@ -50,7 +50,7 @@ public class SysLogininforController extends BaseController { @PostMapping("/export") public void export(SysLogininforBo logininfor, HttpServletResponse response) { List list = logininforService.selectLogininforList(logininfor); - ExcelUtil.exportExcel(list, "登录日志", SysLogininforVo.class, response); + ExcelUtil.exportExcel(list, "登录日志", SysLogininforVo.class, response, logininfor.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java index 575aba6b1..8b11239cb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java @@ -48,7 +48,7 @@ public class SysOperlogController extends BaseController { @PostMapping("/export") public void export(SysOperLogBo operLog, HttpServletResponse response) { List list = operLogService.selectOperLogList(operLog); - ExcelUtil.exportExcel(list, "操作日志", SysOperLogVo.class, response); + ExcelUtil.exportExcel(list, "操作日志", SysOperLogVo.class, response, operLog.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java index eaed06847..ade78dd64 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java @@ -53,7 +53,7 @@ public class SysClientController extends BaseController { @PostMapping("/export") public void export(SysClientBo bo, HttpServletResponse response) { List list = sysClientService.queryList(bo); - ExcelUtil.exportExcel(list, "客户端管理", SysClientVo.class, response); + ExcelUtil.exportExcel(list, "客户端管理", SysClientVo.class, response, bo.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java index c73c3866f..d59a33e87 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java @@ -48,7 +48,7 @@ public class SysConfigController extends BaseController { @PostMapping("/export") public void export(SysConfigBo config, HttpServletResponse response) { List list = configService.selectConfigList(config); - ExcelUtil.exportExcel(list, "参数数据", SysConfigVo.class, response); + ExcelUtil.exportExcel(list, "参数数据", SysConfigVo.class, response, config.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java index 57527511e..41bc4d9ca 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java @@ -52,7 +52,7 @@ public class SysDictDataController extends BaseController { @PostMapping("/export") public void export(SysDictDataBo dictData, HttpServletResponse response) { List list = dictDataService.selectDictDataList(dictData); - ExcelUtil.exportExcel(list, "字典数据", SysDictDataVo.class, response); + ExcelUtil.exportExcel(list, "字典数据", SysDictDataVo.class, response, dictData.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java index 67c1f5133..810313e1b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java @@ -48,7 +48,7 @@ public class SysDictTypeController extends BaseController { @PostMapping("/export") public void export(SysDictTypeBo dictType, HttpServletResponse response) { List list = dictTypeService.selectDictTypeList(dictType); - ExcelUtil.exportExcel(list, "字典类型", SysDictTypeVo.class, response); + ExcelUtil.exportExcel(list, "字典类型", SysDictTypeVo.class, response, dictType.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysImportExportController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysImportExportController.java new file mode 100644 index 000000000..a1604a130 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysImportExportController.java @@ -0,0 +1,35 @@ +package org.dromara.system.controller.system; + +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.vo.SysExportColumnVo; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 导入导出 + * + * @author Toired + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/importExport") +public class SysImportExportController extends BaseController { + + /** + * 查询导出列 + * @param className 全限定类名 + */ + @GetMapping("/columns") + public R> columns(@NotBlank(message = "全限定类名不能为空") String className) { + return R.ok(SysExportColumnVo.parseExcelColumns(className)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java index 5333a4aef..2f9766ba4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java @@ -51,7 +51,7 @@ public class SysPostController extends BaseController { @PostMapping("/export") public void export(SysPostBo post, HttpServletResponse response) { List list = postService.selectPostList(post); - ExcelUtil.exportExcel(list, "岗位数据", SysPostVo.class, response); + ExcelUtil.exportExcel(list, "岗位数据", SysPostVo.class, response, post.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java index d4a9dc8a4..54fc6409c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -57,7 +57,7 @@ public class SysRoleController extends BaseController { @PostMapping("/export") public void export(SysRoleBo role, HttpServletResponse response) { List list = roleService.selectRoleList(role); - ExcelUtil.exportExcel(list, "角色数据", SysRoleVo.class, response); + ExcelUtil.exportExcel(list, "角色数据", SysRoleVo.class, response, role.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java index 66c1b7ddf..6b84c5cd8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java @@ -63,7 +63,7 @@ public class SysTenantController extends BaseController { @PostMapping("/export") public void export(SysTenantBo bo, HttpServletResponse response) { List list = tenantService.queryList(bo); - ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response); + ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response, bo.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java index 4bfe597cf..dade3cbc4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java @@ -69,7 +69,7 @@ public class SysTenantPackageController extends BaseController { @PostMapping("/export") public void export(SysTenantPackageBo bo, HttpServletResponse response) { List list = tenantPackageService.queryList(bo); - ExcelUtil.exportExcel(list, "租户套餐", SysTenantPackageVo.class, response); + ExcelUtil.exportExcel(list, "租户套餐", SysTenantPackageVo.class, response, bo.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index e1e868a6e..abc583026 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -72,7 +72,7 @@ public class SysUserController extends BaseController { @PostMapping("/export") public void export(SysUserBo user, HttpServletResponse response) { List list = userService.selectUserExportList(user); - ExcelUtil.exportExcel(list, "用户数据", SysUserExportVo.class, response); + ExcelUtil.exportExcel(list, "用户数据", SysUserExportVo.class, response, user.getParams()); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysExportColumnVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysExportColumnVo.java new file mode 100644 index 000000000..9ab6b8f08 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysExportColumnVo.java @@ -0,0 +1,57 @@ +package org.dromara.system.domain.vo; + +import cn.hutool.core.util.ReflectUtil; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +/** + * 表列信息 + * + * @author Toired + * */ +@Slf4j +@Data +public class SysExportColumnVo { + + private String label; + + private String value; + + /** + * 根据类的全限定名获取Excel列信息 + * + * @param className 类的全限定名 + * @return List Excel列信息列表 + */ + public static List parseExcelColumns(String className) { + List columns = new ArrayList<>(); + try { + // 获取类对象 + Class clazz = Class.forName(className); + // 获取所有字段,包括私有字段 + Field[] fields = ReflectUtil.getFields(clazz); + + for (Field field : fields) { + // 获取ExcelProperty注解 + ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); + if (excelProperty != null) { + SysExportColumnVo column = new SysExportColumnVo(); + // 设置label为ExcelProperty注解的value值 + column.setLabel(excelProperty.value()[0]); + // 设置value为字段名 + column.setValue(field.getName()); + columns.add(column); + } + } + } catch (ClassNotFoundException e) { + log.error("类不存在: {}" + className, e); + } + return columns; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java index 98825d92d..064b89062 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/TestLeaveController.java @@ -56,7 +56,7 @@ public class TestLeaveController extends BaseController { @PostMapping("/export") public void export(TestLeaveBo bo, HttpServletResponse response) { List list = testLeaveService.queryList(bo); - ExcelUtil.exportExcel(list, "请假", TestLeaveVo.class, response); + ExcelUtil.exportExcel(list, "请假", TestLeaveVo.class, response, bo.getParams()); } /**