整理POI解析数据和生成下拉框模板的例子


import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.Name;
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.ss.util.CellRangeAddressList;

/**
 * POI生成联动下拉工具类
public class POIToExcelUtil {

	/* 隐藏的Sheet页 */
	public static String EXCEL_HIDE_SHEET_NAME = "excelhidesheetname";
	
	
	
	/**
	 * 创建隐藏Sheet中的行和名称集合
	 * @param workbook
	 * @param map
	 * @param rowIndex
	 * @param hideInfoSheet
	 */
	public static void createBatchRowAndNameList(Workbook workbook,Map<String,List<String>> map,int rowIndex,Sheet hideInfoSheet) {
		for (String name : map.keySet()) {
         	Row largeRegionWithSonRow = hideInfoSheet.createRow(rowIndex);
         	
         	List<String> temp = map.get(name);
         	POIToExcelUtil.creatRow(largeRegionWithSonRow,temp);
         	
         	POIToExcelUtil.creatExcelNameList(workbook,temp.get(0), rowIndex+1, temp.size() -1, true);
         	rowIndex++;
		}
	}

	/**
	 * 创建一行数据
	 * @param currentRow
	 * @param textList
	 */
	public static void creatRow(Row currentRow, List<String> textList) {
		if (textList != null && textList.size() > 0) {
			int i = 0;
			for (String cellValue : textList) {
				Cell userNameLableCell = currentRow.createCell(i++);
				userNameLableCell.setCellValue(cellValue);
			}
		}
	}

	/**
	 * 创建一个名称
	 * @param workbook  工作薄
	 * @param nameCode 名称
	 * @param order	
	 * @param size 长度
	 * @param cascadeFlag 是否联动
	 */
	public static void creatExcelNameList(Workbook workbook, String nameCode,
			int order, int size, boolean cascadeFlag) {
		//名称不能以数字开头,Excel规定的。(名称里不能包含冒号,逗号,连接线)
		if(isNumeric(nameCode)) {
			nameCode = "_" + nameCode;
		} 
		Name name = null;
		name = workbook.createName();
		name.setNameName(nameCode);
		name.setRefersToFormula(EXCEL_HIDE_SHEET_NAME + "!"
				+ creatExcelNameList(order, size, cascadeFlag));
	}
	/**
	 * 验证字符串是否以数字开头
	 * @param str
	 * @return
	 */
	public static boolean isNumeric(String str) {
		Pattern pattern = Pattern.compile("[0-9]*");
		Matcher isNum = pattern.matcher(str.charAt(0)+"");
		if (!isNum.matches()) {
			return false;
		}
			return true;
		}

	/**
	 * 名称数据行列计算表达式
	 * @param order
	 * @param size
	 * @param cascadeFlag
	 *            是否联动
	 * @return
	 */
	public static String creatExcelNameList(int order, int size,
			boolean cascadeFlag) {
		char start = 'A';
		if (cascadeFlag) {
			start = 'B';
			if (size <= 25) {
				char end = (char) (start + size - 1);
				return "$" + start + "$" + order + ":$" + end + "$" + order;
			} else {
				char endPrefix = 'A';
				char endSuffix = 'A';
				if ((size - 25) / 26 == 0 || size == 51) {// 26-51之间,包括边界(仅两次字母表计算)
					if ((size - 25) % 26 == 0) {// 边界值
						endSuffix = (char) ('A' + 25);
					} else {
						endSuffix = (char) ('A' + (size - 25) % 26 - 1);
					}
				} else {// 51以上
					if ((size - 25) % 26 == 0) {
						endSuffix = (char) ('A' + 25);
						endPrefix = (char) (endPrefix + (size - 25) / 26 - 1);
					} else {
						endSuffix = (char) ('A' + (size - 25) % 26 - 1);
						endPrefix = (char) (endPrefix + (size - 25) / 26);
					}
				}
				return "$" + start + "$" + order + ":$" + endPrefix + endSuffix
						+ "$" + order;
			}
		} else {
			if (size <= 26) {
				char end = (char) (start + size - 1);
				return "$" + start + "$" + order + ":$" + end + "$" + order;
			} else {
				char endPrefix = 'A';
				char endSuffix = 'A';
				if (size % 26 == 0) {
					endSuffix = (char) ('A' + 25);
					if (size > 52 && size / 26 > 0) {
						endPrefix = (char) (endPrefix + size / 26 - 2);
					}
				} else {
					endSuffix = (char) ('A' + size % 26 - 1);
					if (size > 52 && size / 26 > 0) {
						endPrefix = (char) (endPrefix + size / 26 - 1);
					}
				}
				return "$" + start + "$" + order + ":$" + endPrefix + endSuffix
						+ "$" + order;
			}
		}
	}

	/**
	 * 使用已定义的数据源方式设置一个数据验证
	 * @param formulaString
	 * @param naturalRowIndex
	 * @param naturalColumnIndex
	 * @return
	 */
	public static DataValidation getDataValidationByFormula(
			String formulaString, int firstRow, int lastRow,int firstCol,int lastCol) {
		// 加载下拉列表内容
		DVConstraint constraint = DVConstraint
				.createFormulaListConstraint(formulaString);
		// 设置数据有效性加载在哪个单元格上。
		// 四个参数分别是:起始行、终止行、起始列、终止列
		CellRangeAddressList regions = new CellRangeAddressList(firstRow,
				lastRow, firstCol, lastCol);
		// 数据有效性对象
		DataValidation data_validation_list = new HSSFDataValidation(regions,
				constraint);
		// 设置输入信息提示信息
		data_validation_list.createPromptBox("下拉选择提示", "请使用下拉方式选择合适的值!");
		// 设置输入错误提示信息
		data_validation_list
				.createErrorBox("选择错误提示", "你输入的值未在备选列表中,请下拉选择合适的值!");
		return data_validation_list;
	}
	
	/**
	 * 使用已定义的数据源方式设置一个数据验证
	 * @param formulaString
	 * @param naturalRowIndex
	 * @param naturalColumnIndex
	 * @return
	 */
	public static DataValidation getDataValidationByFormula(
			String formulaString, int naturalRowIndex, int naturalColumnIndex) {
		// 加载下拉列表内容
		DVConstraint constraint = DVConstraint
				.createFormulaListConstraint(formulaString);
		// 设置数据有效性加载在哪个单元格上。
		// 四个参数分别是:起始行、终止行、起始列、终止列
		int firstRow = naturalRowIndex - 1;
		int lastRow = naturalRowIndex - 1;
		int firstCol = naturalColumnIndex - 1;
		int lastCol = naturalColumnIndex - 1;
		CellRangeAddressList regions = new CellRangeAddressList(firstRow,
				lastRow, firstCol, lastCol);
		// 数据有效性对象
		DataValidation data_validation_list = new HSSFDataValidation(regions,
				constraint);
//		// 设置输入信息提示信息
//		data_validation_list.createPromptBox("下拉选择提示", "请使用下拉方式选择合适的值!");
//		// 设置输入错误提示信息
//		data_validation_list
//				.createErrorBox("选择错误提示", "你输入的值未在备选列表中,请下拉选择合适的值!");
//		data_validation_list.setSuppressDropDownArrow(true);  
//		data_validation_list.setShowErrorBox(true);  
		return data_validation_list;
	}

	/**
	 * 日期有效期验证
	 * @param naturalRowIndex
	 * @param naturalColumnIndex
	 * @return
	 */
	public static DataValidation getDataValidationByDate(int naturalRowIndex,
			int naturalColumnIndex) {
		// 加载下拉列表内容
		DVConstraint constraint = DVConstraint.createDateConstraint(
				DVConstraint.OperatorType.BETWEEN, "1900-01-01", "5000-01-01",
				"yyyy-mm-dd");
		// 设置数据有效性加载在哪个单元格上。
		// 四个参数分别是:起始行、终止行、起始列、终止列
		int firstRow = naturalRowIndex - 1;
		int lastRow = naturalRowIndex - 1;
		int firstCol = naturalColumnIndex - 1;
		int lastCol = naturalColumnIndex - 1;
		CellRangeAddressList regions = new CellRangeAddressList(firstRow,
				lastRow, firstCol, lastCol);
		// 数据有效性对象
		DataValidation data_validation_list = new HSSFDataValidation(regions,
				constraint);
		// 设置输入信息提示信息
		data_validation_list.createPromptBox("日期格式提示",
				"请按照'yyyy-mm-dd'格式输入日期值!");
		// 设置输入错误提示信息
		data_validation_list.createErrorBox("日期格式错误提示",
				"你输入的日期格式不符合'yyyy-mm-dd'格式规范,请重新输入!");
		return data_validation_list;
	}

}






