PoiUtil.java 用于excel间sheet复制

前言:apache提供的poi功能确实比较强大,但是不明白为什么没有相应的方法实现不同excel文件中sheet的复制功能。这也是本文整理PoiUtil工具类的初衷。网上有相关的解决方案,在参考了网上诸多的解决方案、示例代码之后,就有了该工具类,特别感谢各位前辈,让我能够站在巨人的肩膀上,用拳头抠抠鼻屎。废话不多说了,下面是PoiUtil工具类的源码:

package com.poi.extend;

import java.util.HashMap;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.hssf.util.HSSFColor;

/**
 * POI工具类 功能点: 
 * 1、实现excel的sheet复制,复制的内容包括单元的内容、样式、注释
 * 2、setMForeColor修改HSSFColor.YELLOW的色值,setMBorderColor修改PINK的色值
 * 
 * @author Administrator
 */
public final class PoiUtil {

	/**
	 * 功能:拷贝sheet
	 * 实际调用 	copySheet(targetSheet, sourceSheet, targetWork, sourceWork, true)
	 * @param targetSheet
	 * @param sourceSheet
	 * @param targetWork
	 * @param sourceWork                                                                   
	 */
	public static void copySheet(HSSFSheet targetSheet, HSSFSheet sourceSheet,
			HSSFWorkbook targetWork, HSSFWorkbook sourceWork) throws Exception{
		if(targetSheet == null || sourceSheet == null || targetWork == null || sourceWork == null){
			throw new IllegalArgumentException("调用PoiUtil.copySheet()方法时,targetSheet、sourceSheet、targetWork、sourceWork都不能为空,故抛出该异常!");
		}
		copySheet(targetSheet, sourceSheet, targetWork, sourceWork, true);
	}

	/**
	 * 功能:拷贝sheet
	 * @param targetSheet
	 * @param sourceSheet
	 * @param targetWork
	 * @param sourceWork
	 * @param copyStyle					boolean 是否拷贝样式
	 */
	public static void copySheet(HSSFSheet targetSheet, HSSFSheet sourceSheet,
			HSSFWorkbook targetWork, HSSFWorkbook sourceWork, boolean copyStyle)throws Exception {
		
		if(targetSheet == null || sourceSheet == null || targetWork == null || sourceWork == null){
			throw new IllegalArgumentException("调用PoiUtil.copySheet()方法时,targetSheet、sourceSheet、targetWork、sourceWork都不能为空,故抛出该异常!");
		}
		
		//复制源表中的行
		int maxColumnNum = 0;

		Map styleMap = (copyStyle) ? new HashMap() : null;
		
		HSSFPatriarch patriarch = targetSheet.createDrawingPatriarch(); //用于复制注释
		for (int i = sourceSheet.getFirstRowNum(); i <= sourceSheet.getLastRowNum(); i++) {
			HSSFRow sourceRow = sourceSheet.getRow(i);
			HSSFRow targetRow = targetSheet.createRow(i);
			
			if (sourceRow != null) {
				copyRow(targetRow, sourceRow,
						targetWork, sourceWork,patriarch, styleMap);
				if (sourceRow.getLastCellNum() > maxColumnNum) {
					maxColumnNum = sourceRow.getLastCellNum();
				}
			}
		}
		
		//复制源表中的合并单元格
		mergerRegion(targetSheet, sourceSheet);
		
		//设置目标sheet的列宽
		for (int i = 0; i <= maxColumnNum; i++) {
			targetSheet.setColumnWidth(i, sourceSheet.getColumnWidth(i));
		}
	}
	
	/**
	 * 功能:拷贝row
	 * @param targetRow
	 * @param sourceRow
	 * @param styleMap
	 * @param targetWork
	 * @param sourceWork
	 * @param targetPatriarch
	 */
	public static void copyRow(HSSFRow targetRow, HSSFRow sourceRow,
			HSSFWorkbook targetWork, HSSFWorkbook sourceWork,HSSFPatriarch targetPatriarch, Map styleMap) throws Exception {
		if(targetRow == null || sourceRow == null || targetWork == null || sourceWork == null || targetPatriarch == null){
			throw new IllegalArgumentException("调用PoiUtil.copyRow()方法时,targetRow、sourceRow、targetWork、sourceWork、targetPatriarch都不能为空,故抛出该异常!");
		}
		
		//设置行高
		targetRow.setHeight(sourceRow.getHeight());
		
		for (int i = sourceRow.getFirstCellNum(); i <= sourceRow.getLastCellNum(); i++) {
			HSSFCell sourceCell = sourceRow.getCell(i);
			HSSFCell targetCell = targetRow.getCell(i);
			
			if (sourceCell != null) {
				if (targetCell == null) {
					targetCell = targetRow.createCell(i);
				}
				
				//拷贝单元格,包括内容和样式
				copyCell(targetCell, sourceCell, targetWork, sourceWork, styleMap);
				
				//拷贝单元格注释
				copyComment(targetCell,sourceCell,targetPatriarch);
			}
		}
	}
	
