您的位置:首页 > 编程语言 > Java开发

Excel表格导出,java代码,采用反射加注解的方式获得excel表格中的数据

2017-11-16 11:43 846 查看

Excel表格导出,java代码,采用反射加注解的方式获得excel表格中的数据

maven所依赖:

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.11-beta1</version>
</dependency>


1.java注解

/**
* ClassName:Excel Function: Excel导出列头标记通用注解 *
*/
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelColumn {

String columnName();
}


2.excel数据对应的实体以及Excel表格

public class EmployeeParam implements Serializable {

/**
* 字段描述: [字段功能描述]
*/
private static final long   serialVersionUID    = 1L;

@ExcelColumn(columnName = "企业名称")
private String              qymc;

@ExcelColumn(columnName = "部门名称")
private String              bm;

@ExcelColumn(columnName = "职务")
private String              zw;

@ExcelColumn(columnName = "姓名")
private String              xm;

@ExcelColumn(columnName = "手机号码")
private String              sjhm;

@ExcelColumn(columnName = "电子邮箱")
private String              yx;

@ExcelColumn(columnName = "出生日期")
private Date                csrq;

@ExcelColumn(columnName = "性别")
private String              xb;

@ExcelColumn(columnName = "身份证号码")
private String              sfzhm;

@ExcelColumn(columnName = "民族")
private String              mz;

@ExcelColumn(columnName = "籍贯")
private String              jg;

@ExcelColumn(columnName = "户籍地址")
private String              hjdz;

@ExcelColumn(columnName = "家庭住址")
private String              jtzz;

@ExcelColumn(columnName = "婚育状况")
private String              hyzk;

@ExcelColumn(columnName = "学历")
private String              xl;

@ExcelColumn(columnName = "毕业院校")
private String              byxx;

@ExcelColumn(columnName = "所学专业")
private String              sxzz;

@ExcelColumn(columnName = "毕业时间")
private Date                bysj;

@ExcelColumn(columnName = "启用状态")
private String              zt;
//每个属性的get set方法自己提供
}


3.excel表格模板



4.java 代码重点内容

(1) 测试

package com.yang;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

