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对象。相关文章推荐
- jsp页面导出用jxl方式导出数据到excel表格并下载保存(第二种直接用java类实现)
- Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据
- Java将数据导出到excel表格中
- 用java代码实现从excel表格读取数据然后写入生成国际化配置文件properties
- Java数据导出为Excel表格
- java 采用BufferReader方式输入数据
- java 采用BufferReader方式输入数据
- java文件中数据导出生成Excel表格
- Java反射+注解实现自动持久化小例子(代码未优化)
- 在jsp页面中嵌入java代码并用request方式接受post数据
- Java代码中调用shell脚本和python脚本并获得输出结果(分为小数据量和大数据量)
- java导出大数据excel表格,导出数据
- java反射,获得Class是否为基本数据类型,是否其他类的父类。获得泛型。
- java代码导出数据到Excel、js导出数据到Excel(三)
- 利用java导出Excel数据的代码(PIO.JAR)
- java写的excel表格数据导出代码
- 把数据导出到Excel表格中的方式
- java减少数据访问层代码—反射2—数据访问层Wrapper—增加数据源码
- 利用Java反射、泛型和apache/poi编写可通用的导出Excel代码
- java减少数据访问层代码—反射2—数据访问层Wrapper—更新数据源码