Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ApachePOI添加表标题下拉列表_Java_Apache Poi - Fatal编程技术网

Java 如何使用ApachePOI添加表标题下拉列表

Java 如何使用ApachePOI添加表标题下拉列表,java,apache-poi,Java,Apache Poi,我正在使用ApachePOI生成Excel表格,但生成的表格在每个标题上都缺少下拉菜单,而当我在Excel中“格式化为表格”时,每个标题都会出现下拉菜单 我想生成以下内容: 但我得到的却是: 我如下所示,我的代码如下所示: XSSFTable table = sheet.createTable(); table.setDisplayName("Data"); CTTable ctTable = table.getCTTable();

我正在使用ApachePOI生成Excel表格,但生成的表格在每个标题上都缺少下拉菜单,而当我在Excel中“格式化为表格”时,每个标题都会出现下拉菜单

我想生成以下内容:

但我得到的却是:

我如下所示,我的代码如下所示:

        XSSFTable table = sheet.createTable();
        table.setDisplayName("Data");
        CTTable ctTable = table.getCTTable();
        ctTable.setDisplayName("Data");
        ctTable.setId(1L);
        ctTable.setName("DATA");
        CTTableStyleInfo table_style = ctTable.addNewTableStyleInfo();
        table_style.setName("TableStyleMedium9");
        table_style.setShowColumnStripes(false);
        table_style.setShowRowStripes(true);
            CTTableColumn column = ctColumns.addNewTableColumn();
            column.setName(headers.get(i));
            column.setId(i + 1);
    CTTableColumns ctColumns = ctTable.addNewTableColumns();
    CTAutoFilter autofilter = ctTable.addNewAutoFilter();
    ctColumns.setCount(table_headers.size());

    for(int i = 0; i < table_headers.size(); i++) {
        CTTableColumn column = ctColumns.addNewTableColumn();
        column.setName(table_headers.get(i));
        column.setId(i + 1);
        CTFilterColumn filter = autofilter.addNewFilterColumn();
        filter.setColId(i + 1);
        filter.setShowButton(true);
    }
然后按如下方式创建每个列:

        XSSFTable table = sheet.createTable();
        table.setDisplayName("Data");
        CTTable ctTable = table.getCTTable();
        ctTable.setDisplayName("Data");
        ctTable.setId(1L);
        ctTable.setName("DATA");
        CTTableStyleInfo table_style = ctTable.addNewTableStyleInfo();
        table_style.setName("TableStyleMedium9");
        table_style.setShowColumnStripes(false);
        table_style.setShowRowStripes(true);
            CTTableColumn column = ctColumns.addNewTableColumn();
            column.setName(headers.get(i));
            column.setId(i + 1);
    CTTableColumns ctColumns = ctTable.addNewTableColumns();
    CTAutoFilter autofilter = ctTable.addNewAutoFilter();
    ctColumns.setCount(table_headers.size());

    for(int i = 0; i < table_headers.size(); i++) {
        CTTableColumn column = ctColumns.addNewTableColumn();
        column.setName(table_headers.get(i));
        column.setId(i + 1);
        CTFilterColumn filter = autofilter.addNewFilterColumn();
        filter.setColId(i + 1);
        filter.setShowButton(true);
    }

我遗漏了什么?

从您引用的示例中不太清楚应用表格样式是否应该为您创建过滤器下拉列表

但是,您可以显式调用setAutoFilter(),如下所示设置过滤器下拉列表

e、 g


感谢Alan Hay提供的线索-解决方案是添加一个自动过滤器,但需要为
CTTable
的每个列添加一个
CTAutoFilter
。工作解决方案如下所示:

        XSSFTable table = sheet.createTable();
        table.setDisplayName("Data");
        CTTable ctTable = table.getCTTable();
        ctTable.setDisplayName("Data");
        ctTable.setId(1L);
        ctTable.setName("DATA");
        CTTableStyleInfo table_style = ctTable.addNewTableStyleInfo();
        table_style.setName("TableStyleMedium9");
        table_style.setShowColumnStripes(false);
        table_style.setShowRowStripes(true);
            CTTableColumn column = ctColumns.addNewTableColumn();
            column.setName(headers.get(i));
            column.setId(i + 1);
    CTTableColumns ctColumns = ctTable.addNewTableColumns();
    CTAutoFilter autofilter = ctTable.addNewAutoFilter();
    ctColumns.setCount(table_headers.size());

    for(int i = 0; i < table_headers.size(); i++) {
        CTTableColumn column = ctColumns.addNewTableColumn();
        column.setName(table_headers.get(i));
        column.setId(i + 1);
        CTFilterColumn filter = autofilter.addNewFilterColumn();
        filter.setColId(i + 1);
        filter.setShowButton(true);
    }
CTTableColumns-ctColumns=ctTable.addNewTableColumns();
CTAutoFilter autofilter=ctTable.addNewAutoFilter();
ctColumns.setCount(table_headers.size());
对于(int i=0;i
自动调整列大小时,还需要为下拉菜单添加额外的宽度:

    for(int i = 0; i < table_headers.size(); i++) {
        sheet.autoSizeColumn(i);
        // Include width of drop down button
        sheet.setColumnWidth(i, sheet.getColumnWidth(i) + 1000);
    }
for(int i=0;i
你检查过了吗?我在搜索中看到了,但我不知道表上的排序菜单与数据验证相关-它们是否链接?检查一下:我现在已经尝试过了,我可以确认数据验证菜单肯定不是我要找的菜单。这非常接近工作-它生成正确的菜单,但Excel报告输出文件已损坏:“已删除功能:Table from/xl/tables/table1.xml part(Table)”我的剩余问题似乎由以下未解决的问题描述: