如何使用 Apache Poi 添加 table 标题 drop-down
How to add table heading drop-down with Apache Poi
我正在使用 Apache POI 生成 Excel 表,但是我生成的表缺少每个 header 上的 drop-down 菜单,当我 "format as table" 在 Excel本身。
我想生成这个:
但我得到的是:
我正在关注 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);
我错过了什么?
从您引用的示例中并不能完全清楚应用 Table 样式是否应该为您创建过滤器下拉菜单。
但是您可以如下显式调用 setAutoFilter() 来设置过滤器下拉列表。
例如
CellReference start = table.getStartCellReference();
CellReference end= table.getEndCellReference();
sheet.setAutoFilter(new CellRangeAddress(...);
感谢 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);
}
我正在使用 Apache POI 生成 Excel 表,但是我生成的表缺少每个 header 上的 drop-down 菜单,当我 "format as table" 在 Excel本身。
我想生成这个:
但我得到的是:
我正在关注 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);
我错过了什么?
从您引用的示例中并不能完全清楚应用 Table 样式是否应该为您创建过滤器下拉菜单。
但是您可以如下显式调用 setAutoFilter() 来设置过滤器下拉列表。
例如
CellReference start = table.getStartCellReference();
CellReference end= table.getEndCellReference();
sheet.setAutoFilter(new CellRangeAddress(...);
感谢 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);
}