• java生成数据库数据到excel当做下拉选择,copy就完事~


    背景:由于需要下载模板,模板包含下拉选择框,但是下拉选择框不想手写,并且需要从数据库读取,由于直接设置excel会有单元格最大255个字符长度限制,所以用到以下部分代码。

    思路:由于数据模板在sheet1,所以将数据库数据读取,写到sheet2里第一行第一列,然后开启数据验证,选取数据列指向sheet1的下拉列表列位置,最后隐藏sheet2页。

    实现:

    1. @Value(value = "${spring.importTemplateFileLocation}")
    2. private String importTemplateFileLocation;
    3. @GetMapping("/loadTemplateFile")
    4. @Operation(summary = "下载项目导入模板")
    5. public void loadTemplateFile(HttpServletResponse response) {
    6. demoService.loadTemplateFile(response);
    7. }
    1. @Override
    2. public void loadTemplateFile(HttpServletResponse response) {
    3. response.setContentType("application/vnd.ms-excel.sheet.macroEnabled.12");
    4. response.setCharacterEncoding("utf-8");
    5. Workbook wb = null;
    6. ServletOutputStream out = null;
    7. try (InputStream in = this.getClass().getResourceAsStream(importTemplateFileLocation)) {
    8. out = response.getOutputStream();
    9. wb = new XSSFWorkbook(in);
    10. // 获取第一个sheet
    11. Sheet sheet = wb.getSheetAt(0);
    12. // 获取第二个sheet
    13. Sheet sheet2 = wb.getSheetAt(1);
    14. // 获取第二个sheet的第一行第一列
    15. int auxColIndex = 0;
    16. // 获取第二个sheet的第一行第一列
    17. int auxRowIndex = 0;
    18. //查询数据库数据
    19. List dataList = new ArrayList<>(););
    20. });
    21. //将下拉数据写入sheet2
    22. for (String option : dataList ) {
    23. Row auxRow = sheet2.createRow(auxRowIndex++);
    24. Cell auxCell = auxRow.createCell(auxColIndex);
    25. auxCell.setCellValue(option);
    26. }
    27. //数据验证选取范围
    28. String dataRange = new CellReference(0, auxColIndex, false, false).formatAsString() + ":" +
    29. new CellReference(leafCategoryList.size() - 1, auxColIndex, false, false).formatAsString();
    30. // 数据验证
    31. DataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet) sheet);
    32. // 加载下拉列表内容
    33. DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint("INDIRECT(\"" + sheet2.getSheetName() + "!" + dataRange + "\")");
    34. // 加载下拉列表验证区域
    35. CellRangeAddressList addressList = new CellRangeAddressList(1, 65535, 1, 1); // 假设列 B(1, 1)
    36. // 数据有效性对象
    37. DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
    38. validation.setSuppressDropDownArrow(true);
    39. validation.setShowErrorBox(true);
    40. sheet.addValidationData(validation);
    41. List programTypeList = new ArrayList<>();
    42. dictDataApi.getAllData("program_type").getData().forEach(data -> {
    43. programTypeList.add(data.getLabel() + ":" + data.getValue());
    44. });
    45. String[] programTypeArr = new String[programTypeList.size()];
    46. programTypeList.toArray(programTypeArr);
    47. ExcelUtils.setValidationData(wb.getSheetAt(0), 1, 65535, 4, 4, programTypeArr);
    48. //隐藏sheet2页
    49. wb.setSheetHidden(wb.getSheetIndex(sheet2), true);
    50. wb.write(out);
    51. } catch (Exception e) {
    52. log.error(e.toString());
    53. } finally {
    54. IOUtils.closeQuietly(wb);
    55. IOUtils.closeQuietly(out);
    56. }
    57. }

     效果:

  • 相关阅读:
    [杂项]从子域名接管到Subtaker
    锐捷交换机查看配置命令
    【Rust 入门学习】3.1 通用的编程概念
    华为程序员,985本科36岁,被公司解约:中年人路在何方?
    HarmonyOS NEXT应用开发之Axios获取解析网络数据
    Subset Selection
    Vue3实战(1)
    html+css+js实现高度过渡效果
    【定语从句练习题】 which 修饰句子
    mindspore::dataset::GetAffineTransform的输出与cv2的输出不同
  • 原文地址:https://blog.csdn.net/qq_43511677/article/details/137927272