All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.meteor.module.util.office.ExcelUtils Maven / Gradle / Ivy

The newest version!
package cn.meteor.module.util.office;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import cn.meteor.module.util.lang.StringExtUtils;

public class ExcelUtils {
	
	private final static String excel2003L =".xls";    //2003- 版本的excel  
    private final static String excel2007U =".xlsx";   //2007+ 版本的excel
    

    public  static Workbook getWorkbook(InputStream inputStream,String fileName) throws Exception{  
		Workbook workbook = null;  
        String fileType = fileName.substring(fileName.lastIndexOf("."));  
        if(excel2003L.equals(fileType)){  
            workbook = new HSSFWorkbook(inputStream);  //2003-  
        }else if(excel2007U.equals(fileType)){  
            workbook = new XSSFWorkbook(inputStream);  //2007+  
        }else{  
            throw new Exception("解析的文件格式有误!");  
        }  
        return workbook;  
    }
    
    public static List> getRowListFromWorkbook(Workbook workbook, Map headerMapper) throws Exception {
    	return getRowListFromWorkbook(workbook, headerMapper, null);
    }

	
	public static List> getRowListFromWorkbook(Workbook workbook, Map headerMapper, Integer fetchRowSize) throws Exception {
		List> rowList = new ArrayList>();
		if (null == workbook) {
			throw new Exception("创建Excel工作薄为空!");
		}
		// 遍历Excel中所有的sheet
		for (int sheetIndex = 0; sheetIndex < workbook.getNumberOfSheets(); sheetIndex++) {
			Sheet sheet = workbook.getSheetAt(sheetIndex);
			if (sheet == null) {
				continue;
			}

			int fetchRowMaxIndex = sheet.getLastRowNum();
			if(fetchRowSize!=null) {
				fetchRowMaxIndex = fetchRowSize-1;
			}
			// 遍历当前sheet中的所有行
			for (int rowNum = sheet.getFirstRowNum(); rowNum <=sheet.getLastRowNum() && rowNum<=fetchRowMaxIndex; rowNum++) {//下标从0开始
				Row row = sheet.getRow(rowNum);
				if (row == null) {// 如果是null行,则跳过
					continue;
				}
				
				if (sheetIndex == 0 && rowNum == row.getFirstCellNum()) {// 如果是第一个sheet的第一行,添加到map中
					// 遍历所有的列
					for (short colIndex = row.getFirstCellNum(); colIndex  oneRow = new ArrayList();
						for (int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++) {
							Cell cell = row.getCell(cellNum);
							oneRow.add(getCellValue(cell));
						}
						rowList.add(oneRow);
					}
					
				}

			}
		}
		workbook.close();
		return rowList;
	}
	
	public static  List readBean(Workbook workbook, Class tClass) throws Exception {
		return readBean(workbook, tClass, null);
	}

	/**
	 * @param workbook
	 * @param tClass
	 * @param fieldMap 为空时取excel表头作为字段名,非空时直接使用,数组组成为 key为列表头值,value为字段名,例如: 名称 name)
	 * @return
	 * @throws Exception
	 */
	public static  List readBean(Workbook workbook, Class tClass, Map fieldMap) throws Exception {
		List beans = new ArrayList();
		
		Map headerMapper = new HashMap();
		List> rowList = getRowListFromWorkbook(workbook, headerMapper);
		
		for (int rowIndex = 0; rowIndex < rowList.size(); rowIndex++) {//遍历所有行
			List oneRow = rowList.get(rowIndex);
			T_T bean = tClass.newInstance();
			for (short colIndex = 0; colIndex < oneRow.size(); colIndex++) {//遍历一行所有单元格
				String headCellValue = headerMapper.get(colIndex);
				
				String fieldName = headCellValue;//先字段名=表头名
				if(fieldMap!=null && fieldMap.get(headCellValue)!=null) {//如果map有,先经过map映射
					fieldName = fieldMap.get(headCellValue);//假设headCellValue为 名称,那么fieldMap的key为名称 value为name,最后获得是name
				}
				
//				String fieldName = DzdzFpxxYdkExcelRequest.translateFieldName(headCellValue);
				Method translateFieldNameMethod = tClass.getSuperclass().getDeclaredMethod("translateFieldName", String.class);
				fieldName = (String) translateFieldNameMethod.invoke(bean, fieldName);//调用该类的字段名称转换方法得到字段名称

				
				Object value = oneRow.get(colIndex);
				if(StringUtils.isNotEmpty(String.valueOf(value))) {//如果字段值非空,则设置对象属性值
					BeanUtils.setProperty(bean, fieldName, value);
				}
			}
			beans.add(rowIndex, bean);
		}
		return beans;
	}
	
