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

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.看一下测试结果:

备注:这是我写于两年前的测试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;

/**
 *
 * Title: ExcelReader<br>
 * Description: 可以读取xls,xlsx等文件<br>
 * Copyright @ 2012~2016 xiaour.github.com<span style="font-size: 1em;"> .All rights reserved.<br></span>
 * @author 小鱼儿
 * @createDate 2016年8月23日
 * @version v1.0
 */
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;
 }

 /**
  * 读取Excel数据内容
  * @param InputStream
  * @param sheetNo sheet 页号
  * @return Map 包含单元格数据内容的Map对象
  */
 public List<Map<String,Object>> readExcel() {
  logger.info("开始解析xls...");
  sheetNo--;//从1开始及从0开始
  InputStream is = null;
  try {
   is = new FileInputStream(fileFullPath);
  } catch (FileNotFoundException e1) {
   logger.error(e1);
  }
  Map<String,Object> dataMap = null;
  List<Map<String,Object>> 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;
 }

 /**
  * 根据HSSFCell类型设置数据
  * @param cell
  * @return
  */
 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<Map<String, Object>> dataList;
   // 对读取Excel表格标题测试
   ExcelReader excelReader = new ExcelReader("D:\\okcoin-2016-08-3XZS.xls",1);
   dataList = excelReader.readExcel();
   for(Map<String,Object> theMap:dataList){
    System.out.println(theMap);
   }
 }
}

这个类导入相应的jar之后就可以用了哦。

以上这篇Java通过反射将 Excel 解析成对象集合实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • JAVA反射机制实例教程

    本文以实例形式详细讲述了Java的反射机制,是Java程序设计中重要的技巧.分享给大家供大家参考.具体分析如下: 首先,Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性.例如,使用它能获得 Java 类中各成员的名称并显示出来. Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性.例如,Pascal.C 或者 C++ 中就没有办法在程序中获得函数

  • Java使用反射调用方法示例

    本文实例讲述了Java使用反射调用方法.分享给大家供大家参考,具体如下: 一 代码 import java.util.*; import java.io.*; import java.lang.reflect.*; public class ExtendedObjectPoolFactory { // 定义一个对象池,前面是对象名,后面是实际对象 private Map<String, Object> objectPool = new HashMap<>(); private Pr

  • Java 反射机制实例详解

    Java 反射机制实例详解 一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,Java和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反射.通过反射,Java可以于运行时加载.探知和使用编译期间完全求和的类.生成其对象实体,调用其方法或者对属性设值.所以Java算是一个半动态的语言吧. 反射的概念: 在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对

  • java poi读取excel操作示例(2个代码)

    项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两个工具.这里我们介绍使用POI实现读取excel文档. 复制代码 代码如下: /* * 使用POI读取EXCEL文件 */import java.io.File;import java.io.FileInputStream;import java.util.ArrayList; import org.apache.poi.hssf.usermodel.HSSFCell;impor

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

    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;

  • 将ResultSet中得到的一行或多行结果集封装成对象的实例

    首先说一下这个使用场景,我们在使用jdbc连接数据库的时候,执行查询语句时候会得到一个结果集,如果想要再获取这个结果集中的值,就需要我们将他转换成一个对象,然后通过对象的get和set方法来获取到数据库中的值. public class BaseDao <E> { private Class<?> cls; public BaseDao() { //得到父类的泛型 Type sType=getClass().getGenericSuperclass(); //得到实际的类型参数数组

  • java 通过反射遍历所有字段修改值的实例代码

    先给大家介绍下java遍历所有字段修改值的代码,具体内容详情如下所示: java 通过反射遍历所有字段修改值,避免重复set.get 比如一张表里的字段十几个,而这个表里的图片存储字段有八九个,在返回这个实体类的时候,要对图片进行加密或者其他操作,那就要在实体类查询结果出来后,一个个的get修复,再set赋值,代码量很多,另外如果有多个接口用到,就会产生重复代码: 通过java 的反射,遍历所有字段,进行一个判断,取出来的值是带有图片链接的,进行操作,省去了很多代码,下面贴代码 import o

  • Android 解析JSON对象及实例说明

    JSON是一种轻量级的对象,数据体积小,方便传输,易于解析! 首先新建一个类工具类JsonUtil,用于获取请求返回的数据 复制代码 代码如下: public class JsonUtil { private static final String TAG = "JSONUTIL"; public static JSONObject getJSON(String url) throws Exception {  return new JSONObject(getRequest(url)

  • Java反射通过Getter方法获取对象VO的属性值过程解析

    这篇文章主要介绍了Java反射通过Getter方法获取对象VO的属性值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个Excel导出的工具类,导出的批量数据是以List类型传入的,List里的对象自然每次都不同,这取决于需要导出什么信息.

  • Java利用反射自动封装成实体对象的方法

    本文实例讲述了Java利用反射自动封装成实体对象的方法.分享给大家供大家参考.具体分析如下: 利用此方法的时候需要传递的参数的名称,必须以行号结尾,去掉行号就是属性名称,比如页面传递name+rowNo,那么实体对象的属性名应该为name.代码如下 复制代码 代码如下: //获取页面数据,自动封装成bean对象 public List getObjectList(Class clazz,String[] rowNos) throws Exception{         List objList

  • 基于Java将Excel科学计数法解析成数字

    需要注意的是一般的科学表达式是 1.8E12 1.8E-12 而在Excel中的科学表达式是 1.8E+12 1.8E-12 我写的科学计数法的正则表达式是 (-?\d+\.?\d*)[Ee]{1}[\+-]?[0-9]* 导入EXCEL数据时将科学计数法解析成数字,Java代码: import java.text.DecimalFormat; import java.util.regex.Pattern; public class Test { static Pattern pattern =

  • 如何利用Spring把元素解析成BeanDefinition对象

    目录 前言 1.BeanDefinition 2.BeanDefinitionParserDelegate 2.1.parseBeanDefinitionElement 2.2.parseBeanDefinitionElement 2.3 parseBeanDefinitionAttributes 2.4 parseConstructorArgElement 3 总结 前言 spring中解析元素最重要的一个对象应该就属于 BeanDefinition了:这个Spring容器中最基本的内部数据结

  • 使用Java进行Json数据的解析(对象数组的相互嵌套)

    这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下! 假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相关工具美化后的结果 { "translation": [ "爱" ], "basic": { "us-phonetic": "lʌv", "phonetic": "lʌv"

  • Java通过反射机制动态设置对象属性值的方法

    /** * MethodName: getReflection<br> * Description:解析respXML 在通过反射设置对象属性值 * User: liqijing * Date:2015-7-19下午12:42:55 * @param clzzName * @param respXML * @return * @throws ClassNotFoundException * @throws DocumentException * @throws IllegalArgumentE

随机推荐