`
zhuyufufu
  • 浏览: 138769 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java POI Excel 行高自适应

阅读更多
  在Excel处理的过程中,可能有需要用到行高自适应的时候。

  下面贴出用POI实现Excel行高自适应的代码。

  该代码可以处理一行Excel按内容自适应高度。可以处理合并单元格。

  上代码:
/**
	 * 根据行内容重新计算行高
	 * @param row
	 */
	public static void calcAndSetRowHeigt(HSSFRow sourceRow) {
		for (int cellIndex = sourceRow.getFirstCellNum(); cellIndex <= sourceRow.getPhysicalNumberOfCells(); cellIndex++) {
			//行高
			double maxHeight = sourceRow.getHeight();
			HSSFCell sourceCell = sourceRow.getCell(cellIndex);
			//单元格的内容
			String cellContent = getCellContentAsString(sourceCell);
			if(null == cellContent || "".equals(cellContent)){
				continue;
			}
			//单元格的宽高及单元格信息
			Map<String, Object> cellInfoMap = getCellInfo(sourceCell);
			Integer cellWidth = (Integer)cellInfoMap.get("width");
			Integer cellHeight = (Integer)cellInfoMap.get("height");
			if(cellHeight > maxHeight){
				maxHeight = cellHeight;
			}
			System.out.println("单元格的宽度 : " + cellWidth + "    单元格的高度 : " + maxHeight + ",    单元格的内容 : " + cellContent);
			HSSFCellStyle cellStyle = sourceCell.getCellStyle();
			HSSFFont font = cellStyle.getFont(sourceRow.getSheet().getWorkbook());
			//字体的高度
			short fontHeight = font.getFontHeight();
			
			//cell内容字符串总宽度
			double cellContentWidth = cellContent.getBytes().length * 2 * 256;
			
	        //字符串需要的行数 不做四舍五入之类的操作
	        double stringNeedsRows =(double)cellContentWidth / cellWidth;
	        //小于一行补足一行
	        if(stringNeedsRows < 1.0){
	        	stringNeedsRows = 1.0;
	        }
	        
	        //需要的高度 			(Math.floor(stringNeedsRows) - 1) * 40 为两行之间空白高度
	        double stringNeedsHeight = (double)fontHeight * stringNeedsRows;
	        //需要重设行高
	        if(stringNeedsHeight > maxHeight){
	        	maxHeight = stringNeedsHeight;
	        	//超过原行高三倍 则为5倍 实际应用中可做参数配置
	    		if(maxHeight/cellHeight > 5){
	    			maxHeight = 5 * cellHeight;
	    		}
	    		//最后取天花板防止高度不够
	    		maxHeight = Math.ceil(maxHeight);
	    		//重新设置行高 同时处理多行合并单元格的情况
	    		Boolean isPartOfRowsRegion = (Boolean)cellInfoMap.get("isPartOfRowsRegion");
	    		if(isPartOfRowsRegion){
	    			Integer firstRow = (Integer)cellInfoMap.get("firstRow");
	    			Integer lastRow = (Integer)cellInfoMap.get("lastRow");
	    			//平均每行需要增加的行高
	    			double addHeight = (maxHeight - cellHeight)/(lastRow - firstRow + 1);
	    			for (int i = firstRow; i <= lastRow; i++) {
	    				double rowsRegionHeight =sourceRow.getSheet().getRow(i).getHeight() + addHeight;
	    				sourceRow.getSheet().getRow(i).setHeight((short)rowsRegionHeight);
	    			}
	    		}else{
	    			sourceRow.setHeight((short)maxHeight);
	    		}
	        }
	        System.out.println("字体高度 : " + fontHeight + ",    字符串宽度 : " + cellContentWidth + ",    字符串需要的行数 : " + stringNeedsRows + ",   需要的高度 : " + stringNeedsHeight + ",   现在的行高 : " + maxHeight);
	        System.out.println();
		}
	}
	
	/**
	 * 解析一个单元格得到数据
	 * @param cell
	 * @return
	 */
	private static String getCellContentAsString(HSSFCell cell) {
		if(null == cell){
			return "";
		}
		String result = "";
		switch (cell.getCellType()) {
		case Cell.CELL_TYPE_NUMERIC:
			String s = String.valueOf(cell.getNumericCellValue());
			if (s != null) {
				if (s.endsWith(".0")) {
					s = s.substring(0, s.length() - 2);
				}
			}
			result = s;
			break;
		case Cell.CELL_TYPE_STRING:
			result = ToolKits.nulltoempty(String.valueOf(cell.getStringCellValue())).trim();
			break;
		case Cell.CELL_TYPE_BLANK:
			break;
		case Cell.CELL_TYPE_BOOLEAN:
			result = String.valueOf(cell.getBooleanCellValue());
			break;
		case Cell.CELL_TYPE_ERROR:
			break;
		default:
			break;
		}
		return result;
	}
	
	/**
     * 获取单元格及合并单元格的宽度
     * @param cell
     * @return
     */
    private static Map<String, Object> getCellInfo(HSSFCell cell) {
    	HSSFSheet sheet = cell.getSheet();
    	int rowIndex = cell.getRowIndex();
    	int columnIndex = cell.getColumnIndex();
    	
    	boolean isPartOfRegion = false;
    	int firstColumn = 0;
    	int lastColumn = 0;
    	int firstRow = 0;
    	int lastRow = 0;
		int sheetMergeCount = sheet.getNumMergedRegions();
		for (int i = 0; i < sheetMergeCount; i++) {
			Region ca = sheet.getMergedRegionAt(i);
			firstColumn = ca.getColumnFrom();
			lastColumn = ca.getColumnTo();
			firstRow = ca.getRowFrom();
			lastRow = ca.getRowTo();
			if (rowIndex >= firstRow && rowIndex <= lastRow) {
				if (columnIndex >= firstColumn && columnIndex <= lastColumn) {
					isPartOfRegion = true;
					break;
				}
			}
		}
		Map<String, Object> map = new HashMap<String, Object>();
		Integer width = 0;
		Integer height = 0;
		boolean isPartOfRowsRegion = false;
		if(isPartOfRegion){
			for (int i = firstColumn; i <= lastColumn; i++) {
				width += sheet.getColumnWidth(i);
			}
			for (int i = firstRow; i <= lastRow; i++) {
				height += sheet.getRow(i).getHeight();
			}
			if(lastRow > firstRow){
				isPartOfRowsRegion = true;
			}
		}else{
			width = sheet.getColumnWidth(columnIndex);
			height += cell.getRow().getHeight();
		}
		map.put("isPartOfRowsRegion", isPartOfRowsRegion);
		map.put("firstRow", firstRow);
		map.put("lastRow", lastRow);
		map.put("width", width);
		map.put("height", height);
		return map;
	}
1
3
分享到:
评论
1 楼 zenghongqing 2015-01-19  
您好,请教您一个问题:
//cell内容字符串总宽度 
double cellContentWidth = cellContent.getBytes().length * 2 * 256;
这一段代码为什么要乘以256?这个算字符串的宽度必须要乘256吗?为什么不是乘一个别的数?

相关推荐

    JAVA POI Excel转Html

    JAVA POI Excel转Html,代码和所需的jar都在压缩包,项目在线预览需求,实现后分享下

    java_poi实现excel导入导出

    Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Excel 文件。在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java ...

    POI的EXCEL导出,自动换行

    Apache POI项目提供了一系列用于读写Microsoft Office格式文件的Java API,其中包括对Excel的支持。本文将详细介绍如何使用Apache POI实现Excel的导出功能,并在此基础上实现自动换行。 #### 一、Apache POI简介 ...

    Java POI EXCEL导入导出

    Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出...

    Java POI 生成Excel时显示货币格式

    在Java开发中,Apache POI库是处理Microsoft Office文件(如Word、Excel)的强大工具。本文将深入探讨如何使用Java POI生成带有货币格式的Excel文件,这在财务报告和其他需要精确货币显示的应用场景中尤为关键。 ##...

    Java Poi 导出excel(支持各种设置字体、颜色、垂直居中)

    Java Poi 导出excel(支持各种设置字体、颜色、垂直居中)

    java的poi生成excel图表demo

    Java的Apache POI库是一个强大的工具,用于读取、创建和修改Microsoft Office格式的文件,尤其是Excel(.xlsx)文档。在本示例中,我们将深入探讨如何利用POI库来生成Excel中的图表曲线,这对于数据可视化和报告生成...

    java poi导出图片到excel示例代码

    Java POI导出图片到Excel示例代码详解 Java POI是Java开发中常用的开源库,用于读写Microsoft Office文件格式,包括Excel、Word、PowerPoint等。今天,我们将介绍如何使用Java POI将图片导出到Excel中。 标题解释 ...

    java使用poi在excel单元格添加超链接,设置字体颜色(csdn)————程序.pdf

    在Java开发中,Apache POI库是一个非常实用的工具,用于读取、写入和修改Microsoft Office格式的文件,特别是Excel。本篇文章主要探讨如何利用POI在Excel单元格中添加超链接,并设置字体颜色。 首先,为了使用...

    Java Poi 操作excel的API 好用

    Java POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,尤其是Excel。它提供了丰富的API,使得在Java环境中操作Excel文件变得极其便捷。本文将深入探讨Java POI的使用,包括其核心功能、API使用示例...

    JAVA poi 做EXCEL导出(包含图片) 完整版

    在Java编程环境中,Apache POI库是一个非常实用的工具,用于读取、写入和修改Microsoft Office格式的文件,特别是Excel(.xlsx 和 .xls)文件。本教程将详细介绍如何使用JAVA POI库来创建一个包含图片的完整Excel...

    Java POI Excel封装例子

    Java POI Excel封装例子 public class ExcelUtils

    java poi操作excel小例子

    Java POI 操作 Excel 是一个常见的任务,在许多业务场景中都需要用到,比如数据导入导出、数据分析等。Apache POI 是一个流行的开源库,它允许开发者使用 Java 来读写 Microsoft Office 格式的文件,其中包括 Excel ...

    java poi导出excel

    Java POI库是Apache软件基金会开发的一个开源项目,专门用于读写Microsoft Office格式的文件,包括Excel。在Java中,如果你需要导出Excel文件,Java POI是一个非常实用的工具。下面将详细介绍如何使用Java POI来实现...

    java导出excel POI jar包

    Apache POI库是Java领域中广泛使用的工具,它允许开发者读写Microsoft Office格式的文件,包括Excel(.xlsx和.xls)。本篇文章将深入讲解如何使用POI库在Java中实现Excel的导出功能,以及涉及到的相关jar包及其作用...

    Java Poi 解析EXCEL数据

    Java Poi库是Apache软件基金会开发的一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel、Word和PowerPoint等。在Java世界中,Poi是解析和操作这些文件的首选工具,尤其在数据导入导出、自动化测试、...

    Java poi 实现excel导入导出

    在Java编程环境中,Apache POI库是一个非常重要的工具,它允许开发者读取、写入和修改Microsoft Office格式的文件,尤其是Excel(.xlsx 和 .xls)文件。本教程将深入探讨如何利用Java POI库来实现Excel的导入与导出...

    Java通过POI读取Excel遍历数据,批量生成word文档

    Apache POI是一个开源项目,它允许Java开发者处理Microsoft Office格式的文件,如Excel(.xlsx或.xls)和Word(.docx)。 首先,我们需要导入Apache POI的相关依赖。在Maven项目中,可以在pom.xml文件中添加以下...

    java poi excel上传 下载

    Java POI 是一个开源库,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在Java中,利用Apache POI库可以方便地进行Excel文件的读写操作,从而实现Excel数据的上传和下载功能。这个项目提供的...

Global site tag (gtag.js) - Google Analytics