	/**
	 * 功能:拷贝cell,依据styleMap是否为空判断是否拷贝单元格样式
	 * @param targetCell			不能为空
	 * @param sourceCell			不能为空
	 * @param targetWork			不能为空
	 * @param sourceWork			不能为空
	 * @param styleMap				可以为空				
	 */
	public static void copyCell(HSSFCell targetCell, HSSFCell sourceCell, HSSFWorkbook targetWork, HSSFWorkbook sourceWork,Map styleMap) {
		if(targetCell == null || sourceCell == null || targetWork == null || sourceWork == null ){
			throw new IllegalArgumentException("调用PoiUtil.copyCell()方法时,targetCell、sourceCell、targetWork、sourceWork都不能为空,故抛出该异常!");
		}
		
		//处理单元格样式
		if(styleMap != null){
			if (targetWork == sourceWork) {
				targetCell.setCellStyle(sourceCell.getCellStyle());
			} else {
				String stHashCode = "" + sourceCell.getCellStyle().hashCode();
				HSSFCellStyle targetCellStyle = (HSSFCellStyle) styleMap
						.get(stHashCode);
				if (targetCellStyle == null) {
					targetCellStyle = targetWork.createCellStyle();
					targetCellStyle.cloneStyleFrom(sourceCell.getCellStyle());
					styleMap.put(stHashCode, targetCellStyle);
				}
				
				targetCell.setCellStyle(targetCellStyle);
			}
		}
		
		//处理单元格内容
		switch (sourceCell.getCellType()) {
		case HSSFCell.CELL_TYPE_STRING:
			targetCell.setCellValue(sourceCell.getRichStringCellValue());
			break;
		case HSSFCell.CELL_TYPE_NUMERIC:
			targetCell.setCellValue(sourceCell.getNumericCellValue());
			break;
		case HSSFCell.CELL_TYPE_BLANK:
			targetCell.setCellType(HSSFCell.CELL_TYPE_BLANK);
			break;
		case HSSFCell.CELL_TYPE_BOOLEAN:
			targetCell.setCellValue(sourceCell.getBooleanCellValue());
			break;
		case HSSFCell.CELL_TYPE_ERROR:
			targetCell.setCellErrorValue(sourceCell.getErrorCellValue());
			break;
		case HSSFCell.CELL_TYPE_FORMULA:
			targetCell.setCellFormula(sourceCell.getCellFormula());
			break;
		default:
			break;
		}
	}
	
	/**
	 * 功能:拷贝comment
	 * @param targetCell
	 * @param sourceCell
	 * @param targetPatriarch
	 */
	public static void copyComment(HSSFCell targetCell,HSSFCell sourceCell,HSSFPatriarch targetPatriarch)throws Exception{
		if(targetCell == null || sourceCell == null || targetPatriarch == null){
			throw new IllegalArgumentException("调用PoiUtil.copyCommentr()方法时,targetCell、sourceCell、targetPatriarch都不能为空,故抛出该异常!");
		}
		
		//处理单元格注释
		HSSFComment comment = sourceCell.getCellComment();
		if(comment != null){
			HSSFComment newComment = targetPatriarch.createComment(new HSSFClientAnchor());
			newComment.setAuthor(comment.getAuthor());
			newComment.setColumn(comment.getColumn());
			newComment.setFillColor(comment.getFillColor());
			newComment.setHorizontalAlignment(comment.getHorizontalAlignment());
			newComment.setLineStyle(comment.getLineStyle());
			newComment.setLineStyleColor(comment.getLineStyleColor());
			newComment.setLineWidth(comment.getLineWidth());
			newComment.setMarginBottom(comment.getMarginBottom());
			newComment.setMarginLeft(comment.getMarginLeft());
			newComment.setMarginTop(comment.getMarginTop());
			newComment.setMarginRight(comment.getMarginRight());
			newComment.setNoFill(comment.isNoFill());
			newComment.setRow(comment.getRow());
			newComment.setShapeType(comment.getShapeType());
			newComment.setString(comment.getString());
			newComment.setVerticalAlignment(comment.getVerticalAlignment());
			newComment.setVisible(comment.isVisible());
			targetCell.setCellComment(newComment);
		}
	}
	
