java:用HSSFWorkbook實現excel導出

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章