目录

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移动行和复制行的处理相关推荐

  1. Java POI Excel导入导出

    Java POI Excel导入导出 1.maven引入依赖 2.导入Excel 3.导出Excel 1.maven引入依赖 <!-- POI Excel 操作 --> <depen ...

  2. java 复制excel_PoiUtil.java 用于excel间sheet复制

    前言:apache提供的poi功能确实比较强大,但是不明白为什么没有相应的方法实现不同excel文件中sheet的复制功能.这也是本文整理PoiUtil工具类的初衷.网上有相关的解决方案,在参考了网上 ...

  3. java poi excel 导入数据库_java POI 处理excel表格数据并导入数据库示例

    java操作Excel最常用的开源组件有poi与jxl.jxl是韩国人开发的,发行较早,但是更新的很慢,目前似乎还不支持excel2007. poi是apache下的一个子项目,poi应该是处理ms的 ...

  4. Java POI——Excel导入导出的列英文字母与数字的互转方法记录

    因项目需要,写了递归实现POI--excel英文字母列转列编号,记录. 规则1:excel英文字母列转数字编号:A→0,B→1,Z→25,AA→26,ZZ→701,AAA→702 - public i ...

  5. 【Java poi excel】判断excel行是否全部为空

    //当前这行全部为空或者空格就忽视当前这行 if (isAllRowEmpty(row,sheet.getRow(0))){continue; } /*** 验证excel是否全部为空* @param ...

  6. java POI Excel 单元格样式

    正如Html需要CSS一样,我们的POI生成的Excel同样需要样式才能更完美的表现我们的数据.下面还是从简单的例子出发,学习和了解POI的样式设计. 一.我的位置. 1 package com.my ...

  7. Java POI Excel( pio:纯java操作excel的api )

    2010-03-17 21:35 POI官方网址:http://poi.apache.org/ POI的功能实在很强大,而且是apache的子项目,它下面又包含一些Component,比如处理Exce ...

  8. java poi excel无法添加水印替代方法

    poi无法直接通过代码生成水印效果,只能生成图片以及背景图. 提供一种可行办法就是预留一份现成的带有水印的excel模板,以模板创建workbook,再向其添加内容,这样即可实现导出带有水印的exce ...

  9. java poi excel 生成表格的工具封装

    效果如下: 代码如下: import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import ...

最新文章

  1. [JAVA]引入目录下所有jar包等问题
  2. 我们一般的前端开发流程
  3. memcache mysql 同步_memcache与mysql数据库同步
  4. python中 5个带key内置函数
  5. php需要什么技能,成为一个好的PHP工程师需要掌握什么技能
  6. spring-security权限控制详解
  7. 如何搭建一个打印荣誉证书的网站_如何搭建一个免费的作品集网站
  8. linux python开发环境_如何在Linux系统中搭建Python编程环境
  9. 信息学奥赛一本通(1210:因子分解)
  10. 将军令:数据安全平台建设实践 1
  11. 500错误无法为jsp编译类:_JSP(Java Server Pages)的相关使用
  12. 一个ExtJs的最基本的mvc模式示例
  13. 三行代码让你轻松下载全网任意视频-Python小知识
  14. 如何判断绝缘接头质量的好坏?
  15. HCIA~广域网技术
  16. PR导入视频后无声音
  17. 教育变革背景下幼儿园园长领导力研究
  18. 网址缩短 php 安装包,PHP长链接网址缩短防封短网址短链接生成平台整站源码(一键安装)...
  19. 汽车外饰360vr实景展示有哪些应用场景?
  20. 国行白色 ipad 4 16G

热门文章

  1. lol大区服务器位置2019,开发者日志:2019年位置排位的下一阶段
  2. 2019年9月8号(周日)
  3. PDCA循环管理法 抓住质量管理活动的规律(转载)
  4. matlab符号计算中提取,[matlab]符号表达式中的系数提取问题
  5. 如何才能进行亚马逊店铺防关联
  6. vs打不开或者打开程序里面什么都没有
  7. 【推荐】Qualcomm英文报告资料合集
  8. 隐士向一个美国朋友推荐邵氏电影
  9. 什么是刷机精灵 刷机精灵有什么用?
  10. 女“葛朗台”的计划之购房首期款