使用poi解析excel表格数据

使用poi对excel数据进行解析

很多crm系统都需要将各种格式excel表格中的数据进行解析,并导入到数据库中。接下在就将针对java中使用poi对excel表格中的数据进行解析的过程进行讲解。

POI介绍

 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。

POI结构简介

包名称说明

HSSF提供读写Microsoft Excel XLS格式档案的功能。

XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。

HWPF提供读写Microsoft Word DOC格式档案的功能。

HSLF提供读写Microsoft PowerPoint格式档案的功能。

HDGF提供读Microsoft Visio格式档案的功能。

HPBF提供读Microsoft Publisher格式档案的功能。

HSMF提供读Microsoft Outlook格式档案的功能。

POI常用类说明

类名 说明

HSSFWorkbook Excel的文档对象
HSSFSheet Excel的表单
HSSFRow Excel的行
HSSFCell Excel的格子单元
HSSFFont Excel字体
HSSFDataFormat 格子单元的日期格式
HSSFHeader Excel文档Sheet的页眉
HSSFFooter Excel文档Sheet的页脚
HSSFCellStyle 格子单元样式
HSSFDateUtil 日期

HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表

简单介绍一下POI的相关信息,之后直接上案例,本案例是针对一些excel表格的客户信息进行解析。很多时候,crm系统的使用者的客户信息是通过一些渠道获取的,而这些信息有几百条甚至几千条。那么,这时手工录入数据是非常耗时且不划算的。所以这时就需要一个excel解析工具来帮助他们将excel数据进行上传,然后使用工具解析之后将数据直接保存到数据库中。接下来直接上代码:

/**
使用pio解析excel表格数据
*/
public class PaseExcel{
/**
 * 开始解析数据
 * @param inputStream  excel文件数据输入流
 * @param fileName 		上传文件名
 * @return 解析好的数据的list集合
 * @throws UnsupportedEncodingException 
 */
public static List parseData(InputStream inputStream,String fileName) throws UnsupportedEncodingException {
	ArrayList list = new ArrayList<>();
	// 获得Workbook工作薄对象
	Workbook workbook = getWorkBook(inputStream, fileName);

	if (workbook != null) {
		/*
		 * 获得当前sheet工作表
		 */ Sheet sheet = workbook.getSheetAt(0);
		if (sheet == null) {
			return list;
		}
		// 获得当前sheet的开始行
		int firstRowNum = sheet.getFirstRowNum();
		// 获得表头数据
		Row firstRow = sheet.getRow(firstRowNum);

		Map keyMap = new HashMap<>();

		// 获得表头的列
		int firstCellNum = firstRow.getFirstCellNum();
		int lastCellNum = firstRow.getLastCellNum();
		for (int index = firstCellNum; index <= lastCellNum; index++) {
			Cell cell = firstRow.getCell(index);
			String value = getCellValue(cell).trim().replace(" ", "");
			keyMap.put(value, index);
		}
		
		if(!keyMap.containsKey("姓名") ||
				!keyMap.containsKey("电话") ||
				!keyMap.containsKey("学历") ||
				!keyMap.containsKey("性别") ||
				!keyMap.containsKey("专业") ||
				!keyMap.containsKey("邮箱") ||
				!keyMap.containsKey("毕业院校")				
		) {
			throw new CustomerInfoImportException("导入失败,原有可能是表格中缺少以下列名:姓名,电话,学历,性别,专业,邮箱,毕业院校");
		}
		
		// 获得当前sheet的结束行
		int lastRowNum = sheet.getLastRowNum();
		
		// 循环除了第一行的所有行
		for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++) {
			// 获得当前行
			Row row = sheet.getRow(rowNum);
			CustomerInfo info = parse(row, keyMap);
			//如果解析之后得到的是无效数据则continue
			if (info == null || info.getUsername() == null || info.getUsername().trim().equals("")) {
				continue;
			}
			list.add(info);
		}
	}
	return list;
}

/**
 * 解析代理下载的简历
 * 
 * @param row
 * @throws UnsupportedEncodingException
 */
public static CustomerInfo parse(Row row, Map keyMap)throws UnsupportedEncodingException {
	if (row == null) {
		return null;
	}
	// InfoName 简历名称
	CustomerInfo info = new CustomerInfo();

	String userName = getCellValue(row.getCell(keyMap.get("姓名")));// 客户姓名
	info.setUsername(userName);
	info.setInfoName(userName + ".html");
	info.setUsermobile(getCellValue(row.getCell(keyMap.get("电话"))));// 客户电话
	info.setUsereducation(getCellValue(row.getCell(keyMap.get("学历"))));// 客户学历
	info.setUsersex(getCellValue(row.getCell(keyMap.get("性别"))));// 客户性别
	// String UserProfessional
	info.setUserprofessional(getCellValue(row.getCell(keyMap.get("专业"))));// 专业
	info.setUseremail(getCellValue(row.getCell(keyMap.get("邮箱"))));// 客户邮箱
	info.setUseraddress(location);// 客户地址
	info.setUserschool(getCellValue(row.getCell(keyMap.get("毕业院校"))));// 客户毕业院校
	info.setCreatetime(new Date());
	return info;

}

/**
*获得工作簿这里默认一个excel文件只有一个工作簿
*/
public static Workbook getWorkBook(InputStream inputStream, String fileName) {

	// 创建Workbook工作薄对象,表示整个excel
	Workbook workbook = null;
	try {

		// 根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
		if (fileName.endsWith("xls")) {
			// 2003
			workbook = new HSSFWorkbook(inputStream);
		} else if (fileName.endsWith("xlsx")) {
			// 2007 及2007以上
			workbook = new XSSFWorkbook(inputStream);
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
	return workbook;
}

/*
 * 获得单元格的数据
 */
public static String getCellValue(Cell cell) {
	String cellValue = "";
	if (cell == null) {
		return cellValue;
	}
	// 判断数据的类型
	switch (cell.getCellType()) {
	case Cell.CELL_TYPE_NUMERIC: // 数字
		cellValue = stringDateProcess(cell);
		break;
	case Cell.CELL_TYPE_STRING: // 字符串
		cellValue = String.valueOf(cell.getStringCellValue());
		break;
	case Cell.CELL_TYPE_BOOLEAN: // Boolean
		cellValue = String.valueOf(cell.getBooleanCellValue());
		break;
	case Cell.CELL_TYPE_FORMULA: // 公式
		cellValue = String.valueOf(cell.getCellFormula());
		break;
	case Cell.CELL_TYPE_BLANK: // 空值
		cellValue = "";
		break;
	case Cell.CELL_TYPE_ERROR: // 故障
		cellValue = "非法字符";
		break;
	default:
		cellValue = "未知类型";
		break;
	}
	return cellValue;
}

/**
 * 时间格式处理
 * 
 * @return
 * @author
 */
public static String stringDateProcess(Cell cell) {
	String result = new String();
	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 hh:mm:ss");
		}
		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 hh:mm:ss");
		double value = cell.getNumericCellValue();
		Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
		result = sdf.format(date);
	} else {
		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);
	}

	return result;
}

}

以上就是本章博客的全部内容。大家试试吧。

你可能感兴趣的:(java)