如何使用Apache POI在不同的行创建多个AutoFilter

时间:2015-11-30 16:01:01

标签: java excel apache apache-poi

我想使用Apache POI在Excel工作表的多个位置创建自动筛选。 (例如,在第2行和第8行)。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int decomposition(const char *target, const char *strings[], size_t n)
{
    size_t i;

    if (*target == '\0') return 1;

    for (i = 0; i < n; i++) {
        const char *str = strings[i];
        size_t len = strlen(str);

        if (strncmp(target, str, len) == 0) {
            int res;

            res = decomposition(target + len, strings, n);
            if (res) return 1;
        }
    }

    return 0;
}

int main(int argc, char *argv[])
{
    if (argc < 3) {
        printf("Usage: prog targer string(s) ...\n");
    } else {
        int n = decomposition(argv[1], argv + 2, argc - 2);

        printf("%s be done.\n", n ? "Can" : "Can't");
    }

    return 0;
}

我一直在添加它,如上所述,但第二个过滤器覆盖了第一个过滤器,当创建excel表时,我只能看到一个。 有人可以帮助我。

enter image description here

感谢。

1 个答案:

答案 0 :(得分:1)

使用时应使用XSSFSheet并创建CTTable。工作表可能包含许多表格。

以下是将表格添加到工作表的代码。请确保创建并存在单元格。

private void createExcelTable(XSSFSheet sheet, AreaReference reference, int tableId, 
String name) {
    XSSFTable table = sheet.createTable();
    table.setDisplayName(name);
    CTTable cttable = table.getCTTable();

    // Style configurations
    // CTTableStyleInfo is available in ooxml-schemas-1.1.jar.
    // Replace with it your poi-ooxml.
    CTTableStyleInfo style = cttable.addNewTableStyleInfo();
    style.setName("TableStyleLight1");
    style.setShowColumnStripes(false);
    style.setShowRowStripes(true);

    // Set which area the table should be placed in
    cttable.setRef(reference.formatAsString());
    // id starts from 1
    cttable.setId(tableId);
    cttable.setName(name);
    cttable.setDisplayName(name);

    // first row is used for header with filter
    CTAutoFilter autoFilter = cttable.addNewAutoFilter();
    autoFilter.setRef(reference.formatAsString());

    CTTableColumns columns = cttable.addNewTableColumns();
    // sets count of columns for current table
    short firstColumn = reference.getFirstCell().getCol();
    short lastColumn = reference.getLastCell().getCol();
    columns.setCount(lastColumn - firstColumn + 1);

    for (int i = firstColumn; i <= lastColumn; i++) {
        // create columns
        CTTableColumn column = columns.addNewTableColumn();
        column.setName("Column" + i);
        // id starts from 1
        column.setId(i + 1);
    }
}

AreaReference示例:

new AreaReference(new CellReference(0, 0), new CellReference(4, 5));