Apache POI获取具有特定单元格值的所有行

时间:2018-10-02 12:13:07

标签: apache-poi

在我的项目中,我使用apache poi读取Excel电子表格。

从某些表中,如果我仅选择具有某些单元格数据的行会很有帮助

有人知道这是否可行,如何运作吗?

例如,仅其列“ columnX”的值为“ somevalue”的行

感谢帮助

1 个答案:

答案 0 :(得分:0)

如果“ somevalue”是字符串,则可以使用以下代码:

    String path = "src/test.xlsx";
    String param = "somevalue";
    try (FileInputStream in = new FileInputStream(path); 
            XSSFWorkbook w = new XSSFWorkbook(in)) {
        List<Integer> lst = new ArrayList<>();
        SharedStringsTable table = w.getSharedStringSource();
        for (int i = 0; i < table.getCount(); i++) {
            if (table.getItemAt(i).toString().contains(param)) {
                lst.add(i);
            }
        }

        XSSFSheet s = w.getSheetAt(0);
        String xml = s.getCTWorksheet().xmlText();
        for (Integer i : lst) {
            Pattern p = Pattern.compile("(?<=<main:c r=\")[A-Z0-9]+(?=\" t=\"s\"><main:v>" + i + "</main:v>)");
            Matcher m = p.matcher(xml);
            if(m.find()) {
                System.out.println(m.group());
            }
        }
    }

上面的代码将打印出包含“ somevalue”的任何单元格的地址。


说明:

假设一个Excel工作表如下:
https://i.stack.imgur.com/IPQUB.jpg
字符串单元格值作为列表存储在workbook.SharedStringSource中。 因此,首先,您需要检查哪个单元格值包含所需的“ somevalue”并获取该值的索引。
在这种情况下,值是:
约翰:0
史密斯:1
汤姆:2


工作表本身为xml格式,如下所示:

<xml-fragment mc:Ignorable="x14ac" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
    <main:dimension ref="A1:C3" xmlns:main="http://schemas.openxmlformats.org/spreadsheetml/2006/main"/>
    <main:sheetViews xmlns:main="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <main:sheetView tabSelected="1" workbookViewId="0"/>
    </main:sheetViews>
    <main:sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25" xmlns:main="http://schemas.openxmlformats.org/spreadsheetml/2006/main"/>
    <main:cols xmlns:main="http://schemas.openxmlformats.org/spreadsheetml/2006/main"/>
    <main:sheetData xmlns:main="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <main:row r="1" spans="1:3" x14ac:dyDescent="0.25">
            <main:c r="A1" t="s">
                <main:v>0</main:v>
            </main:c>
        </main:row>
        <main:row r="2" spans="1:3" x14ac:dyDescent="0.25">
            <main:c r="B2" t="s">
                <main:v>1</main:v>
            </main:c>
        </main:row>
        <main:row r="3" spans="1:3" x14ac:dyDescent="0.25">
            <main:c r="C3" t="s">
                <main:v>2</main:v>
            </main:c>
        </main:row>
    </main:sheetData>
    <main:pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3" xmlns:main="http://schemas.openxmlformats.org/spreadsheetml/2006/main"/>
</xml-fragment>

您可以看到该单元格表示为:

<main:c r="[CellAddress]" t="s">
    <main:v>[workbook.SharedStringSource.index]</main:v>
</main:c>

因此,如果您已经知道索引,则可以使用正则表达式直接从工作表xml中提取单元格地址。