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

以上が背景の主なロジックです。

フロントエンドを実現する方法「フィールドをチェックするとき、同じフィールドが存在するかどうかを確認し、存在する場合は同時に確認する」
は、選択操作を実行するときに最初にクリックイベントをバインドし、次にチェックされている場合は他の値が同じかどうかを確認するかどうかを決定します。マルチチェックボックスは同時にチェックされます。チェックされていない場合、同時にチェックされません。

                 <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はブートストラップチェックボックスチェックボックスの完全選択と逆選択を実装しています

バックグラウンドに送信されたチェックボックスの値。値が重複する可能性があることに注意してください。現時点では、値を繰り返す必要があります。私のブログを参照してください:コードは単純です:jsは配列内の繰り返される文字を削除します

重複排除の後、コンマで区切られたIDが
ウィンドウに送信されます(例:window.location.href = window.rootPath + "/ UserCardExportController / export?CardFieldIds =" "+ ids;

68件のオリジナル記事が公開されました 賞賛さ れた128件 8万回の閲覧

おすすめ

転載: blog.csdn.net/qq_39380155/article/details/104976811