Java工具类(解析excl表格)

使用场景:导入excl表格

package com.devframe.common.util;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

/**

  • Excel 导入数据相关工具类的使用
  • @author chenhang

*/
public class ExcelReader1 {

/**
 * 获取单元格的值
 * 
 * @param cell
 * @return
 */
public static 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 "";
}

public static String getCellValue1(Cell cell) {
	String result = new String();
	switch (cell.getCellType()) {
	case HSSFCell.CELL_TYPE_NUMERIC:// 数字类型
		if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
			SimpleDateFormat sdf = null;
			if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
				sdf = new SimpleDateFormat("HH:mm");
			} else {// 日期
				sdf = new SimpleDateFormat("yyyy-MM-dd");
			}
			Date date = cell.getDateCellValue();
			result = sdf.format(date);
		} else if (cell.getCellStyle().getDataFormat() == 58) {
			// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			double value = cell.getNumericCellValue();
			Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
			result = sdf.format(date);
		} else {
			HSSFDataFormatter dataFormatter = new HSSFDataFormatter();
			result = dataFormatter.formatCellValue(cell);
			/*
			 * double value = cell.getNumericCellValue(); CellStyle style =
			 * cell.getCellStyle(); DecimalFormat format = new
			 * DecimalFormat(); String temp = style.getDataFormatString();
			 * // 单元格设置成常规 if (temp.equals("General")) {
			 * format.applyPattern("#"); } result = format.format(value);
			 */
		}
		break;
	case HSSFCell.CELL_TYPE_STRING:// String类型
		result = cell.getRichStringCellValue().toString();
		break;
	case HSSFCell.CELL_TYPE_BLANK:
		result = "";
	default:
		result = "";
		break;
	}
	return result;
}

/**
 * 合并单元格处理,获取合并行
 * 
 * @param sheet
 * @return List<CellRangeAddress>
 */
public List<CellRangeAddress> getCombineCell(Sheet sheet) {
	List<CellRangeAddress> list = new ArrayList<CellRangeAddress>();
	// 获得一个 sheet 中合并单元格的数量
	int sheetmergerCount = sheet.getNumMergedRegions();
	// 遍历所有的合并单元格
	for (int i = 0; i < sheetmergerCount; i++) {
		// 获得合并单元格保存进list中
		CellRangeAddress ca = sheet.getMergedRegion(i);
		list.add(ca);
	}
	return list;
}

private int getRowNum(List<CellRangeAddress> listCombineCell, Cell cell, Sheet sheet) {
	int xr = 0;
	int firstC = 0;
	int lastC = 0;
	int firstR = 0;
	int lastR = 0;
	for (CellRangeAddress ca : listCombineCell) {
		// 获得合并单元格的起始行, 结束行, 起始列, 结束列
		firstC = ca.getFirstColumn();
		lastC = ca.getLastColumn();
		firstR = ca.getFirstRow();
		lastR = ca.getLastRow();
		if (cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR) {
			if (cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC) {
				xr = lastR;
			}
		}
	}
	return xr;
}

/**
 * 判断单元格是否为合并单元格,是的话则将单元格的值返回
 * 
 * @param listCombineCell
 *            存放合并单元格的list
 * @param cell
 *            需要判断的单元格
 * @param sheet
 *            sheet
 * @return
 */
public String isCombineCell(List<CellRangeAddress> listCombineCell, Cell cell, Sheet sheet) throws Exception {
	int firstC = 0;
	int lastC = 0;
	int firstR = 0;
	int lastR = 0;
	String cellValue = null;
	for (CellRangeAddress ca : listCombineCell) {
		// 获得合并单元格的起始行, 结束行, 起始列, 结束列
		firstC = ca.getFirstColumn();
		lastC = ca.getLastColumn();
		firstR = ca.getFirstRow();
		lastR = ca.getLastRow();
		if (cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR) {
			if (cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC) {
				Row fRow = sheet.getRow(firstR);
				Cell fCell = fRow.getCell(firstC);
				cellValue = getCellValue(fCell);
				break;
			}
		} else {
			cellValue = "";
		}
	}
	return cellValue;
}

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

	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);
			}
		}
	}
	return null;
}

/**
 * 判断指定的单元格是否是合并单元格
 * 
 * @param sheet
 * @param row
 *            行下标
 * @param column
 *            列下标
 * @return
 */
public static 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;
}

}

猜你喜欢

转载自blog.csdn.net/qq_30643885/article/details/83928642