如何使用Apache Poi添加表头下拉菜单

7
我正在使用Apache POI生成Excel表格,但是我生成的表格缺少每个标题上出现的下拉菜单,这在Excel本身中“格式化为表格”时会出现。
我想要生成这样的表格: Table with menu button 但是我得到了这样的表格: Table without menu button 我遵循这篇博客文章,我的代码如下:
        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);

我错过了什么?

你查看了https://dev59.com/_4bca4cB1Zd3GeqPUlcc吗? - emin
我看到在搜索中提到了这个,但我不知道表格上的排序菜单与数据验证有关联吗? - Adrian Cox
请查看此链接:http://tiku.io/questions/421420/excel-drop-down-list-using-apache-poi - emin
我已经尝试过了,可以确认数据验证菜单绝对不是我要找的菜单。 - Adrian Cox
2个回答

10

感谢Alan Hay提供的线索 - 解决方案是添加自动筛选器,但需要将其作为CTTable的每个单独列的CTAutoFilter添加。工作解决方案如下:

    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

从你引用的例子中并不清楚应用表格样式是否会为你创建筛选下拉框。

但是,您可以按如下方式显式调用setAutoFilter()来设置筛选下拉框。

例如:

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

这非常接近工作 - 它生成了正确的菜单,但Excel报告输出文件为损坏:“已删除功能:/xl/tables/table1.xml部分(表)中的表” - Adrian Cox
看起来我的剩余问题可以通过这个未解决的问题描述:https://dev59.com/wYLba4cB1Zd3GeqPlO_v - Adrian Cox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接