java poi对Excel表格进行单元行删除
java poi对Excel表格进行单元行删除
前几天工作时,突然需要去使用POI 来对Excel 表格进行操作,其他的操作都都没什么问题,但是在需要删除某些单元行的时候碰到了一下小坑,记录下来,防止以后忘记。
一般使用POI删除单元行有两种方法
一种只删除单元行中的内容,不删除单元行
即 sheet.removeRow(row); //sheet即取得的工作表,row表示要具体删除的行
这个方法没什么问题
第二种就是实现删除整个单元行
即 sheet.shiftRows(1, 4, -1); //意思是 从 第一行开始,到第四行,整个的移动(-1)行,即上移一行
可以看到,我用的是移动,而不是删除。
如果你想要删除的那一个单元行里面具备合并单元格,而他的下一行不具备相同的合并单元格,那你就会发现你下行的数据丢失了。
原因就是因为shiftRows这个方法并不是真正的删除单元行!
而是通过移动下面的单元行中的内容上来,覆盖原先的内容,以此来做到类似于删除单元行的样子,但是并不会对合并单元格有影响。
如果你想要删除的单元行与它下面一行的单元格具备不同的合并单元格,那么就会出现影响。
网上找了半天也没有解决办法。
只能自己想法子解决,
解决思路。
让想要删除的单元行与下一行中的单元格格式相同。
首先取得下面一行单元格的格式。(如果下一行中不具备合并单元格,则不需要这一步也可以,如果要删除多行,只要去要删除的最后一行,下面一行的格式即可)
private List<Map<Integer, Integer>> reginMapList(Row row, int columnIndex) {//第一个integer代表起始列数,第二个integer 代表结束列数//保存指定行的 全部合并单元格的格式,非合并单元格不包存List<Map<Integer, Integer>> mapList = new ArrayList<>();Sheet sheet = row.getSheet();int numMergedRegions = sheet.getNumMergedRegions();int rowIndex = row.getRowNum();int firstC;int lastC;int firstR;int lastR;//POI中取得所有的合并单元格 ,顺序是乱的,而不是冲上到下for (i = 0; i < numMergedRegions; i++) {CellRangeAddress cellRangeAddress = sheet.getMergedRegion(i); // 获得合并单元格的起始行, 结束行, 起始列, 结束列firstC = cellRangeAddress.getFirstColumn();lastC = cellRangeAddress.getLastColumn();firstR = cellRangeAddress.getFirstRow();lastR = cellRangeAddress.getLastRow();//当合并单元格行数与指定行相同 ,且指定列数大于或等于单元格起始列时while (firstR == rowIndex && columnIndex <= firstC) {//判断是否属于合并单元格if (columnIndex <= lastC && columnIndex >= firstC && rowIndex <= lastR && rowIndex >= firstR) {Map<Integer, Integer> map = new HashMap<>();map.put(firstC, lastC);mapList.add(map);columnIndex = 1;break;} else {columnIndex++;}}}return mapList;
}
之后删除需要删除的单元行的合并单元格格式
private void deleteRegion(Sheet sheet, int begRow, int endRow, int begCol, int endCol) {//如果指定位置是合并单元格则删除(仅删除一个)//这里是针对我自己的情况//如果要删除一行多个合并单元格,还需要自己去修改int count = sheet.getNumMergedRegions();for (int i = 0; i < count; i++) {CellRangeAddress rangeAddress = sheet.getMergedRegion(i);if (rangeAddress == null) {continue;}int fistRow = rangeAddress.getFirstRow();int lastRow = rangeAddress.getLastRow();int fistCol = rangeAddress.getFirstColumn();int lastCol = rangeAddress.getLastColumn();if (fistRow >= begRow && lastRow <= endRow && fistCol >= begCol && lastCol <= endCol) {sheet.removeMergedRegion(i);}}
}
然后将已经恢复到不具备合并单元格的这行 按照下面一行的格式进行单元格合并,方便删除。
private void cellRegin(Sheet sheet, Row mainRow, List<Map<Integer, Integer>> mapList) {
//mainRow 进行合并单元格的行sheet.removeRow(mainRow);//先把内容删了,防止之后多出数据if (mapList.size() > 0) {for (Map<Integer, Integer> map : mapList) {for (Integer begCol : map.keySet()) {mergedRegion(sheet, new TableRegion(mainRow.getRowNum(), mainRow.getRowNum(), begCol, map.get(begCol)));}}}
}
最后就可以对该行进行删除
sheet.shiftRows(mainRowNum +1, sheet.getLastRowNum(), - 1);//从下行到最后一行 全部上移一行,覆盖该行的内容
这个解决方法比较复杂,但目前也没想到什么其他方法,主要是POI中本身也没有提供删除单元行内容的办法
java poi对Excel表格进行单元行删除相关推荐
- POI设置Excel表格的单元格格式及处理大数的科学计数问题
一.POI设置Excel表格的单元格格式(在导出Excel表时设置各个单元格格式) 1.Excel的单元格格式 图中的数据有数值.货币.时间.日期.文本等格式.这些数据格式在POI中的HSSFDat ...
- java poi 导出excel不能超过65536行
java poi 导出excel不能超过65536行 报这个异常 Exception in thread "main" java.lang.IllegalArgumentExcep ...
- java poi导出Excel表格超大数据量解决方案
Java实现导出excel表格功能,大部分都会使用apache poi,apache poi API 地址 POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果 ...
- 复杂的POI导出Excel表格(多行表头、合并单元格)
poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...
- java poi操作excel 添加 锁定单元格保护
Excel的book保护是很常用的,主要是不想让别人修改Excel的时候用.这样能够避免恶意随便修改数据,提高数据的可信度. 下面介绍JAVA POI来实现设置book保护: 使用HSSFSheet类 ...
- excel导出java不完整_有关Java POI导出excel表格中,单元格合并之后显示不全的解决方法。...
我在table变换excel之后发现合并的单元格不能显示全部边框,在网上找了半天解决方案,终于解决了.具体解决代码如下; /** * 设置合并单元格的边框样式 * * @param sheet 当前表 ...
- java poi导出excel,合并单元格
java导出excel一般都是2种情况,一种是依赖一个实体类进行导出,或者把数据查询出来当成一个视图,对视图进行创建实体:另一种方式就是通过数据还要计算,然后一块统计,那么就不是很好处理了,我采用的是 ...
- java poi word excel 表格 图标
最全: java使用poi在word中生成柱状图.折线图.饼图.柱状图+折线图组合图.动态表格.文本替换.图片替换.更新内置Excel数据.更新插入的文本框内容.合并表格单元格:_我们都有的博客-CS ...
- 4. java poi写入Excel时设置单元格格式为百分比(带百分号)
目录 遇到问题: 最终解决办法: 在开发过程中遇到导出百分比数值到Excel的需求. 遇到问题: 最开始的解决方法是:方式一,比如数值-0.8,设置cell.setCellValue(-0.8*100 ...
最新文章
- linux网络编程之用多线程实现客户端到服务端的通信(基于udp)
- python gui开发_python 开发GUI应用之Dabo
- sql server链接远程服务器上的csv文件_批量监控联想服务器硬件状态工具
- nginx入门(4):FastCGI代理
- Elasticsearch 实战2:ES 项目实战(二):基本操作、批处理、高级查询
- maven本地安装jar
- Java 类锁、对象锁、私有锁
- mii-tool查看网卡状态
- 固态硬盘能不能提高计算机速度,固态硬盘掉速如何解决?用这几招轻松提升PC速度...
- [含lw+源码等]微信小程序在线考试管理系统+后台管理系统[包运行成功]
- 卡内基梅隆大学计算机科学博士,美国卡内基梅隆大学博士需要几年
- 如何在Mysql中运行SQL文件
- Python moviepy 快速视频剪辑编辑神器
- iOS开发者问题答疑——买号、关联、刷评论
- 使用Matlab提取ADC采样数据中的噪声
- hashmap是无序的但是实际输出有序?
- 戏言产品三板斧,拿着三宝来作秀
- Tinkercad简介
- Navbar:导航栏的位置
- 机器人改变生活利弊英语作文_最新雅思写作语料库:机器人利弊