当前位置: 首页 > 知识库问答 >
问题:

apache poi xssf下拉菜单没有引用正确的单元格

谈灵均
2023-03-14

我有一个奇怪的问题,引用正确的单元格集显示为下拉菜单。我的具体场景是一个可见的工作表,其中应该包含许多不同的下拉列表,以及一个隐藏的工作表,其中包含存放下拉列表选择的各种单元格。

因此,例如,visibleSheet第1行(单元格A1)使用hiddenSheet A1:x1(x是变量)中的值,visibleSheet第2行(A2)使用hiddenSheet A2:x2中的值,等等。

几个小时以来,我一直在用头撞墙,试图找出代码中的错误。希望比我更了解Excel/POI的人能帮上忙(我当然不是专家)....

编辑:这里有一个更好的代码片段,说明了我所看到的--它可以在没有任何依赖关系的情况下粘贴(当然除了poi),感谢任何人花时间!:)

public void createDropdownXfs2() {

    String[][] testValues = {
        {"010", "020", "030", "040", "050", "060", "070", "080", "090"},
        {"110", "120", "130", "140", "150", "160", "170", "180", "190"},
        {"210", "220", "230", "240", "250", "260", "270", "280", "290"},
        {"310", "320", "330", "340", "350", "360", "370", "380", "390"},
        {"410", "420", "430", "440", "450", "460", "470", "480", "490"},
        {"510", "520", "530", "540", "550", "560", "570", "580", "590"},
        {"610", "620", "630", "640", "650", "660", "670", "680", "690"},
        {"710", "720", "730", "740", "750", "760", "770", "780", "790"},
        {"810", "820", "830", "840", "850", "860", "870", "880", "890"},
        {"910", "920", "930", "940", "950", "960", "970", "980", "990"}
    };

    try {
        Workbook workbook = new XSSFWorkbook();
        XSSFSheet sheet1 = (XSSFSheet) workbook.createSheet("mac_import");
        XSSFSheet hiddenSheet = (XSSFSheet) workbook.createSheet("hidden");

        //
        // our data validation objects
        //
        XSSFDataValidationHelper validationHelper;
        XSSFDataValidationConstraint constraint;
        CellRangeAddressList addressList;
        XSSFDataValidation dataValidation;

        //
        // create our ROW variables
        //
        Row row;
        Row currentHiddenRow;

        //
        // the range template string should end up 
        // looking something like "hidden!A1:D1"
        //
        String rangeTemplate = hiddenSheet.getSheetName() + "!" + "A%s" + ":" + "%s%s";

        for (int i = 0; i < testValues.length; i++) {
            //
            // create a new row in the visible sheet and in the hidden sheet
            //
            row = sheet1.createRow(i);
            currentHiddenRow = hiddenSheet.createRow(i);

            System.out.println("Create New Rows at 0-based-position: " + i);


            String[] listItems = testValues[i];

            //
            // create the cells with our list values on the hidden sheet
            //
            for (int j = 0; j < listItems.length; j++) {
                Cell cell = currentHiddenRow.createCell(j, Cell.CELL_TYPE_STRING);
                cell.setCellValue(listItems[j]);
            }

            //
            // create the namedcell/formula reference string
            //
            String formulaName = "formula" + i;

            //
            // prepare the excel-friendly range from the template
            //              
            String endColumnName = CellReference.convertNumToColString(listItems.length - 1);
            String rangeRow = String.valueOf(i + 1);
            String rangeString = String.format(rangeTemplate, rangeRow, endColumnName, rangeRow);

            //
            // create a named area on the hidden sheet that covers the area we just created
            //          
            Name namedCell = workbook.createName();
            namedCell.setNameName(formulaName);
            namedCell.setRefersToFormula(rangeString);

            System.out.println(String.format("Cell Range '%s' refers to Range String: '%s'",
                    namedCell.getNameName(), rangeString));


            validationHelper = new XSSFDataValidationHelper(sheet1);
            constraint = (XSSFDataValidationConstraint) validationHelper.createFormulaListConstraint(formulaName);
            addressList = new CellRangeAddressList(i, i, 0, 0);
            dataValidation = (XSSFDataValidation) validationHelper.createValidation(constraint, addressList);
            dataValidation.setSuppressDropDownArrow(true);
            sheet1.addValidationData(dataValidation);

        }

        FileOutputStream fileOut = new FileOutputStream("/eelboy/mac/test_xls/list.xlsx");
        workbook.write(fileOut);
        fileOut.close();


    } catch (Exception ex) {
        System.out.println(ex);
    }
}

共有1个答案

萧晔
2023-03-14

发现了问题...namedCell需要在行/列文字前面加一个“$”。因此,在我的例子中,rangeTemplate定义应该如下所示:

String rangeTemplate = hiddenSheet.getSheetName() + "!" + "$A$%s" + ":" + "$%s$%s"
 类似资料:
  • 关于我的上一个问题(bootstrap上的下拉菜单不起作用),我正在为li下拉菜单的子菜单构建一个子菜单。这意味着它是嵌套的。银行菜单下有交易下拉菜单,交易下拉菜单下有不同类型交易的菜单。顺便说一下,我已经成功地创建了它,但是在悬停期间,“事务”模块的子菜单出现在事务菜单的前面,阻止了作为事务的父菜单。在悬停期间,如何避免它并将其放置在事务菜单的右侧?不管怎样,我已经使用了“右下拉菜单”,但它不会

  • 我正在尝试创建多个包含弹出窗口链接的下拉按钮。这是我的HTML代码: 每当我单击下拉菜单时,就会出现以下错误: zone-evergreen.js:171未捕获的TypeError:无法读取null的属性“set attribute” 为什么我一直得到这个错误,我该如何修复它?

  • 嗨,我正在尝试自动启动下拉菜单。默认情况下,它的可见性是隐藏的。将鼠标悬停在它上面时,它的可见性属性显示为可见。我可以单击下拉菜单,但是在单击下拉菜单后,我的selenium脚本不能从下拉菜单中选择值。 错误:线程"main"org.openqa.selenium.ElementNotVisibleException异常:无法单击元素 HTML代码段

  • 问题内容: 我正在尝试制作一个简单的CSS下拉菜单,当您将鼠标悬停在链接上时,将显示子菜单。当您将鼠标悬停在li上时,我已经设法实现了这一点,但无法弄清楚如何使用链接来实现。 我之所以尝试使用链接而不是li来执行此操作,是因为我的菜单宽度为100%,并且li所占的面积比链接大,因此,如果将鼠标悬停在该区域上,则不显示该子菜单不想。 我的CSS如下: 问题答案: 如果可能的话,我会避免使用JS。这不

  • 主要内容:用法,实例,实例,选项,方法,实例Bootstrap 下拉菜单 这一章讲解了下拉菜单,但是没有涉及到交互部分,本章将具体讲解下拉菜单的交互。使用下拉菜单(Dropdown)插件,您可以向任何组件(比如导航栏、标签页、胶囊式导航菜单、按钮等)添加下拉菜单。 如果您想要单独引用该插件的功能,那么您需要引用 dropdown.js。或者,正如 Bootstrap 插件概览 一章中所提到,您可以引用 bootstrap.js 或压缩版的

  • 主要内容:实例,选项,实例,实例,更多实例本章将重点介绍 Bootstrap 下拉菜单。下拉菜单是可切换的,是以列表格式显示链接的上下文菜单。这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现。 如需使用下拉菜单,只需要在 class .dropdown 内加上下拉菜单即可。下面的实例演示了基本的下拉菜单: 实例 <div class="dropdown"> <button type="button" c