如何基于指定正则表达式过滤字符串集合并通过jXLS写入Excel?
嘿,这个需求其实很好实现,核心思路就是先对字符串数组做正则过滤,再把过滤后的结果交给jXLS去写入Excel。我给你拆解成具体步骤和代码示例,你可以直接套用:
步骤1:实现正则过滤逻辑
首先我们用Java的Pattern和Matcher来完成正则匹配,结合Stream API可以很优雅地过滤数组。这里默认你用的是Java环境(毕竟jXLS是Java库):
import java.util.List; import java.util.regex.Pattern; import java.util.stream.Collectors; // 1. 定义你的正则规则,比如这里匹配以"report_"开头的字符串 String regexRule = "^report_.*"; Pattern pattern = Pattern.compile(regexRule); // 2. 假设你的原始字符串数组是String[] originalStrings String[] originalStrings = {"report_2024", "log_01", "report_weekly", "temp_file"}; // 3. 转成List并过滤(如果是List直接用就行) List<String> filteredStrings = List.of(originalStrings) .stream() // 注意:如果原始集合可能有null,要先判空避免NPE .filter(str -> str != null && pattern.matcher(str).matches()) .collect(Collectors.toList());
小提示:如果需要部分匹配(比如字符串中包含某个模式,而不是完全匹配),把
.matches()换成.find()就行。
步骤2:结合jXLS写入过滤后的内容
接下来分两种常见的jXLS使用场景给你示例:
场景1:基于模板的写入(jXLS推荐用法)
如果你之前是用模板文件来生成Excel,只需要把过滤后的列表作为数据源传入jXLS的上下文即可:
import org.jxls.common.Context; import org.jxls.util.JxlsHelper; import java.io.*; public void writeFilteredDataToExcel() { // 这里用步骤1得到的filteredStrings List<String> filteredStrings = getFilteredStrings(); // 替换成你的过滤逻辑 // 1. 创建jXLS上下文,把过滤后的列表存入变量 Context context = new Context(); context.putVar("filteredData", filteredStrings); // 2. 加载模板并生成Excel try (InputStream templateStream = this.getClass().getResourceAsStream("/excel_template.xlsx"); OutputStream outputStream = new FileOutputStream("final_output.xlsx")) { JxlsHelper.getInstance().processTemplate(templateStream, outputStream, context); } catch (IOException e) { e.printStackTrace(); } }
对应的Excel模板里,你需要用jXLS的指令来遍历过滤后的列表,比如在单元格里写:
<jx:forEach items="${filteredData}" var="item">${item}</jx:forEach>
(记得把这个单元格设置为jXLS的指令区域,或者用注释指令,具体看你之前的模板写法)
场景2:直接创建Excel写入(无模板)
如果是直接用jXLS API动态创建Excel内容,就遍历过滤后的列表逐行写入:
import org.jxls.Workbook; import org.jxls.builder.xls.XlsCommentAreaBuilder; import org.jxls.common.CellRef; import org.jxls.common.Context; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; public void writeDirectlyToExcel() { List<String> filteredStrings = getFilteredStrings(); // 替换成你的过滤逻辑 // 1. 创建空工作簿 Workbook workbook = XlsCommentAreaBuilder.createWorkbook(); Context context = new Context(); XlsCommentAreaBuilder.build(workbook, "Sheet1", context); // 2. 遍历过滤后的列表,写入Sheet1的A列 int startRow = 0; // 从第1行开始(行号从0计数对应Excel的第1行) for (String str : filteredStrings) { workbook.getCell(new CellRef("Sheet1!A" + (startRow + 1))).setValue(str); startRow++; } // 3. 保存Excel文件 try (FileOutputStream outputStream = new FileOutputStream("direct_output.xlsx")) { workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } }
一些额外注意事项
- 正则转义:如果你的规则里包含特殊字符(比如
.、*、\),记得用双反斜杠\\转义,比如匹配包含.的字符串要写\\.; - 性能优化:如果需要处理大量数据,建议提前编译
Pattern(不要在循环里重复编译),避免性能损耗; - 空值处理:一定要记得在过滤时判空,避免
NullPointerException。
内容的提问来源于stack exchange,提问作者John Pheonix
相关产品推荐
相关产品推荐