	/**
	 * 功能:复制原有sheet的合并单元格到新创建的sheet
	 * 
	 * @param sheetCreat
	 * @param sourceSheet
	 */
	public static void mergerRegion(HSSFSheet targetSheet, HSSFSheet sourceSheet)throws Exception {
		if(targetSheet == null || sourceSheet == null){
			throw new IllegalArgumentException("调用PoiUtil.mergerRegion()方法时,targetSheet或者sourceSheet不能为空,故抛出该异常!");
		}
		
		for (int i = 0; i < sourceSheet.getNumMergedRegions(); i++) {
			CellRangeAddress oldRange = sourceSheet.getMergedRegion(i);
			CellRangeAddress newRange = new CellRangeAddress(
					oldRange.getFirstRow(), oldRange.getLastRow(),
					oldRange.getFirstColumn(), oldRange.getLastColumn());
			targetSheet.addMergedRegion(newRange);
		}
	}

	/**
	 * 功能:重新定义HSSFColor.YELLOW的色值
	 * 
	 * @param workbook
	 * @return
	 */
	public static HSSFColor setMForeColor(HSSFWorkbook workbook) {
		HSSFPalette palette = workbook.getCustomPalette();
		HSSFColor hssfColor = null;
		// byte[] rgb = { (byte) 221, (byte) 241, (byte) 255 };
		// try {
			// hssfColor = palette.findColor(rgb[0], rgb[1], rgb[2]);
			// if (hssfColor == null) {
				// palette.setColorAtIndex(HSSFColor.YELLOW.index, rgb[0], rgb[1],
						// rgb[2]);
				// hssfColor = palette.getColor(HSSFColor.YELLOW.index);
			// }
		// } catch (Exception e) {
			// e.printStackTrace();
		// }
		// return hssfColor;
	// }
	/**
	 * 功能:重新定义HSSFColor.PINK的色值
	 * 
	 * @param workbook
	 * @return
	 */
	public static HSSFColor setMBorderColor(HSSFWorkbook workbook) {
		HSSFPalette palette = workbook.getCustomPalette();
		HSSFColor hssfColor = null;
		byte[] rgb = { (byte) 0, (byte) 128, (byte) 192 };
		try {
			hssfColor = palette.findColor(rgb[0], rgb[1], rgb[2]);
			if (hssfColor == null) {
				palette.setColorAtIndex(HSSFColor.PINK.index, rgb[0], rgb[1],
						rgb[2]);
				hssfColor = palette.getColor(HSSFColor.PINK.index);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return hssfColor;
	}
}

关于工具类的使用,可以简单的调用copySheet方法完成sheet的复制。

注意:整理该工具类用到的poi版本是 3.2-FINAL-20081019,jdk的版本是1.4

转载于:https://my.oschina.net/psuyun/blog/157990

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您使用的是我之前回答中提到的 `POIUtil.getExcelDataToArray` 方法,那么您可以在该方法中对数值类型的单元格数据进行特殊处理,将其转换成字符串类型并保存到数组中。 以下是一个示例代码: ```java public static Object[][] getExcelDataToArray(String filePath, String sheetName) throws Exception { Object[][] excelData = null; Workbook workbook = WorkbookFactory.create(new File(filePath)); Sheet sheet = workbook.getSheet(sheetName); int rowCount = sheet.getLastRowNum(); int columnCount = sheet.getRow(0).getLastCellNum(); excelData = new Object[rowCount][columnCount]; for (int i = 0; i < rowCount; i++) { Row row = sheet.getRow(i + 1); for (int j = 0; j < columnCount; j++) { Cell cell = row.getCell(j); if (cell != null) { if (cell.getCellType() == CellType.NUMERIC) { if (DateUtil.isCellDateFormatted(cell)) { excelData[i][j] = cell.getDateCellValue(); } else { double value = cell.getNumericCellValue(); excelData[i][j] = String.valueOf(value); } } else if (cell.getCellType() == CellType.STRING) { excelData[i][j] = cell.getStringCellValue(); } else if (cell.getCellType() == CellType.BOOLEAN) { excelData[i][j] = cell.getBooleanCellValue(); } else { excelData[i][j] = null; } } } } return excelData; } ``` 在上面的代码中,如果单元格的数据类型是数值类型,则将其转换成字符串类型并保存到数组中;如果单元格的数据类型是字符串类型,则直接将其保存到数组中。希望这些信息对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值