如何使用Apache Poi添加表标题下拉列表

时间:2015-02-09 21:43:23

标签: java apache-poi

我正在使用Apache POI生成Excel表格,但是当我在Excel中“格式化为表格”时,我生成的表格中缺少每个标题的下拉菜单。

我想生成这个:

Table with menu button

但我得到了这个:

Table without menu button

我正在关注this blog post,我的代码如下:

        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);

我错过了什么?

2 个答案:

答案 0 :(得分:6)

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

    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);
    }

自动调整列数时,还需要为下拉菜单添加额外的宽度:

    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);
    }

答案 1 :(得分:1)

从您引用的示例中可以清楚地看出,应用表格样式是否应该为您创建过滤器下拉列表。

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

e.g。

CellReference start = table.getStartCellReference();
CellReference end= table.getEndCellReference();
sheet.setAutoFilter(new CellRangeAddress(...);