POI进行Excel的合并单元格数据处理

近日接到一个要处理合并Excel单元格的上料表的需求,就到网上找了一些模板,发现有的技术大牛还是挺厉害的,对他们致以敬意。

合并单元格工具类

在这个类中将传入的文件转化成流对象,再对其进行具体的数据处理

public class ExcelUtilsMerge {public static Map<String, Object> readFileContentToEntity(InputStream inputStream) {Map<String, Object> excelMap = new HashMap<>(16);List<List<ExcelEntity>> result = new ArrayList<>();Workbook wb = null;try {wb = WorkbookFactory.create(inputStream);} catch (IOException e) {}if (wb == null) {return excelMap;}// 获取excel中存在的sheet个数int sheetsNum = wb.getNumberOfSheets();if (sheetsNum <= 0) {return excelMap;}for (int i = 0; i < sheetsNum; i++) {Sheet sheet = wb.getSheetAt(i);// 读取excel数据if (sheet.getPhysicalNumberOfRows() <= 0) {continue;}int coloumNum = sheet.getRow(0).getPhysicalNumberOfCells();result.addAll(dealWithExcelSheet(sheet));// 列总数excelMap.put("totalColumnNumber", coloumNum);// 数据集excelMap.put("data", result);}return excelMap;}/*** @Description: 读取sheet中的数据* @author: drj* @date: 2019/5/22 17:14*/private static List<List<ExcelEntity>> dealWithExcelSheet(Sheet sheet) {List<List<ExcelEntity>> result = new ArrayList<>();// 遍历sheet行for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {List<ExcelEntity> record = new ArrayList<>();Row row = sheet.getRow(i);  //首先獲取Excel的行// 遍历行中的没有个单元格if (row == null || row.getPhysicalNumberOfCells() <= 0) {continue;}//循環列for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {Cell cell = row.getCell(j);  //獲取沒個單元的值if (cell == null) {continue;}// 读取单元格数据格式(标记为字符串)cell.setCellType(CellType.STRING);String value = cell.getStringCellValue();// 处理有值的cellif (StringUtils.isEmpty(value)) {continue;}try {value = value.trim();ExcelEntity entity = new ExcelEntity();  //初始化封裝好的返回Excel實體類// 起始行数entity.setStartRow(i);// 结束行数entity.setEndRow(getMergeRowNum(cell, sheet) + i - 1);  //加上当前行数,因为获取的当前行数加了1,所以要减1// 起始列数entity.setStartCol(j);// 结束列数entity.setEndCol(getMergeColumNum(cell, sheet) + j - 1); //加上当前列数,因为获取的当前列数加了1,所以要减1// 单元格数据entity.setValue(value); //将获取的值添加Value里record.add(entity);} catch (NumberFormatException e) {}}result.add(record);}return result;}/*** @param cell  当前cell* @param sheet 当前sheet* @Description: 获取当前cell合并的行数* @author: drj* @date: 2019/5/22 18:00*/public static int getMergeRowNum(Cell cell, Sheet sheet) {int mergeSize = 1;List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();   //獲取的是合併的區域for (CellRangeAddress cellRangeAddress : mergedRegions) {   //對合併區域進行循環if (cellRangeAddress.isInRange(cell)) {   //判斷傳入單元格是否在合併區域中//获取合并的行数mergeSize = cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow() + 1;break;}}return mergeSize;}/*** @param cell  当前cell* @param sheet 当前sheet* @Description: 获取合并的列数* @author: drj* @date: 2019/5/22 17:59*/public static int getMergeColumNum(Cell cell, Sheet sheet) {int mergeSize = 1;List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();for (CellRangeAddress cellRangeAddress : mergedRegions) {if (cellRangeAddress.isInRange(cell)) {//获取合并的列数mergeSize = cellRangeAddress.getLastColumn() - cellRangeAddress.getFirstColumn() + 1;break;}}return mergeSize;}
}

返回的Excel对象实体类

这个类定义了要返回的结果集对象,封装了开始行结束行,开始列结束列,以及单元格的值.

public class ExcelEntity {/*** 开始行*/private int startRow;/*** 结束行*/private int endRow;/*** 开始列*/private int startCol;/*** 结束列*/private int endCol;/*** 单元格值*/private String value;public int getStartRow() {return startRow;}public void setStartRow(int startRow) {this.startRow = startRow;}public int getEndRow() {return endRow;}public void setEndRow(int endRow) {this.endRow = endRow;}public int getStartCol() {return startCol;}public void setStartCol(int startCol) {this.startCol = startCol;}public int getEndCol() {return endCol;}public void setEndCol(int endCol) {this.endCol = endCol;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}
}

测试类

返回的结果集的数据类型是List,然后每一行封装为一个类型为ExcelEntity的List.

