java - 如何使用 Apache POI 对 XSSFTable 列启用排序/过滤?

标签 java excel apache-poi xssf excel-tables

我正在开发一个获取数据库记录并从该数据创建 excel 文档的应用程序。

excel文档生成良好,所有数据可读;作为该论坛的先前答案,该表也已适当生成(即使我滚动过去,标题行仍然可见,因此该表肯定存在)。但是,我曾期望,一旦我有了一个表格,我就可以像在 excel 中“插入 -> 表格”一样对列进行排序和过滤,但是当我打开文档时没有这样的选项。

我在 XSSFTable 或 XSSFTableColumn 类上看不到 setFitlerable 或 setSortable 或类似的东西...如何启用对表列的排序/过滤?

表创建代码如下,如果有用的话:

//Create table
CellReference topLeft = new CellReference(sheet.getRow(3).getCell(0));
CellReference bottomRight = new CellReference(sheet.getRow(nextRow-1).getCell(3));
AreaReference tableArea = workbook.getCreationHelper().createAreaReference(topLeft, bottomRight);
XSSFTable dataTable = sheet.createTable(tableArea);

dataTable.setName("TableData" + EXCEL_OBJECT_NUMBER);
dataTable.setDisplayName("TableData" + EXCEL_OBJECT_NUMBER);

XSSFTableColumn column = dataTable.getColumns().get(0);
column.setId(1);
column.setName("COLUMN1");

column = dataTable.getColumns().get(1);
column.setId(2);
column.setName("COLUMN2");

column = dataTable.getColumns().get(2);
column.setId(3);
column.setName("COLUMN3");

column = dataTable.getColumns().get(3);
column.setId(4);
column.setName("COLUMN4");

最佳答案

如果 dataTableXSSFTabletableAreaAreaReference其中XSSFTable ,然后下面的代码将自动过滤器设置为表头Excel也这样做:

dataTable.getCTTable().addNewAutoFilter().setRef(tableArea.formatAsString());

完整示例:
import java.io.FileOutputStream;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference;

import java.util.GregorianCalendar;

class CreateExcelTable {

 public static void main(String[] args) throws Exception {

  Object[][] data = new Object[][] {
   new Object[] {"Text", "Date", "Number", "Boolean"},
   new Object[] {"Text 1", new GregorianCalendar(2020, 0, 1), 1234d, true},
   new Object[] {"Text 2", new GregorianCalendar(2020, 1, 15), 5678d, true},
   new Object[] {"Text 3", new GregorianCalendar(2020, 2, 1), 90.1234, false},
   new Object[] {"Text 4", new GregorianCalendar(2020, 3, 15), 567.89, false}
  };

  try (XSSFWorkbook workbook = new XSSFWorkbook();
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   XSSFCellStyle dateCellStyle = workbook.createCellStyle();
   dateCellStyle.setDataFormat(14);

   XSSFSheet sheet = workbook.createSheet();
   XSSFRow row = sheet.createRow(0);
   XSSFCell cell = row.createCell(0);
   cell.setCellValue("Lorem ipsum");
   row = sheet.createRow(1);
   cell = row.createCell(0);
   cell.setCellValue("semit dolor");

   int nextRow = 3;
   int nextCol = 0;
   for (Object[] dataRow : data) {
    row = sheet.createRow(nextRow++);
    nextCol = 0;
    for (Object value : dataRow) {
     cell = row.createCell(nextCol++);
     if (value instanceof String) cell.setCellValue((String)value);
     else if (value instanceof GregorianCalendar) {
      cell.setCellValue((GregorianCalendar)value);
      cell.setCellStyle(dateCellStyle);
     }
     else if (value instanceof Double) cell.setCellValue((Double)value);
     else if (value instanceof Boolean) cell.setCellValue((Boolean)value);
    }
   }

   CellReference topLeft = new CellReference(sheet.getRow(3).getCell(0));
   CellReference bottomRight = new CellReference(sheet.getRow(nextRow-1).getCell(3));
   AreaReference tableArea = workbook.getCreationHelper().createAreaReference(topLeft, bottomRight);
   XSSFTable dataTable = sheet.createTable(tableArea);
   //dataTable.setName("Table1");
   dataTable.setDisplayName("Table1");

   //this styles the table as Excel would do per default
   dataTable.getCTTable().addNewTableStyleInfo();
   XSSFTableStyleInfo style = (XSSFTableStyleInfo)dataTable.getStyle();
   style.setName("TableStyleMedium2");
   style.setShowColumnStripes(false);
   style.setShowRowStripes(true);

   //this sets auto filters
   dataTable.getCTTable().addNewAutoFilter().setRef(tableArea.formatAsString());

   workbook.write(fileout);
  }

 }
}

关于java - 如何使用 Apache POI 对 XSSFTable 列启用排序/过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61326037/

相关文章:

java - 为什么 Java StringBuilder 有一个用于 CharSequence 的构造函数和另一个用于 String 的构造函数?

c# - POI 检查单元格是否为空?

java - 当我将类更改为抽象时实例化错误

java - 扫描 jtextfield 进行输入,写入文本文件,再次扫描新输入,直到用户关闭面板

excel - 如何在不索引的情况下删除突出显示的单元格?

vba - VBA 中 CommandButton 的 .caption 和 .text 属性有什么区别?

java - 构造函数 XMLSlideShow(FileInputStream) 未定义

java - 复制公式 POI 的单元格值

java - Controller 中的 Spring Autowired 不起作用

vba - SumForumla : Two sumformula functions copied to two different cells in a "total" sheet