• 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. }

     效果:

  • 相关阅读:
    智能AI写作系统+ChatGPT程序源码搭建部署教程+支持GPT4.0/AI绘画
    雪崩问题以及sentinel的使用
    Ubuntu系统配置DDNS-GO【笔记】
    Java多线程
    Chrome内存追踪
    爬虫练习(一)
    计算机毕业设计基于springboot+vue+elementUI的网吧管理系统(源码+系统+mysql数据库+Lw文档)
    javascript如何获取对象的key和value
    测试用例千万不能随便,记录由一个测试用例异常引起的思考
    面向对象之反射
  • 原文地址:https://blog.csdn.net/qq_43511677/article/details/137927272