若依导入导出excel时excel下拉列表选择超过50个就不显示的问题

文章讲述了在业务系统中遇到大量自定义下拉选项时,如何通过创建隐藏sheet并利用POI库的限制来处理Excel导入导出的问题,包括创建DropDownExpandList方法和调整表格样式以适应大容量下拉选项。
摘要由CSDN通过智能技术生成

需求背景:
   业务系统需要做EXCEL的导入和导出功能,某些字段是自定义下拉选择,需要从数据库中获取后,写入excel中,当下拉数量为十几个时是可以正常显示的,但是超过50个就不显示了,折腾了一早上,也没有报错信息,只能设置断点一步一步查看,结果也没有异常,百度查看是因为poi导出限制了,下面是我的一些解决经验分享给大家
方法:总体思路就是创建一个隐藏的sheet用来存放下拉选择的数据,再引入到原来的表格当中实现下拉选择
1.在原有的ExcelUtil中增加createDropDownExpandList方法

    /**
     * 创建下拉列表选项【适用长度超过255,或者下拉框数量超过50】
     * @param workbook
     * @param values   下拉框的选项值
     * @param firstRow 起始行(从0开始)
     * @param lastRow  终止行(从0开始)
     * @param firstCol 起始列(从0开始)
     * @param lastCol  终止列(从0开始)
     */
    public static void createDropDownExpandList(Workbook workbook, String[] values, int firstRow, int lastRow, int firstCol, int lastCol) {
        Sheet sheet = workbook.getSheetAt(0);
        //创建名为"hidden"的新Sheet页
        Sheet hidden = workbook.createSheet("hidden");

        //遍历选项值填充到"hidden"页的第一列
        Cell cell = null;
        for (int i = 0; i < values.length; i++) {
            String value = values[i];
            Row row = hidden.createRow(i); //第i行
            cell = row.createCell(0);      //第1列
            cell.setCellValue(value);
        }

        //指定"hidden"页面选项值的坐标,上面均填充到第一列 所以从A1开始到A values的个数
        Name name = workbook.createName();
        name.setNameName("hidden");
        name.setRefersToFormula("hidden!$A$1:$A$" + values.length);

        //将"hidden"的数据加载
        DataValidationHelper helper = sheet.getDataValidationHelper();
        DataValidationConstraint constraint = helper.createFormulaListConstraint("hidden");

        //设置下拉框作用区域,起始行 终止行 起始列 终止列
        CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
        DataValidation dataValidation = helper.createValidation(constraint, addressList);

        //设置第二个sheet页为隐藏
        workbook.setSheetHidden(1, true);

        // Excel兼容性问题
        if (dataValidation instanceof XSSFDataValidation) {
            dataValidation.setSuppressDropDownArrow(true);
            dataValidation.setShowErrorBox(true);
        } else {
            dataValidation.setSuppressDropDownArrow(false);
        }
        sheet.addValidationData(dataValidation);
    }

2.在创建样式中增加相应的判断,我的这里是自定义的extendCombo,判断数量或者长度是否超过,超过就调用createDropDownExpandList新建一个隐藏的sheet,否则就不用

    /**
     * 创建表格样式
     */
    public void setDataValidation(Excel attr, Row row, int column)
    {
        if (attr.name().indexOf("注:") >= 0)
        {
            sheet.setColumnWidth(column, 6000);
        }
        else
        {
            // 设置列宽
            sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256));
        }
        if(StringUtils.isNotBlank(attr.extendCombo())){
            if(extendCombos!=null && extendCombos.containsKey(attr.extendCombo())){
                if (extendCombos.get(attr.extendCombo()).length > 15 || StringUtils.join(extendCombos.get(attr.extendCombo())).length() > 255) {
                    // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到
                    createDropDownExpandList(wb, extendCombos.get(attr.extendCombo()), 1, 20000, column, column);
                } else {
                    // 提示信息或只能选择不能输入的列内容.
                    setPromptOrValidation(sheet, extendCombos.get(attr.extendCombo()), attr.prompt(), 1, 20000, column, column);
                }
            }
        }else if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0)
        {
            // 提示信息或只能选择不能输入的列内容. 100
            setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 20000, column, column);
        }else if(StringUtils.isNotEmpty(attr.dictType())){
            //
            String[] dictLabels = DictUtils.getDictLabelForImport(attr.dictType(), ";");
            if(dictLabels!=null){
                setPromptOrValidation(sheet, dictLabels, attr.prompt(), 1, 20000, column, column);
            }
        }
    }

附:配置下拉项(导入用户信息,导入模板的部门项为下拉选择项)
在Excel.java中增加

    /**
     * 另一个类中的属性名称,支持多级获取,以小数点隔开
     */
    public String targetAttr() default "";
    /**
     * 列表下拉选择,对应Map的key值
     * @return
     */
    public String extendCombo() default "";

