业务:选定需导出的档案字段,然后导出。
数据库档案字段值表为:信息用户id-档案字段id-档案字段值
已有获取档案信息方法:getFieldValueList(List< Integer> cardFieldIds, Integer userId),传入需导出的档案字段id以及信息用户id,其中若对应值全为空,则返回已设立的默认值。
效果图:
首先从前端获得导出的字段cardFieldIds(以英文逗号隔开的字符串,如1,2,3),
然后从数据库得到信息用户与字段所对应的值,
最后用HSSFWorkbook把数据导出。
@ApiOperation(value = "导出信息数据字段信息", notes = "导出信息数据字段信息")
@GetMapping("/export")
@RequiresPermissions("archive:userCardExport:export")
@ResponseBody
public void export(String cardFieldIds, HttpServletResponse response) throws Exception {
List<UserFieldVO> list = new ArrayList<>();
List<Integer> cardFieldIdList = Convert.toListIntArray(cardFieldIds);
List<TsysUser> archiveUsers = userCardController.listArchiveUsers().getData().getRows();
for (TsysUser user : archiveUsers) {
//用户-字段&值
UserFieldVO userFieldVO = new UserFieldVO();
userFieldVO.setUser(user);
//字段-值集合
Map<String, Object> map = userCardController.getFieldValueList(cardFieldIdList, user.getId());
List<FieldValue> fieldValueList = (List<FieldValue>) map.get("fieldValueList");
//判断字段值是否全为空(即默认值)
boolean b = (boolean) map.get("ifAllNull");
if (b) {
continue;
}
//替换图片&附件值
for (FieldValue fieldValue : fieldValueList) {
if (fieldValue.getField().getFieldType().equals("附件")) {
fieldValue.setFieldValue("附件不支持Excel导出");
} else if (fieldValue.getField().getFieldType().equals("图片")) {
fieldValue.setFieldValue("图片不支持Excel导出");
}
continue;
}
userFieldVO.setFieldValueList(fieldValueList);
list.add(userFieldVO);
}
ExcelUtils.listToExcelByIds(list, "信息数据导出.xls", 6200, response);
}
public static void listToExcelByIds(List<UserFieldVO> list, String fileName, int colWidth, HttpServletResponse response) {
try {
response.setContentType("application/octect-stream"); // 下载文件能正常显示中文
fileName = URLEncoder.encode(fileName, "UTF-8");
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream out = response.getOutputStream();
if (list.size() == 0 || list == null) {
Map<String, String> fields = new LinkedHashMap<>();
fields.put("message", "导出档案信息为空!");
ExcelUtils.ListtoExecl(null, out, fields);
out.flush();
out.close();
} else {
// 创建一个工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建一个工作表
HSSFSheet sheet = workbook.createSheet();
int colSize = list.get(0).getFieldValueList().size();
for (int j = 0; j <= colSize; j++) {
// 调整每一列宽度
sheet.autoSizeColumn((short) j);
// 解决自动设置列宽中文失效的问题
sheet.setColumnWidth(j, colWidth);
}
// 创建标题(第一行)
HSSFRow title = sheet.createRow(0);
for (int j = 0; j <= colSize; j++) {
HSSFCell cell = title.createCell(j);
//设置样式
HSSFCellStyle style = workbook.createCellStyle();
HSSFFont font = workbook.createFont();
font.setFontName("宋体");
font.setFontHeightInPoints((short) 12);// 字体大小
style.setFont(font); //设置字体
cell.setCellStyle(style);
//设置值
if (j == 0) {
cell.setCellValue("信息用户");
continue;
}
cell.setCellValue(list.get(0).getFieldValueList().get((j - 1)).getField().getFieldName());
}
// 创建内容(第二行开始)
for (int i = 1; i <= list.size(); i++) {
HSSFRow row = sheet.createRow(i);
for (int j = 0; j <= colSize; j++) {
HSSFCell cell = row.createCell(j);
if (j == 0) {
cell.setCellValue(list.get((i - 1)).getUser().getUsername());
continue;
}
cell.setCellValue(list.get((i - 1)).getFieldValueList().get((j - 1)).getFieldValue());
}
}
// 将创建好的数据写入输出流
workbook.write(out);
// 关闭workbook
workbook.close();
out.flush();
out.close();
}
} catch (Exception e) {
logger.info(e.toString());
}
}
以上便是后台主要逻辑。
关于前端如何实现“勾选字段时,判断是否存在相同字段,存在则同时勾选”
首先绑定进行选择操作时的点击事件,然后判断是否勾选,若勾选,则将value值相同的其他多选框同时勾选;若不勾选,则同时不勾选。
<div class="row">
<div th:each="field : ${entity['fields']}" class="col-md-3">
<label class="checkbox" th:value="${field.id}">
<input th:id="${field.id}" th:name="${entity['card'].cardName}" th:value="${field.id}"
th:class="styled" type="checkbox" onclick="selectCheck(this)">
<label th:for="${field.id}" th:text="${field.fieldName}"></label>
</label>
</div>
</div>
//点击多选框事件
function selectCheck(object) {
let value = $(object).attr('value');
if ($('input[value="' + value + '"]').get(0).checked) {
$('input[value="' + value + '"]').prop("checked", true)//将其他相同值的多选框同时勾选
} else {
$('input[value="' + value + '"]').prop("checked", false)//同时不勾选
}
}
关于全选和反选则可以看我这篇博客:JQuery实现bootstrap 复选框CheckBox 全选及反选
提交给后台的已勾选的多选框值,需注意值可能有重复,这时需要去重,可看我这篇博客:代码简洁:js去除数组中重复的字符
去重后组成以英文逗号隔开的字符串ids提交至后台,如
window.location.href = window.rootPath + “/UserCardExportController/export?cardFieldIds=” + ids;