/**
* 文件名称: com.yang.ExcelTest.java</br>
* 初始作者: bk_yzw</br>
* 创建日期: 2017年11月20日</br>
* 功能说明: 这里用一句话描述这个类的作用--此句话需删除 <br/>
* =================================================<br/>
* 修改记录:<br/>
* 修改作者 日期 修改内容<br/>
* ================================================<br/>
* Copyright (c) 2010-2011 .All rights reserved.<br/>
*/
public class ExcelTest {

public static void main(String[] args) {

String xlsPath = "D://Employee.xlsx";

// 根据文件路径创建文件输入流
InputStream in;
try {
in = new FileInputStream(xlsPath);
List<Object> resultList = new ExcelUtils().importExcelData(in,
EmployeeParam.class);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


(2)ExcelUtils 类

package com.yang;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
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.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;

public class ExcelUtils {

/** HSSFWorkbook对象 **/
private HSSFWorkbook    workbook    = null;

/**
* 方法描述: [获取excel数据接口,返回excel表格数据中的集合.]</br>
* 初始作者: bk_yzw<br/>
* 创建日期: 2017年11月16日-上午11:25:17<br/>
* 开始版本: 2.0.0<br/>
* =================================================<br/>
* 修改记录:<br/>
* 修改作者 日期 修改内容<br/>
* ================================================<br/>
*
* @param in
*            excel输入流
* @param clazz
*            excel 数据对应的实体被映射为 Class 对象的一个类
* @return
* @throws IOException
* @throws SecurityException
* @throws NoSuchFieldException
* @throws InstantiationException
* @throws IllegalAccessException
*             List<Object>
*/
public List<Object> importExcelData(InputStream in, Class<?> clazz) throws IOException, SecurityException,
NoSuchFieldException, InstantiationException, IllegalAccessException {

// 获取解析Excel文件POIFSFileSystem类
POIFSFileSystem fs = new POIFSFileSystem(in);

return importExcelData(fs, clazz);
}

/**
* 方法描述: [根据excel的输入流创建一个Workbook.]</br>
* 初始作者: bk_yzw<br/>
* 创建日期: 2017年11月16日-下午2:21:25<br/>
* 开始版本: 2.0.0<br/>
* =================================================<br/>
* 修改记录:<br/>
* 修改作者 日期 修改内容<br/>
* ================================================<br/>
*
* @param in
* @return
* @throws IOException
*             HSSFWorkbook
*/
private HSSFWorkbook getHSSFWorkbook(POIFSFileSystem in) throws IOException {

// 把一张xls的数据表读到wb里
return new HSSFWorkbook(in);
}

/**
* 方法描述: [获取表格中的数据.]</br>
* 初始作者: bk_yzw<br/>
* 创建日期: 2017年11月16日-上午11:31:24<br/>
* 开始版本: 2.0.0<br/>
* =================================================<br/>
* 修改记录:<br/>
* 修改作者 日期 修改内容<br/>
* ================================================<br/>
*
* @param in
*            获取解析Excel文件POIFSFileSystem类
* @param clazz
*            excel 数据对应的实体被映射为 Class 对象的一个类
* @return
* @throws IOException
* @throws SecurityException
* @throws NoSuchFieldException
* @throws InstantiationException
* @throws IllegalAccessException
*             List<Object>
*/
private List<Object> importExcelData(POIFSFileSystem in, Class<?> clazz) throws IOException, SecurityException,
NoSuchFieldException, InstantiationException, IllegalAccessException {

// 把一张xls的数据表读到wb里
workbook = getHSSFWorkbook(in);

// 标记变量,判断整条记录是否为空,并消除全部的空行记录
StringBuilder sb = new StringBuilder();

// 获取第一个sheet即sheet1
HSSFSheet sheet = workbook.getSheetAt(0);
// 获取第二行
HSSFRow headerCellRow = sheet.getRow(1);
// 获取第二行最大列
Integer cellHeaderNum = Integer.valueOf(headerCellRow.getLastCellNum());
// 定义列
HSSFCell dataCell = null;
// 定义行
HSSFRow dataRow = null;
// 定义返回数据
List<Object> rowList = new ArrayList<Object>();
// 定义excel字段和实体对应字段map
Map<String, String> columnMap = new HashMap<String, String>();
// 获取第一行
dataRow = sheet.getRow(1);
// 循环最大列,将每一列属性与所要产生实体的每个字段匹配,组成map
for (int m = 0; m < cellHeaderNum; m++) {
String columnNameE = "";
// 获取第一行每一列描述属性
switch (dataRow.getCell(m).getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
columnNameE = String.valueOf(dataRow.getCell(m).getNumericCellValue()).trim();
break;
case Cell.CELL_TYPE_STRING:
columnNameE =     String.valueOf(dataRow.getCell(m).getRichStringCellValue().toString()).trim();
break;
}

// === 循环遍历字节码注解 获取属性名称
// 创建 class的属性数组
Field[] fields = clazz.getDeclaredFields();
// 循环该class的属性
for (Field field : fields) {
// 判断该属性上的ExcelColumn注解的columnName值是否存在
if (field.isAnnotationPresent(ExcelColumn.class)) {
// 获取该属性上的ExcelColumn的columnName值
ExcelColumn excelColumn = field.getAnnotation(ExcelColumn.class);
// 回去该属性名称
String fieldName = field.getName();
// 判断第一行每一列的属性是否与该class上的注解名称匹配
if (excelColumn.columnName().trim().equals(columnNameE)) {
// 匹配成功则把该字段名称作为value和该列属性作为key放入map中
columnMap.put(columnNameE, fieldName);
}
}
}
}

// === 循环遍历数据
// 获取有多道行数据
Integer rowNum = sheet.getLastRowNum();
// 这里从第三行开始属于表格中的数据
for (int i = 2; i <= rowNum; i++) {
// 每次循环将标记标量清空
sb.dele
abd1
te(0, sb.length());
// 存放行标记
sb.append(String.valueOf(i));
// 获取当前行
dataRow = sheet.getRow(i);
if (dataRow != null) {
// 通过反射获取该实体
Object obj = clazz.newInstance();
// 循环每一行的列长度
for (int j = 0; j < cellHeaderNum; j++) {
// 获取当前列
dataCell = dataRow.getCell(j);
// =================================== 读取Excel文件中的数据
// 文本,数值或日期类型的条件判断 开始 =============================
if (dataCell != null) {
// 初始化每个属性值
Object value = "";
// 转换数据类型
switch (dataCell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(dataCell)) {
// === 如果是date类型则 ,获取该cell的date值

HSSFDateUtil.getJavaDate(dataCell.getNumericCellValue()).toString();
Date date = dataCell.getDateCellValue();

value = date;
} else { // === 纯数字
dataCell.setCellType(Cell.CELL_TYPE_STRING);
value = String.valueOf(dataCell.getRichStringCellValue().toString());
}
break;

case HSSFCell.CELL_TYPE_STRING:
value = dataCell.getRichStringCellValue().toString();
break;

case HSSFCell.CELL_TYPE_FORMULA:
// === 读公式计算值
value = String.valueOf(dataCell.getNumericCellValue());
// === 如果获取的数据值为非法值,则转换为获取字符串
if (value.equals("NaN")) {
value = dataCell.getRichStringCellValue().toString();
}
break;

case HSSFCell.CELL_TYPE_BOOLEAN:
value = dataCell.getBooleanCellValue();
break;

case HSSFCell.CELL_TYPE_BLANK:
// 这里根据需求自行判断,
// 当该列是空的时候,跳出这列当前循环,避免后面塞值,出现类型转换异常
continue;

case HSSFCell.CELL_TYPE_ERROR:
value = "";
break;

default:
value = dataCell.getRichStringCellValue().toString();
break;
}
// 当获得值的时候追加标记变量
sb.append(value);

// 或其该列所描述的属性
String columnNameE = String.valueOf(
sheet.getRow(1).getCell(j).getRichStringCellValue().toString()).trim();
// 通过map获得对应class中的字段
String fieldName = columnMap.get(columnNameE);
if (fieldName != "") {
// 根据该属性名称获取该类该属性类
Field f = obj.getClass().getDeclaredField(fieldName);
// 取消java的权限控制检查。
f.setAccessible(true);
// 对该对象该属性赋值
f.set(obj, value);
}

}
// =================================== 读取Excel文件中的数据
// 文本,数值或日期类型的条件判断 结束 =============================
}
// 判断这一行是否有数据
if (sb.toString().equals(String.valueOf(i))) {
// 不做操作
Collections.emptyList();
} else {
// 添加该条数据
rowList.add(obj);
}
}

}

return rowList;
}
}


注意:

目前,只做了2003版本的excel导入。如使用2007请使用XSSFWorkbook对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: