Pre Merge pull request !642 from Toired/点击导出按钮可选导出列

This commit is contained in:
Toired 2025-01-25 11:56:50 +00:00 committed by Gitee
commit d167267adb
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
18 changed files with 166 additions and 17 deletions

View File

@ -74,6 +74,26 @@ public class ExcelUtil {
return listener.getExcelResult();
}
/**
* 导出excel
*
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @param clazz 实体类
* @param response 响应体
* @param params 导出参数
*/
public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response, Map<String, Object> params) {
try {
resetResponse(sheetName, response);
ServletOutputStream os = response.getOutputStream();
List<String> 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 <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, boolean merge,
OutputStream os, List<DropDownOptions> options, Collection<String> 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);
}
/**
* 单表多数据模板导出 模板格式为 {.属性}
*

View File

@ -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());
}
/**

View File

@ -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());
}
/**

View File

@ -245,6 +245,8 @@
</div>
</template>
</el-dialog>
<!-- 动态列导出选择弹窗 -->
<ExportSelector ref="exportSelector" @submitCallback="exportCallback" :className="'${packageName}.domain.vo.${ClassName}Vo'"></ExportSelector>
</div>
</template>
@ -258,6 +260,7 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { ${dictsNoSymbol} } = toRefs<any>(proxy?.useDict(${dicts}));
#end
const exportSelector = ref<ExportSelector>(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();
});

View File

@ -50,7 +50,7 @@ public class SysLogininforController extends BaseController {
@PostMapping("/export")
public void export(SysLogininforBo logininfor, HttpServletResponse response) {
List<SysLogininforVo> list = logininforService.selectLogininforList(logininfor);
ExcelUtil.exportExcel(list, "登录日志", SysLogininforVo.class, response);
ExcelUtil.exportExcel(list, "登录日志", SysLogininforVo.class, response, logininfor.getParams());
}
/**

View File

@ -48,7 +48,7 @@ public class SysOperlogController extends BaseController {
@PostMapping("/export")
public void export(SysOperLogBo operLog, HttpServletResponse response) {
List<SysOperLogVo> list = operLogService.selectOperLogList(operLog);
ExcelUtil.exportExcel(list, "操作日志", SysOperLogVo.class, response);
ExcelUtil.exportExcel(list, "操作日志", SysOperLogVo.class, response, operLog.getParams());
}
/**

View File

@ -53,7 +53,7 @@ public class SysClientController extends BaseController {
@PostMapping("/export")
public void export(SysClientBo bo, HttpServletResponse response) {
List<SysClientVo> list = sysClientService.queryList(bo);
ExcelUtil.exportExcel(list, "客户端管理", SysClientVo.class, response);
ExcelUtil.exportExcel(list, "客户端管理", SysClientVo.class, response, bo.getParams());
}
/**

View File

@ -48,7 +48,7 @@ public class SysConfigController extends BaseController {
@PostMapping("/export")
public void export(SysConfigBo config, HttpServletResponse response) {
List<SysConfigVo> list = configService.selectConfigList(config);
ExcelUtil.exportExcel(list, "参数数据", SysConfigVo.class, response);
ExcelUtil.exportExcel(list, "参数数据", SysConfigVo.class, response, config.getParams());
}
/**

View File

@ -52,7 +52,7 @@ public class SysDictDataController extends BaseController {
@PostMapping("/export")
public void export(SysDictDataBo dictData, HttpServletResponse response) {
List<SysDictDataVo> list = dictDataService.selectDictDataList(dictData);
ExcelUtil.exportExcel(list, "字典数据", SysDictDataVo.class, response);
ExcelUtil.exportExcel(list, "字典数据", SysDictDataVo.class, response, dictData.getParams());
}
/**

View File

@ -48,7 +48,7 @@ public class SysDictTypeController extends BaseController {
@PostMapping("/export")
public void export(SysDictTypeBo dictType, HttpServletResponse response) {
List<SysDictTypeVo> list = dictTypeService.selectDictTypeList(dictType);
ExcelUtil.exportExcel(list, "字典类型", SysDictTypeVo.class, response);
ExcelUtil.exportExcel(list, "字典类型", SysDictTypeVo.class, response, dictType.getParams());
}
/**

View File

@ -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<List<SysExportColumnVo>> columns(@NotBlank(message = "全限定类名不能为空") String className) {
return R.ok(SysExportColumnVo.parseExcelColumns(className));
}
}

View File

@ -51,7 +51,7 @@ public class SysPostController extends BaseController {
@PostMapping("/export")
public void export(SysPostBo post, HttpServletResponse response) {
List<SysPostVo> list = postService.selectPostList(post);
ExcelUtil.exportExcel(list, "岗位数据", SysPostVo.class, response);
ExcelUtil.exportExcel(list, "岗位数据", SysPostVo.class, response, post.getParams());
}
/**

View File

@ -57,7 +57,7 @@ public class SysRoleController extends BaseController {
@PostMapping("/export")
public void export(SysRoleBo role, HttpServletResponse response) {
List<SysRoleVo> list = roleService.selectRoleList(role);
ExcelUtil.exportExcel(list, "角色数据", SysRoleVo.class, response);
ExcelUtil.exportExcel(list, "角色数据", SysRoleVo.class, response, role.getParams());
}
/**

View File

@ -63,7 +63,7 @@ public class SysTenantController extends BaseController {
@PostMapping("/export")
public void export(SysTenantBo bo, HttpServletResponse response) {
List<SysTenantVo> list = tenantService.queryList(bo);
ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response);
ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response, bo.getParams());
}
/**

View File

@ -69,7 +69,7 @@ public class SysTenantPackageController extends BaseController {
@PostMapping("/export")
public void export(SysTenantPackageBo bo, HttpServletResponse response) {
List<SysTenantPackageVo> list = tenantPackageService.queryList(bo);
ExcelUtil.exportExcel(list, "租户套餐", SysTenantPackageVo.class, response);
ExcelUtil.exportExcel(list, "租户套餐", SysTenantPackageVo.class, response, bo.getParams());
}
/**

View File

@ -72,7 +72,7 @@ public class SysUserController extends BaseController {
@PostMapping("/export")
public void export(SysUserBo user, HttpServletResponse response) {
List<SysUserExportVo> list = userService.selectUserExportList(user);
ExcelUtil.exportExcel(list, "用户数据", SysUserExportVo.class, response);
ExcelUtil.exportExcel(list, "用户数据", SysUserExportVo.class, response, user.getParams());
}
/**

View File

@ -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<SysExportColumnVo> Excel列信息列表
*/
public static List<SysExportColumnVo> parseExcelColumns(String className) {
List<SysExportColumnVo> 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;
}
}

View File

@ -56,7 +56,7 @@ public class TestLeaveController extends BaseController {
@PostMapping("/export")
public void export(TestLeaveBo bo, HttpServletResponse response) {
List<TestLeaveVo> list = testLeaveService.queryList(bo);
ExcelUtil.exportExcel(list, "请假", TestLeaveVo.class, response);
ExcelUtil.exportExcel(list, "请假", TestLeaveVo.class, response, bo.getParams());
}
/**