在对应导入的实体类中增加部门对象
 

    /**
     * 所属公司
     */
    @Excel(name = "所属公司", type = Excel.Type.EXPORT)
    private String deptName;

    /**
     * 所属公司
     */
    private Long deptId;

    /** 部门对象 */
    @Excels({
            @Excel(name = "所属公司", targetAttr = "deptName", extendCombo = "dept", prompt = "必填", type = Excel.Type.IMPORT)
    })
    @Excel(type = Excel.Type.SHOW)
    private SysDept dept;

在ExcelUtil中增加

    /**
     * 用于下拉列表选择 如部门下拉选择
     */
    private Map<String, String[]> extendCombos;

    public Map<String, String[]> getExtendCombos() {
        return extendCombos;
    }

    public void setExtendCombos(Map<String, String[]> extendCombos) {
        this.extendCombos = extendCombos;
    }

配置好上面的之后,在导出模板的接口中增加获取部门信息,将信息传入excel中

    @PostMapping("/export")
    @ResponseBody
    public AjaxResult export(StockBaseInfo stockBaseInfo) {
        Map<String, String[]> map = new HashMap<>();
        SysDept dept = new SysDept();
        List<String> depts = deptService.selectSysDeptForImport(dept);
        List<StockBaseInfo> list = stockBaseInfoService.selectStockBaseList(stockBaseInfo);
        ExcelUtil<StockBaseInfo> util = new ExcelUtil<StockBaseInfo>(StockBaseInfo.class);
        if(StringUtils.isNotEmpty(depts)) {
            String[] arr = new String[depts.size()];
            map.put("dept", depts.toArray(arr));
        }
        util.setExtendCombos(map);
        return util.exportExcel(list, "信息数据");
    }

ExcelUtil

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: Simulink作为一款强大的动态仿真软件,在系统设计过程中有着广泛的应用。Simulink可以通过数据管理功能将仿真结果直接导出Excel格式文件。下面就是具体的导出步骤: 1. 在Simulink系统中选择导出的数据信号,在Simulation > Data Inspector 中进行选择。 2. 在Data Inspector中选择导出Signal,选择“Export To Workspace”功能,选择导出的文件类型。在这里我们要选择“Timeseries”文件类型,并且确认数据导出为一个单独的工作表。 3. 在选项卡中选择“Base workspace”,保存文件将其命名为“mydata.mat”,保存到Matlab工作目录中。 4. 在Matlab中打开“mydata.mat”文件,通过load命令导入数据。 5. 运行“excel”相关命令,打开Excel程序,并新建一个工作簿。 6. 在Matlab命令窗口中,使用xlswrite函数将导出数据写入Excel文件中。 7. 在Excel中打开导出的文件,查看导出的数据是否符合我们的预期。 通过上述步骤就可以将Simulink仿真的数据直接导出Excel文件中,方便进行数据分析、绘制图表等操作,极大地提高了Simulink仿真应用的效率。 ### 回答2: Simulink是一个功能强大的工具,可以用来建模、仿真和分析复杂系统。在Simulink中,我们可以使用数据行来存储数据,并将其输出为Excel文件。以下是详细步骤: 1.在Simulink中打开你的模型。 2.点击右上角的“Simulation”选项卡,然后进入“Data Logging”选项卡。 3.在“Data Logging”选项卡中,启用数据记录选择框。 4.单击右侧的“Signal Logging”下拉菜单,并选择“数据存储”。 5.单击“新建...”按钮,然后输入一个文件名和一个保存路径。 6.在“Logging Format”下拉菜单中,选择Excel”。 7.单击“Apply”并“OK”,保存设置。 8.运行Simulink模型,Simulink将开始记录数据,并将其导出Excel文件。 总之,将Simulink数据导出Excel文件非常简单。您只需要启用数据记录选项,并将输出格式设置为Excel即可。这将帮助您轻松掌握Simulink数据,并在必要与其他应用程序共享它。 ### 回答3: Simulink可以将模拟结果导出Excel文件,以便后续分析和处理。以下是导出Excel的步骤: 1. 在Simulink中打开模型,并运行仿真以生成仿真结果。 2. 在仿真结果窗口中,选择“View”菜单,在下拉列表选择“Signal Logging”。 3. 在Signal Logging界面中,选择导出Excel的信号,并单击“Select all”按钮,选择所有信号。然后单击“Export to Workspace”按钮。 4. 在弹出的“Export to Workspace”对话框中,选择“Timeseries”作为数据类型,并将“Name”设置为相应的变量名。单击“OK”按钮,信号数据将被导出到MATLAB工作区。 5. 在MATLAB工作区中,打开菜单“File”并选择“Export”,在弹出的窗口中选择“Export to Spreadsheet”选项。 6. 选择导出Excel的变量,并在“File name”字段中指定Excel文件名。单击“Export”按钮,数据将被导出Excel中。 这些步骤将帮助您将Simulink模拟的结果导出Excel中,并将数据作为Excel文件保存到您的计算机上。这些数据可以用来进一步分析、处理和可视化,以帮助您更好地理解模型的性能和行为。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值