如何使用 Apache POI 在 XSSFTable 列上启用 Sorting/Filtering?
How Can I Enable Sorting/Filtering on XSSFTable Columns Using Apache POI?
我正在开发一个获取数据库记录并根据该数据创建 excel 文档的应用程序。
excel 文档生成正常,所有数据都可读;根据该论坛的先前回答,table 也已适当生成(即使我滚动过去,header 行仍然可见,因此 table 肯定存在)。但是,我原以为一旦我有了 table,我就能够像 excel 中的 'Insert -> Table' 那样对列进行排序和过滤,但是没有这样的选项当我打开文档时。
我在 XSSFTable 或 XSSFTable 列 类 上没有看到 setFitlerable 或 setSortable 或类似的东西...我怎么办在 table 列上启用 sorting/filtering?
Table 创建代码如下,如果有用的话:
//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");
如果 dataTable
是 XSSFTable
并且 tableArea
是 XSSFTable
的 AreaReference
,则以下代码将自动过滤器设置为 table headers 和 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);
}
}
}
我正在开发一个获取数据库记录并根据该数据创建 excel 文档的应用程序。
excel 文档生成正常,所有数据都可读;根据该论坛的先前回答,table 也已适当生成(即使我滚动过去,header 行仍然可见,因此 table 肯定存在)。但是,我原以为一旦我有了 table,我就能够像 excel 中的 'Insert -> Table' 那样对列进行排序和过滤,但是没有这样的选项当我打开文档时。
我在 XSSFTable 或 XSSFTable 列 类 上没有看到 setFitlerable 或 setSortable 或类似的东西...我怎么办在 table 列上启用 sorting/filtering?
Table 创建代码如下,如果有用的话:
//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");
如果 dataTable
是 XSSFTable
并且 tableArea
是 XSSFTable
的 AreaReference
,则以下代码将自动过滤器设置为 table headers 和 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);
}
}
}