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;
public class ExcelReader {
private String filePath;
private String sheetName;
private Workbook workBook;
private Sheet sheet;
private List columnHeaderList;
private List> listData;
private List
6.看一下测试结果:
备注:这是我写于两年前的测试demo,如果生产上有类似需求更建议使用 EasyExcel
补充知识:简单好用-JAVA使用POI解析Excel
相信使用POI的目前已经非常多了,我这边提供一个非常简单便利又通用的POI解析工具类,代码最后有示例代码。可以按照本文直接使用。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
public class ExcelReader {
private POIFSFileSystem fs;
private HSSFWorkbook wb;
private HSSFSheet sheet;
private HSSFRow row;
private static Logger logger = LogManager.getLogger(ExcelReader.class);
private String fileFullPath;
private int sheetNo;
public ExcelReader(String fileFullPath, int sheetNo) {
super();
this.fileFullPath = fileFullPath;
this.sheetNo = sheetNo;
}
public List> readExcel() {
logger.info("开始解析xls...");
sheetNo--;//从1开始及从0开始
InputStream is = null;
try {
is = new FileInputStream(fileFullPath);
} catch (FileNotFoundException e1) {
logger.error(e1);
}
Map dataMap = null;
List> dataList= new ArrayList<>();
String value = "";
try {
fs = new POIFSFileSystem(is);
wb = new HSSFWorkbook(fs);
} catch (IOException e) {
logger.error(e);
}
sheet = wb.getSheetAt(sheetNo);
row = sheet.getRow(0);
// 标题总列数
int colNum = row.getPhysicalNumberOfCells();
String[] keyArray = new String[colNum];
for (int i = 0; i < colNum; i++) {
keyArray[i] = getCellFormatValue(row.getCell((short) i));
}
int rowNum = sheet.getLastRowNum();
// 正文内容应该从第二行开始,第一行为表头的标题
for (int i = 2; i <= rowNum; i++) {
dataMap= new HashMap<>();
row = sheet.getRow(i);
if(row!=null){
int j = 0;
while (j < colNum) {
//这里把列循环到Map
if(row.getCell((short) j)!=null){
value = getCellFormatValue(row.getCell((short) j)).trim();
dataMap.put(keyArray[j],value);
}
j++;
}
value = "";
dataList.add(dataMap);
}
}
logger.info("解析xls完成...");
try {
if(is!=null)
is.close();
} catch (IOException e) {
logger.error(e.toString());
}
return dataList;
}
private String getCellFormatValue(HSSFCell 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 date = cell.getDateCellValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cellvalue = sdf.format(date);
}
// 如果是纯数字
else {
// 取得当前Cell的数值
DecimalFormat df = new DecimalFormat("0");
String dfStr = df.format(cell.getNumericCellValue());
cellvalue = dfStr;
}
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) {
List> dataList;
// 对读取Excel表格标题测试
ExcelReader excelReader = new ExcelReader("D:\okcoin-2016-08-3XZS.xls",1);
dataList = excelReader.readExcel();
for(Map theMap:dataList){
System.out.println(theMap);
}
}
}
这个类导入相应的jar之后就可以用了哦。
以上这篇Java通过反射将 Excel 解析成对象集合实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持考高分网。



