Java通过反射将 Excel 解析成对象集合

4 篇文章 0 订阅
2 篇文章 0 订阅



1.这是一个通过Java反射机制解析的工具类

2.使用时只需创建对应的对象,并在Excel的第一行填上对应的属性名

3.首先要添加相关的jar包:

poi-3.8.jar               
poi-ooxml-3.9.jar         
poi-ooxml-schemas-3.9.jar 
xmlbeans-2.6.0.jar        

4.看一下Excel的内容:



5.创建对应的实体类:

package com.office.user.dto;

public class UserDTO {

	private String idUser;

	private String userName;

	private String gender;

	private String birthDate;

	private String idType;

	private String idNo;

	private String mobile;

	public String getIdUser() {
		return idUser;
	}

	public void setIdUser(String idUser) {
		this.idUser = idUser;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getBirthDate() {
		return birthDate;
	}

	public void setBirthDate(String birthDate) {
		this.birthDate = birthDate;
	}

	public String getIdType() {
		return idType;
	}

	public void setIdType(String idType) {
		this.idType = idType;
	}

	public String getIdNo() {
		return idNo;
	}

	public void setIdNo(String idNo) {
		this.idNo = idNo;
	}

	public String getMobile() {
		return mobile;
	}

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}

	@Override
	public String toString() {
		return "UserDTO [idUser=" + idUser + ", userName=" + userName + ", gender=" + gender + ", birthDate="
				+ birthDate + ", idType=" + idType + ", idNo=" + idNo + ", mobile=" + mobile + "]";
	}

}



6.编写工具类:ExcelReader.java


package com.office.poi;


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.DateUtil;
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.usermodel.WorkbookFactory;


import com.office.user.dto.UserDTO;


/**
 * Excel 解析工具
 * 
 * @author Neo 2017-5-15
 * 
 *         所需jar: poi-3.8.jar poi-ooxml-3.9.jar poi-ooxml-schemas-3.9.jar
 *         xmlbeans-2.6.0.jar
 *
 */
public class ExcelReader {


	private String filePath;
	private String sheetName;
	private Workbook workBook;
	private Sheet sheet;
	private List<String> columnHeaderList;
	private List<List<String>> listData;
	private List<Map<String, String>> mapData;
	private boolean flag;


	public ExcelReader(String filePath, String sheetName) {
		this.filePath = filePath;
		this.sheetName = sheetName;
		this.flag = false;
		this.load();
	}


	private void load() {
		FileInputStream inStream = null;
		try {
			inStream = new FileInputStream(new File(filePath));
			workBook = WorkbookFactory.create(inStream);
			sheet = workBook.getSheet(sheetName);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (inStream != null) {
					inStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


	private String getCellValue(Cell cell) {
		String cellValue = "";
		DataFormatter formatter = new DataFormatter();
		if (cell != null) {
			switch (cell.getCellType()) {
			case Cell.CELL_TYPE_NUMERIC:
				if (DateUtil.isCellDateFormatted(cell)) {
					cellValue = formatter.formatCellValue(cell);
				} else {
					double value = cell.getNumericCellValue();
					int intValue = (int) value;
					cellValue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);
				}
				break;
			case Cell.CELL_TYPE_STRING:
				cellValue = cell.getStringCellValue();
				break;
			case Cell.CELL_TYPE_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 = cell.toString().trim();
				break;
			}
		}
		return cellValue.trim();
	}


	private void getSheetData() {
		listData = new ArrayList<List<String>>();
		mapData = new ArrayList<Map<String, String>>();
		columnHeaderList = new ArrayList<String>();
		int numOfRows = sheet.getLastRowNum() + 1;
		for (int i = 0; i < numOfRows; i++) {
			Row row = sheet.getRow(i);
			Map<String, String> map = new HashMap<String, String>();
			List<String> list = new ArrayList<String>();
			if (row != null) {
				for (int j = 0; j < row.getLastCellNum(); j++) {
					Cell cell = row.getCell(j);
					if (i == 0) {
						columnHeaderList.add(getCellValue(cell));
					} else {
						map.put(columnHeaderList.get(j), this.getCellValue(cell));
					}
					list.add(this.getCellValue(cell));
				}
			}
			if (i > 0) {
				mapData.add(map);
			}
			listData.add(list);
		}
		flag = true;
	}


	public String getCellData(int row, int col) {
		if (row <= 0 || col <= 0) {
			return null;
		}
		if (!flag) {
			this.getSheetData();
		}
		if (listData.size() >= row && listData.get(row - 1).size() >= col) {
			return listData.get(row - 1).get(col - 1);
		} else {
			return null;
		}
	}


	public String getCellData(int row, String headerName) {
		if (row <= 0) {
			return null;
		}
		if (!flag) {
			this.getSheetData();
		}
		if (mapData.size() >= row && mapData.get(row - 1).containsKey(headerName)) {
			return mapData.get(row - 1).get(headerName);
		} else {
			return null;
		}
	}


	/**
	 * 获取标题
	 * 
	 * @param eh
	 * @param maxX
	 * @return
	 */
	public List<String> getTitleList(ExcelReader eh, int maxX) {
		List<String> result = new ArrayList<String>();
		for (int i = 1; i <= maxX; i++) {
			result.add(eh.getCellData(1, i));
		}
		return result;
	}


	/**
	 * 获取单行对象
	 * 
	 * @param object
	 * @param eh
	 * @param maxX
	 * @param titles
	 * @return
	 */
	public Object getObject(String className, ExcelReader eh, int y, List<String> titles) throws Exception {
		Object bean = Class.forName(className).newInstance();
		int length = titles.size();
		for (int x = 0; x < length; x++) {
			try {
				Field field = bean.getClass().getDeclaredField(titles.get(x));
				field.setAccessible(true);
				field.set(bean, eh.getCellData(y, x+1));
			} catch (Exception e) {
				System.out.println("没有对应的方法:" + e);
			}
		}
		return bean;
	}


	/**
	 * 获取Excel数据列表
	 * 
	 * @param bean
	 * @param eh
	 * @param x
	 *            每行有多少列数据
	 * @param y
	 *            整个sheet有多少行数据
	 * @param titles
	 * @return
	 */
	public List<Object> getDataList(Class<?> clazz, ExcelReader eh, int x, int y, List<String> titles) {
		List<Object> result = new ArrayList<Object>();
		String className = clazz.getName();
		try {
			for (int i = 2; i <=y; i++) {
				Object object = eh.getObject(className, eh, i, titles);
				result.add(object);
			}
		} catch (Exception e) {
			System.out.println(e);
		}
		return result;
	}


	public static void main(String[] args) {
		try {
			ExcelReader eh = new ExcelReader("C:\\Users\\Neo\\Desktop\\POI.xlsx", "Sheet1");
			List<String> titles = eh.getTitleList(eh, 7);
			List<Object> userList = eh.getDataList(UserDTO.class, eh, 7, 4, titles);
			for (Object object : userList) {
				System.out.println(object);
			}
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}



6.看一下测试结果:



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值