`
chenshangge
  • 浏览: 88010 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类

POI解析合并单元格

POI 
阅读更多
excel中的合并单元格其实就是首单元格,只不过该单元格增加了 rowspan和colspan两个属性。
并且把该单元格的高度和宽度变成(例如rowspan=2,colspan=3)2行,3列的的标尺长度,再把被合并的单元格(除了首单元格的其余5个单元格)隐藏。


public class ExcelUtils{


	private void readExcel(Workbook wb) {  
		Sheet sheet = wb.getSheetAt(0);  
		Row row = null;  

		for(int i=0; i<sheet.getPhysicalNumberOfRows(); i++) 
		{  
			row = sheet.getRow(i);  
			for(int j = 0; j < row.getLastCellNum();j++) 
			{  
				Cell c = row.getCell(j);
				boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());  
				//判断是否具有合并单元格  
				if(isMerge) {  
					String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());  
					System.out.print(rs+" ");
				}else {  
					System.out.print(c.getRichStringCellValue()+" ");  
				}  
			}  

		}  

	}  

	/**   
	 * 获取合并单元格的值   
	 * @param sheet   
	 * @param row   
	 * @param column   
	 * @return   
	 */    
	public String getMergedRegionValue(Sheet sheet ,int row , int column){    
		int sheetMergeCount = sheet.getNumMergedRegions();   //获得该sheet所有合并单元格数量 

		for(int i = 0 ; i < sheetMergeCount ; i++){    
			CellRangeAddress ca = sheet.getMergedRegion(i);    // 获得合并区域
			int firstColumn = ca.getFirstColumn();    
			int lastColumn = ca.getLastColumn();    
			int firstRow = ca.getFirstRow();    
			int lastRow = ca.getLastRow();    

			
			//判断传入的单元格的行号列号是否在合并单元格的范围内,如果在合并单元格的范围内,择返回合并区域的首单元格格值
			if(row >= firstRow && row <= lastRow){    

				if(column >= firstColumn && column <= lastColumn){    
					Row fRow = sheet.getRow(firstRow);    
					Cell fCell = fRow.getCell(firstColumn);    
					return getCellValue(fCell) ;    
				}    
			}    
		}    
		//如果该单元格行号列号不在任何一个合并区域,择返回null
		return null ;    
	}    

	/**  
	 * 判断合并了行  
	 * @param sheet  
	 * @param row  
	 * @param column  
	 * @return  
	 */  
	private boolean isMergedRow(Sheet sheet,int row ,int column) {  
		int sheetMergeCount = sheet.getNumMergedRegions();  
		for (int i = 0; i < sheetMergeCount; i++) {  
			CellRangeAddress range = sheet.getMergedRegion(i);  
			int firstColumn = range.getFirstColumn();  
			int lastColumn = range.getLastColumn();  
			int firstRow = range.getFirstRow();  
			int lastRow = range.getLastRow();  
			if(row == firstRow && row == lastRow){  
				if(column >= firstColumn && column <= lastColumn){  
					return true;  
				}  
			}  
		}  
		return false;  
	}  

	/**  
	 * 判断指定的单元格是否是合并单元格  
	 * @param sheet   
	 * @param row 行下标  
	 * @param column 列下标  
	 * @return  
	 */  
	private boolean isMergedRegion(Sheet sheet,int row ,int column) {  
		int sheetMergeCount = sheet.getNumMergedRegions();  
		for (int i = 0; i < sheetMergeCount; i++) {  
			CellRangeAddress range = sheet.getMergedRegion(i);  
			int firstColumn = range.getFirstColumn();  
			int lastColumn = range.getLastColumn();  
			int firstRow = range.getFirstRow();  
			int lastRow = range.getLastRow();  
			if(row >= firstRow && row <= lastRow){  
				if(column >= firstColumn && column <= lastColumn){  
					return true;  
				}  
			}  
		}  
		return false;  
	}  

	/**  
	 * 判断sheet页中是否含有合并单元格   
	 * @param sheet   
	 * @return  
	 */  
	private boolean hasMerged(Sheet sheet) {  
		return sheet.getNumMergedRegions() > 0 ? true : false;  
	}  

	/**  
	 * 合并单元格  
	 * @param sheet   
	 * @param firstRow 开始行  
	 * @param lastRow 结束行  
	 * @param firstCol 开始列  
	 * @param lastCol 结束列  
	 */  
	private void mergeRegion(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) {  
		sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));  
	}  

	/**   
	 * 获取单元格的值   
	 * @param cell   
	 * @return   
	 */    
	public String getCellValue(Cell cell){    

		if(cell == null) return "";    

		if(cell.getCellType() == Cell.CELL_TYPE_STRING){    

			return cell.getStringCellValue();    

		}else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){    

			return String.valueOf(cell.getBooleanCellValue());    

		}else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){    

			return cell.getCellFormula() ;    

		}else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){    

			return String.valueOf(cell.getNumericCellValue());    

		}    
		return "";    
	}    
}  

}


原理:
通过sheet.getNumMergedRegions();获得所有合并单元格的数量,并且一一遍历,判断传入的单元格行下标和列下标是否在该合并单元格的范围内,如果在,则直接返回该合并区域首单元格的值,如果不在则继续判断下一个合并区域。如果不在任何一个合并区域内,则是非合并单元格
分享到:
评论

相关推荐

    poi获取合并单元格

    ### POI 获取合并单元格详解 #### 一、概述 Apache POI 是一个流行的 Java 库,用于处理 Microsoft Office 格式的文档,如 Word、Excel 和 PowerPoint。在本篇文章中,我们将详细介绍如何使用 POI 处理 Excel 文件...

    poi读取合并单元格帮助类

    在处理Excel文件时,合并单元格是一种常见的需求,特别是在读取数据时,正确地解析合并单元格对于保持数据完整性至关重要。 ### Apache POI与合并单元格 #### 1. **理解合并单元格** 在Excel中,合并单元格是指将...

    poi获取exccel有合并单元格的数据

    ### 使用Apache POI获取含有合并单元格的Excel数据并存储为List 在处理Excel文档时,经常需要读取其中的数据并进行进一步的操作。当Excel文件中含有合并单元格时,简单的读取方法可能无法准确地获取到所有数据。...

    POI读取Excel合并单元格并储存

    本文将深入探讨如何使用Java的Apache POI库来读取Excel文件,并处理其中合并单元格的数据,同时将这些数据存储到实体类中以供后续使用。 Apache POI是一个强大的库,允许程序员使用Java来创建、修改和显示Microsoft...

    excel合并单元格导入

    2. **数据处理问题**:在编程中,如Python的Pandas库或Java的Apache POI库处理Excel时,合并单元格可能导致数据读取不一致。例如,如果一个列中的某些单元格被合并,那么对应的行数将无法与未合并的数据对齐,从而...

    将HtmlTable 导出为Execl文件,支持合并单元格、合并行,无需Office支持

    3. **映射HTML表格到Excel**:将解析到的数据填充到工作簿对象中,同时处理合并单元格和行的逻辑。 4. **保存为Excel文件**:最后,将工作簿对象写入到Excel文件中,可以是XLSX或XLS格式。 在这个名为...

    NPOI读取模板导出Excel(合并单元格)

    ### NPOI读取模板导出Excel(合并单元格) #### 概述 在实际工作中,经常需要将数据导出到Excel文件中,并且在某些情况下还需要对单元格进行合并处理,以达到美观或者特定需求的目的。NPOI是.NET平台上一个强大的...

    poi操作表格

    描述提到“Android可以操作简单的表格,进行合并单元格等操作”,这表明Apache POI的功能已经扩展到Android平台,使得Android应用也能处理Excel数据,如合并单元格,这是在创建或编辑表格时常见的需求。在Android...

    poi 解析excel实例

    在描述中提到的“ poi解析excel的工具类”,通常包含了一些常用的方法,例如打开文件、读取单元格数据、处理合并单元格等。以下是一些可能包含在该工具类中的关键方法: 1. **打开文件**:使用`WorkbookFactory`类...

    excel对合并后的单元格进行拆分

    ### Excel宏实现合并单元格的拆分 在Excel中,我们经常会遇到需要将多个单元格合并成一个单元格的情况,以便让数据看起来更加简洁或美观。然而,在进行数据分析时,合并后的单元格可能会带来一些不便,例如无法直接...

    pio读取合并的单元格

    #### 三、Apache POI中的合并单元格处理 在Apache POI中,可以通过`HSSFSheet`类来操作合并的单元格。具体来说,可以通过`getNumMergedRegions()`方法获取合并区域的数量,再通过`getMergedRegionAt(int index)`...

    合并单元格导出数据到excel.rar

    7. **最佳实践**:在实际应用中,应注意避免过度合并单元格,以免影响数据的可读性和解析性。同时,优化数据库查询以提高性能,尤其是在处理大量数据时。 8. **扩展应用**:除了基础的导出功能,还可以结合其他Java...

    poi解析excel

    10. **高级功能**:除了基本操作,POI还支持合并单元格、图表、数据验证、公式计算等多种Excel特性。 总之,Apache POI是一个强大的工具,可以用于处理各种Excel任务,从简单的数据读写到复杂的报表生成。通过下载...

    poi 解析 office excel 2003,2007 word 2003,2007 的示例

    本示例将详细介绍如何使用Apache POI解析Office Excel 2003和2007,以及Word 2003和2007的文件。 首先,我们来看Excel的解析。Excel 2003使用的是.BOOK文件格式(HSSFWorkbook),而2007及以上版本使用的是.XLSX...

    poi解析excel所需所有jar包

    以上就是关于Apache POI解析Excel所需jar包的基本介绍,通过这个库,你可以轻松地实现对Excel文件的各种操作,包括读取数据、写入数据、格式化单元格、合并单元格等。在实际开发中,根据具体需求,你可能还需要了解...

    POI解析xlsx

    Apache POI 是一个开源库,专门用于处理 Microsoft Office 格式的文件,如 .doc, .docx, .xls, .xlsx 等。在给定的描述中,开发者分享了...在实际项目中,你可能还需要处理更复杂的场景,如样式、合并单元格、图表等。

    POI解析execl详解

    "使用POI生成Excel文件 - JustJava - BlogJava.htm"和"poi包 读写excel文件 - 菜鸟天堂 - ITeye技术网站.htm"这两个资源很可能包含了更详细的教程和示例,涵盖了更复杂的操作,如格式化单元格、合并单元格、添加公式...

    poi excel解析

    在实际应用中,我们可能还需要处理更复杂的情况,如合并单元格、读取公式、处理图表、处理数据验证规则等。POI库提供了丰富的API来支持这些功能。 至于描述中的“下载支持2003及2007格式的下载”,这通常意味着程序...

    java通过poi解析Excel示例

    此外,POI还支持对Excel进行更复杂的操作,如创建新的工作表、合并单元格、设置样式和公式等。如果你需要处理的Excel文件包含复杂的数据结构,例如表头、多级索引或公式计算,你需要了解更多的API和方法。 在实际...

    poi excel 模板读取 复制表 复制行且区分合并行

    本篇将详细介绍如何使用Apache POI来读取Excel模板,复制工作表(Sheet)以及复制行,并特别关注如何处理合并单元格的情况。 首先,我们需要引入Apache POI的相关依赖库到我们的项目中。在Maven项目中,可以在pom....

Global site tag (gtag.js) - Google Analytics