在我的项目中,我使用apache poi读取Excel电子表格。
从某些表中,如果我仅选择具有某些单元格数据的行会很有帮助
有人知道这是否可行,如何运作吗?
例如,仅其列“ columnX”的值为“ somevalue”的行
感谢帮助
答案 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中提取单元格地址。