        InputStream inputStream = file.getInputStream();Map<String, Object> result = ExcelUtilsMerge.readFileContentToEntity(inputStream);List<List<ExcelEntity>> data = (List<List<ExcelEntity>>) result.get("data");

网上的技术点琳琅满目,而在这样杂而乱的网络环境中,亦要吸取其精华,让它变为自己的东西,这才是真正的学习~

POI进行Excel的合并单元格数据处理相关推荐

  1. java poi导出excel,合并单元格

    java导出excel一般都是2种情况,一种是依赖一个实体类进行导出,或者把数据查询出来当成一个视图,对视图进行创建实体:另一种方式就是通过数据还要计算,然后一块统计,那么就不是很好处理了,我采用的是 ...

  2. poi 导出Excel 动态 合并单元格

    public String arrearagePeriodExport(ArrearageParam param) {param.setPageNo(1);param.setPageSize(Inte ...

  3. poi 导出excel 中合并单元格

    参数说明 CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) CellRangeAddress(起始行号,终止 ...

  4. Springboot导出excel,合并单元格示例

    原文链接:Springboot导出excel,合并单元格示例 更多文章,欢迎访问:Java知音,一个专注于技术分享的网站 以下用一个示例来说明springboot如何导出数据到excel. 首先引入M ...

  5. Java 利用hutool工具实现导出excel并合并单元格

    Java 利用hutool工具实现导出excel并合并单元格 controller层调用service,就一个核心方法,没错就下面这个代码就能实现了.前提是项目里面要引用hutool包.把我这个复制到 ...

  6. 玩电脑的岂能不知道excel怎么合并单元格?

    excel怎么合并单元格?单元格太小导致输入的内容只能看见一部分,这种情况下需要将两列合并起来,空出更多输入内容的空间,以此达到美观又详细的视觉效果,下面来看看如何操作吧! 方法一 第1步:打开一个e ...

  7. 使用POI创建word表格合并单元格兼容wps

    poi创建word表格合并单元格代码如下: /** * @Description: 跨列合并 */ public void mergeCellsHorizontal(XWPFTable table, ...

  8. html表格里面怎么合并单元格的快捷键,合并单元格快捷键:Excel怎么合并单元格...

    今天来聊聊一篇关于合并单元格快捷键:Excel怎么合并单元格的文章,现在就为大家来简单介绍下合并单元格快捷键:Excel怎么合并单元格,希望对各位小伙伴们有所帮助. 方法如下: 1.首先我们需要将&q ...

  9. 【excel】合并单元格拆分后每一格都填充为与原来相同内容

    用的比较频繁的一个操作,单元格合并拆分出的单元格自动填充为合并前内容 比较烦合并单元格,记得以前看过一本excel书里把合并单元格列为一大恶习,因为这严重影响数据分析,但那本书没说怎么处理,导致我才学 ...

最新文章

  1. 让Hive支持行级insert、update、delete
  2. 华为USG地址池方式的NAPT和NAT Server配置案例
  3. Raw_Socket原始套接字
  4. android ontoch事件无反应_一切从android的handler说起(三)
  5. 如何阅读一本书 pdf_《如何阅读一本书》:一本书,四个层次,看阅读小白如何逆袭?...
  6. java中sql语句怎么把开始和结束时间作为参数写sql查询_聊一聊MyBatis 和 SQL 注入间的恩恩怨怨
  7. 修改Tomcat欢迎界面为自己项目界面
  8. iOS实现简书的账号识别方式(正则表达式)
  9. win10系统怎么改奇摩输入法_windows10如何更改输入法
  10. PHP多功能自动发卡平台源码+带WAP端/多套模板
  11. Go Dumpling!让导出数据更容易
  12. Web Vue VI
  13. 普元 AppServer 6.5 业务应用连接mysql数据库报错:java.security.UnrecoverableKeyException: Password verification fai
  14. 投资20亿 宁波大数据云基地揭牌
  15. Think in automotive Ethernet Topology
  16. 《黑客帝国》完全解析
  17. 15、面向对象语言的23种设计模式-模板方法模式
  18. Linux C小项目 —— 实现自己的myshell
  19. 数字土壤制图——精准农业
  20. 整形医院微信营销方案

热门文章

  1. Mina心跳检测实现
  2. 垂直同步是什么意思?游戏中垂直同步的作用
  3. dir655 虚拟服务器,D-Link DIR-600M 无线路由器端口映射设置指南
  4. 求历年奥斯卡获奖动画影片
  5. 编写程序接收用户输入分数信息,如果分数在0—100之间,输出成绩。如果成绩不在该范围内,抛出异常信息,提示分数必须在0—100之间。
  6. ssm+JSP计算机毕业设计游戏战队考核系统o8lh5【源码、程序、数据库、部署】
  7. Android Tv电视机盒子使用Recyclerview实现飞框动画
  8. opencv图片转幻灯片视频
  9. 王颖奇 20171010129《面向对象程序设计(java)》第十一周学习总结
  10. r5 3500u什么水平_预算6000左右,买什么笔记本电脑(游戏本),求指教?