当前位置: 首页 > news >正文

apache poi_5.2.5 实现表格内某一段单元格的复制

apache poi_5.2.5 实现表格内,某一段单元格的复制。

实现思路

1.定位开始位置
2.从开始位置之后,在行索引集合中添加行索引下标
3.截至到结束位置。
4.对行索引集合去重,并循环行索引集合
5.利用XWPFTableRow对像的getCtRow().copy()方法,进行复制(此处复制行单元格,是为了对复制出来的行单元格做其他操作)【如果只是复制,可直接使用table.addRow(newRow, endRowIndex + i);】
6.最后输出doc

需要的依赖包

		<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>5.2.5</version></dependency>

实现代码

 /*** @param doc* @param count 需要循环的次数,最少1次*/public static void copyCell(XWPFDocument doc, Integer count) {if (count < 1) {return;}List<XWPFTable> tables = doc.getTables();Integer dRowIndex = null;Integer tableIndex = null;Boolean isStart = false;Boolean isEnd = false;List<Integer> rowIndexs = new LinkedList<>();for (int i = 0; i < tables.size(); i++) {XWPFTable table = tables.get(i);// 遍历表格行for (int rowIndex = 0; rowIndex < table.getRows().size(); rowIndex++) {XWPFTableRow row = table.getRow(rowIndex);// 获取行中的所有单元格List<XWPFTableCell> cells = row.getTableCells();// 遍历单元格,获取索引位置for (int cellIndex = 0; cellIndex < cells.size(); cellIndex++) {XWPFTableCell cell = cells.get(cellIndex);String cellText = cell.getText();if (isStart && !isEnd) {// 判断单元格是否包含结束标识(此标识是自定义变量)if (cellText.equalsIgnoreCase("end")) {isEnd = true;dRowIndex = rowIndex;tableIndex = i;}rowIndexs.add(rowIndex);} else {//判断单元格是否包含开始标识if (cellText.equalsIgnoreCase("start")) {isStart = true;rowIndexs.add(rowIndex);}}}}}if (isStart && isEnd && !rowIndexs.isEmpty()) {XWPFTable table = tables.get(tableIndex);List<Integer> uniqueList = rowIndexs.stream().distinct().collect(Collectors.toList());for (int j = 1; j <= count; j++) {int endRowIndex = dRowIndex;for (int i = 1; i <= uniqueList.size(); i++) {Integer index = uniqueList.get(i - 1);XWPFTableRow oldRow = table.getRow(index);//此处复制行单元格,是为了对复制出来的行单元格做编号操作。XmlObject copy = oldRow.getCtRow().copy();XWPFTableRow newRow = new XWPFTableRow((CTRow) copy, table);int finalK = j + 1;newRow.getTableCells().stream().forEach(cell -> {for (XWPFParagraph paragraph : cell.getParagraphs()) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {String text = run.getText(run.getTextPosition());if (text.contains("【")) {run.setText(text.substring(0, text.length() - 1).concat(String.valueOf(finalK)).concat("】"), 0);}}}});//【如果只是复制,可直接使用table.addRow(newRow, endRowIndex + i);】table.addRow(newRow, endRowIndex + i);}dRowIndex = dRowIndex + uniqueList.size();}}}
http://www.lryc.cn/news/264867.html

相关文章:

  • Oracle重建索引详解
  • 众和策略证券开户首选:股票增持是好还是坏?大股东增持规定?
  • UE4移动端最小包优化实践
  • 用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成
  • java开发面试:常见业务场景之单点登录SSO(JWT)、权限认证、上传数据的安全性的控制、项目中遇到的问题、日志采集(ELK)、快速定位系统的瓶颈
  • Java网络编程原理与实践--从Socket到BIO再到NIO
  • ARM GIC(三) gicv2架构
  • 第4章Netty第二节入门案例+channel,future,promise介绍
  • 【论文笔记】3D Gaussian Splatting for Real-Time Radiance Field Rendering
  • 【生物信息学】层次聚类过程
  • 变分自动编码器【03/3】:使用 Docker 和 Bash 脚本进行超参数调整
  • KnowLM知识抽取大模型
  • MySQL数据库 索引
  • ES 错误码
  • 听GPT 讲Rust源代码--src/tools(18)
  • 如何实现设备远程控制?
  • 百度侯震宇详解:大模型将如何重构云计算?
  • [Java]FileOutputStream的换行/续写/一次性写出一个字符串的方法
  • VM进行TCP/IP通信
  • 剑指Offer 队列栈题目集合
  • grafana基本使用
  • 备份至关重要!如何解决iCloud的上次备份无法完成的问题
  • 【项目问题解决】% sql注入问题
  • B/S医院手术麻醉临床管理系统源码 手术申请、手术安排
  • 解锁高效工作!5款优秀工时管理软件推荐
  • ICLR 2024 高分论文 | Step-Back Prompting 使大语言模型通过抽象进行推理
  • 边缘计算有哪些常用场景?TSINGSEE边缘AI视频分析技术行业解决方案
  • 配置BGP的基本示例
  • Flask解决接口跨域问题
  • 数据恢复工具推荐!这3款堪称删除文件恢复大师!