Java POI Excel移动行和复制行的处理
目录
Java POI Excel移动行和复制行的处理
坑点:
实现的代码
Java POI Excel移动行和复制行的处理
POI操作Excel时,不支持移动行的操作,因此在需要通过复制行+删除行+创建空白行的组合方式来达成移动行的效果。
坑点:
- POI操作Excel文档和Excel软件操作文档的理解是不一样的,Excel软件日常操作时不是严格区分
空白行
和空行
,而POI操作时必须严格区分,空白行可以直接操作,而空行则必须先执行创建行操作后才能操作。 copyRows
复制行从源位置到目标位置时,不是完全覆盖模式,因此如果目标区域有内容,会用源区域有内容的部分替换到目标区域的内容,源区域没有内容的部分仍会使用目标区域的内容。这个和Excel软件操作中复制区域粘贴到指定区域的操作的效果是不同的。另外copyRows
的会忽略起始区域是空行
的行,例如如果想将3-5
行开始复制到7-9
行,如果3、4
行是空行
,那么拷贝后的结果为为7
行为5
行的内容。removeRow
删除行时,只会删除行的数据,对于行的合并单元格等数据不会删除,因为合并单元格是存放在sheet
上。因此如果想同时删除合并单元格,则需要先手动删除合并单元格,再删除行。由于合并单元格数据是存放在一个list上的,而删除只提供下标删除方式,因此删除时需要按照下标大小倒序删除。copyRows
可以将源行的内容和样式都拷贝到目标行。- 使用复制行+删除行+创建空白行组合方式达到移动行的效果时,需要注意临时区域的位置,保证临时区域不会和最终结果有重叠区域。
实现的代码
if(CollectionUtils.isNotEmpty(dataList)) {int beginRowNo = data.getBeginRow();Row beginRow = sheet.getRow(beginRowNo);int addNo = dataList.size();int moveBeginRow = beginRowNo+1;//如果移动的开始行不存在,则创建一个空行,否则复制的时候会丢掉不存在的行if(sheet.getRow(moveBeginRow)==null){sheet.createRow(moveBeginRow);}int lastRowNo = sheet.getLastRowNum();//计算移动的行数int movedNo = lastRowNo-moveBeginRow+1;//临时区的开始行int tempBeginRowNo = lastRowNo+addNo+1;//临时区的结束行int tempLastRowNo = tempBeginRowNo+movedNo-1;//末尾部分的最终开始行int finalBeginRowNo = addNo+beginRowNo;//移动开始行以后的行到临时的开始行moveRows(sheet,moveBeginRow,lastRowNo,tempBeginRowNo);//在空出位置插入新行并复制第一行的样式for (int i = moveBeginRow; i <finalBeginRowNo; i++){Row row = sheet.getRow(i);if (row != null){sheet.removeRow(row);}//创建空白的行sheet.createRow(i);if(beginRow!=null){//复制第一行的样式到当前行sheet.copyRows(beginRowNo,beginRowNo, i, DEFAULT_ROW_COPY_POLICY);}}//将移动的行从临时开始行回移新增好的行的末尾/*为什么不直接第一次移动的预期的末尾呢?是因为POX只支持Copy行的操作,而copy操作不是完整的区间覆盖。如果源区间内带有格式,并且目的区间和源区间有重叠话,会导致无法copy后源区间和目的区间混合在一起,无法清理。因此实现移动行区间的操作时,需要先将源行区间复制到一个临时的区域,然后清理掉源行区间的行和样式,再插入需要新增的行,最后再将被移动的行区间移动回新的行末尾。*/moveRows(sheet,tempBeginRowNo,tempLastRowNo,finalBeginRowNo);}/*** 移动指定行区间到指定位置,并删除移动后原地的行* @author 徐明龙 XuMingLong 2019-06-27* @param sheet* @param srcBeginRow* @param srcEndRow* @param destBeginRow* @return void*/private static void moveRows(XSSFSheet sheet,int srcBeginRow,int srcEndRow,int destBeginRow){//先复制到目的位置sheet.copyRows(srcBeginRow, srcEndRow, destBeginRow, DEFAULT_ROW_COPY_POLICY);//清理之前残留的合并单元格List<Integer> removeMergedRegion = new ArrayList<>();for(int i=sheet.getMergedRegions().size()-1;i>=0;i--){CellRangeAddress address = sheet.getMergedRegions().get(i);//如果合并单元格在复制前的位置,则删除if(address.getFirstRow() >= srcBeginRow && address.getFirstRow()<destBeginRow ){removeMergedRegion.add(i);}};//执行清理合并的单元格for(Integer i:removeMergedRegion){sheet.removeMergedRegion(i);}//删除移动后原地的行for (int i = srcBeginRow; i <= srcEndRow; i++){Row row = sheet.getRow(i);if (row != null){//删除复制后残留的行sheet.removeRow(row);}}}
Java POI Excel移动行和复制行的处理相关推荐
- Java POI Excel导入导出
Java POI Excel导入导出 1.maven引入依赖 2.导入Excel 3.导出Excel 1.maven引入依赖 <!-- POI Excel 操作 --> <depen ...
- java 复制excel_PoiUtil.java 用于excel间sheet复制
前言:apache提供的poi功能确实比较强大,但是不明白为什么没有相应的方法实现不同excel文件中sheet的复制功能.这也是本文整理PoiUtil工具类的初衷.网上有相关的解决方案,在参考了网上 ...
- java poi excel 导入数据库_java POI 处理excel表格数据并导入数据库示例
java操作Excel最常用的开源组件有poi与jxl.jxl是韩国人开发的,发行较早,但是更新的很慢,目前似乎还不支持excel2007. poi是apache下的一个子项目,poi应该是处理ms的 ...
- Java POI——Excel导入导出的列英文字母与数字的互转方法记录
因项目需要,写了递归实现POI--excel英文字母列转列编号,记录. 规则1:excel英文字母列转数字编号:A→0,B→1,Z→25,AA→26,ZZ→701,AAA→702 - public i ...
- 【Java poi excel】判断excel行是否全部为空
//当前这行全部为空或者空格就忽视当前这行 if (isAllRowEmpty(row,sheet.getRow(0))){continue; } /*** 验证excel是否全部为空* @param ...
- java POI Excel 单元格样式
正如Html需要CSS一样,我们的POI生成的Excel同样需要样式才能更完美的表现我们的数据.下面还是从简单的例子出发,学习和了解POI的样式设计. 一.我的位置. 1 package com.my ...
- Java POI Excel( pio:纯java操作excel的api )
2010-03-17 21:35 POI官方网址:http://poi.apache.org/ POI的功能实在很强大,而且是apache的子项目,它下面又包含一些Component,比如处理Exce ...
- java poi excel无法添加水印替代方法
poi无法直接通过代码生成水印效果,只能生成图片以及背景图. 提供一种可行办法就是预留一份现成的带有水印的excel模板,以模板创建workbook,再向其添加内容,这样即可实现导出带有水印的exce ...
- java poi excel 生成表格的工具封装
效果如下: 代码如下: import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import ...
最新文章
- [JAVA]引入目录下所有jar包等问题
- 我们一般的前端开发流程
- memcache mysql 同步_memcache与mysql数据库同步
- python中 5个带key内置函数
- php需要什么技能,成为一个好的PHP工程师需要掌握什么技能
- spring-security权限控制详解
- 如何搭建一个打印荣誉证书的网站_如何搭建一个免费的作品集网站
- linux python开发环境_如何在Linux系统中搭建Python编程环境
- 信息学奥赛一本通(1210:因子分解)
- 将军令:数据安全平台建设实践 1
- 500错误无法为jsp编译类:_JSP(Java Server Pages)的相关使用
- 一个ExtJs的最基本的mvc模式示例
- 三行代码让你轻松下载全网任意视频-Python小知识
- 如何判断绝缘接头质量的好坏?
- HCIA~广域网技术
- PR导入视频后无声音
- 教育变革背景下幼儿园园长领导力研究
- 网址缩短 php 安装包,PHP长链接网址缩短防封短网址短链接生成平台整站源码(一键安装)...
- 汽车外饰360vr实景展示有哪些应用场景?
- 国行白色 ipad 4 16G