import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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 com.hikvision.cms.rmp.moudules.store.user.account.dto.AccountImport;


/**
 * 读取包含下拉框的Excel的工具类
 */
public class POIExcelReaderUtil {
	
	
	/**
     * 读取Excel数据内容
     * @param InputStream
     * @return Map 包含单元格数据内容的Map对象
     */
    public static Map<Integer, String> readExcelContent(InputStream is) {
        Map<Integer, String> content = new HashMap<Integer, String>();
        String str = "";
        HSSFWorkbook wb = null;
        try {
            wb = new HSSFWorkbook(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Sheet sheet = wb.getSheetAt(0);
        Cell cell = sheet.getRow(0).getCell(3);
        // 得到总行数
        int rowNum = sheet.getLastRowNum();
//        System.out.println("rowNum:" + rowNum);
       
        Row row = sheet.getRow(0);
        int colNum = row.getPhysicalNumberOfCells();
//        System.out.println("colNum:" + colNum);
        // 正文内容应该从第二行开始,第一行为表头的标题
        for (int i = 1; i <= rowNum; i++) {
            row = sheet.getRow(i);
            if(row == null) {
            	content.put(i, str);
            	continue;
            }
            int j = 0;
            while (j < colNum) {
                // 每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
                // 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
                // str += getStringCellValue(row.getCell((short) j)).trim() +
                // "-";
            	if(((row.getCell((short) j)) == null) || ("".equals(row.getCell((short) j)))){
            		str += "";
            		if(j == 0) {
            			break;
            		}
            	} else {
            		str += getCellFormatValue(row.getCell((short) j)).trim() + "-";
            	}
                j++;
            }
            content.put(i, str);
            str = "";
        }
        return content;
    }
    
    
    
    /**
     * 根据HSSFCell类型设置数据
     * @param cell
     * @return
     */
    private static String getCellFormatValue(Cell cell) {
        String cellvalue = "";
        if (cell != null) {
            // 判断当前Cell的Type
            switch (cell.getCellType()) {
            // 如果当前Cell的Type为NUMERIC
            case HSSFCell.CELL_TYPE_NUMERIC:
            case HSSFCell.CELL_TYPE_FORMULA: {
                // 判断当前的cell是否为Date
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    // 如果是Date类型则,转化为Data格式
                    
                    //方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00
                    //cellvalue = cell.getDateCellValue().toLocaleString();
                    
                    //方法2:这样子的data格式是不带带时分秒的:2011-10-12
                    Date date = cell.getDateCellValue();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    cellvalue = sdf.format(date);
                    
                }
                // 如果是纯数字
                else {
                    // 取得当前Cell的数值
                    cellvalue = String.valueOf(cell.getNumericCellValue());
                }
                break;
            }
            // 如果当前Cell的Type为STRIN
            case HSSFCell.CELL_TYPE_STRING:
                // 取得当前的Cell字符串
                cellvalue = cell.getRichStringCellValue().getString();
                break;
            // 默认的Cell值
            default:
                cellvalue = " ";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;

    }
    
    
    public static void main(String[] args) throws FileNotFoundException {
//    	  InputStream is2 = new FileInputStream("f:\\用户信息导入模板2016-12-21 17_34_01.xls");
//    	  List<AccountImport> list = AccountImport.transferToEntity(is2);
//    	  for(AccountImport ai : list) {
//    		  System.out.println(ai.getAccount());
//    	  }

	}


}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值