	/**
	 * @param inputStream excel文件输入流
	 * @param fileName 文件名
	 * @param tClass 类
	 * @return 数据列表
	 * @throws Exception
	 */
	public static  List readBean(InputStream inputStream,String fileName, Class tClass) throws Exception {
		return readBean(inputStream, fileName, tClass, null);
	}
	
	/**
	 * @param inputStream excel文件输入流
	 * @param fileName 文件名
	 * @param tClass 类
	 * @param fieldMap 为空时取excel表头作为字段名,非空时直接使用,数组组成为 key为列表头值,value为字段名,例如: 名称 name)
	 * @return 数据列表
	 * @throws Exception
	 */
	public static  List readBean(InputStream inputStream,String fileName, Class tClass, Map fieldMap) throws Exception {
		Workbook workbook = getWorkbook(inputStream, fileName);
		List beans = ExcelUtils.readBean(workbook, tClass, fieldMap);
		return beans;
	}
	
	public static List> getExcelHeader(InputStream inputStream,String fileName, Map headerMapper) throws Exception {
		Workbook workbook = getWorkbook(inputStream, fileName);
//		Map headerMapper = new HashMap();
		List> rowList = getRowListFromWorkbook(workbook, headerMapper, 2);
		return rowList;
	}
	
	public static String getExcelClassFieldDefine(InputStream inputStream,String fileName) throws Exception {
		Map headerMapper = new HashMap();
		List> rowList = ExcelUtils.getExcelHeader(inputStream,fileName, headerMapper);
		List firstDataRow = rowList.get(0);
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < firstDataRow.size(); i++) {
			Short key = Short.valueOf("" + i);
			String excelOriginHeader = headerMapper.get(key);
			if(StringUtils.isNotBlank(excelOriginHeader)) {
				String fieldName = StringExtUtils.translateForSnakeCase(excelOriginHeader);
				Object filedValue = firstDataRow.get(i);
				String filedType = filedValue.getClass().getSimpleName();
				sb.append("private ").append(filedType).append(" ").append(fieldName).append(";\n");
			}
		}
//		StringBuilder sb = new StringBuilder();
//		for (Short key : headerMapper.keySet()) {
//			String excelOriginHeader = headerMapper.get(key);
//			if(StringUtils.isNotBlank(excelOriginHeader)) {
//				String fieldName = StringExtUtils.translateForSnakeCase(excelOriginHeader);
//				sb.append("private String ").append(fieldName).append(";\n");
//			}
//		}
		return sb.toString();
	}

	public static  String getCellStringValue(Cell cell){
		Object cellValue = getCellValue(cell);
		String cellStringValue= null;
		if(cellValue!=null) {
			cellStringValue = "" + cellValue;
		} else {
			cellStringValue = "";
		}
		return cellStringValue;
	}
	
    
    /** 
     * 描述:对表格中数值进行格式化 
     * @param cell 
     * @return 
     */  
	public static Object getCellValue(Cell cell) {
		Object value = null;
//		DecimalFormat df = new DecimalFormat("0"); // 格式化number String字符
//		SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd"); // 日期格式化
//		DecimalFormat df2 = new DecimalFormat("0.00"); // 格式化数字

		if(cell!=null) {
			switch (cell.getCellTypeEnum()) {
			case STRING:
				value = cell.getRichStringCellValue().getString();
				break;
			case NUMERIC:
	//			if ("General".equals(cell.getCellStyle().getDataFormatString())) {
	//				value = df.format(cell.getNumericCellValue());
	//			} else if ("m/d/yy".equals(cell.getCellStyle().getDataFormatString()) || "yyyy-mm-dd".equals(cell.getCellStyle().getDataFormatString())) {
	//				value = sdf.format(cell.getDateCellValue());
	//			} else {
	//				value = df2.format(cell.getNumericCellValue());
	//			}
				String dataFormatString = cell.getCellStyle().getDataFormatString();
	//			if("yyyy\\-mm\\-dd".equals(dataFormatString) || "yyyy\\-mm\\-dd\\ h:mm:ss".equals(dataFormatString) || "m/d/yy".equals(dataFormatString)) {
				if(dataFormatString.contains("yy") || dataFormatString.contains("m") || dataFormatString.contains("d") || dataFormatString.contains("h") || dataFormatString.contains("ss")) {
					value = cell.getDateCellValue();
				} else {
					value = cell.getNumericCellValue();
				}
				break;
			case BOOLEAN:
				value = cell.getBooleanCellValue();
				break;
			case BLANK:
				value = "";
				break;
			default:
				break;
			}
		}
		return value;
	}
}