業務:選定需導出的檔案字段,然後導出。
數據庫檔案字段值表爲:信息用戶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;