java读取Excel文件并通过反射将读取的文件创建对象

读取Excel文件到map

 /**
     * 读取excel并存储到map中
     * @param fileName
     * @return
     * @throws IOException
     */
    public static HashMap<Integer, List<String>> readExcel(String fileName) throws IOException {
        HashMap<Integer, List<String>> map = new HashMap<>();
        FileInputStream fis = null;
        Workbook workbook = null;
        try{
            //加载文件
            fis = new FileInputStream(fileName);

            if(fileName.endsWith(".xlsx")){
                workbook = new XSSFWorkbook(fis);
            }else if(fileName.endsWith(".xls") || fileName.endsWith(".et")){
                workbook = new HSSFWorkbook(fis);
            }

            //读取第一个sheet
            Sheet sheet = workbook.getSheetAt(0);

            //获取第一行(通常为表头)
            Row row0 = sheet.getRow(0);
            //表头行单元格的数量
            int length = row0.getLastCellNum();
            //行迭代器
            Iterator<Row> rowIterator = sheet.rowIterator();

            Row row;

            //遍历每一行
            while(rowIterator.hasNext()){
                //每一行的内容存储在list中
                List<String> r = new ArrayList<String>();

                //跳过第一行
                row = rowIterator.next();
                if(row.getRowNum() == 0)continue;;

                //获取每行单元格中的值
                for (int i = 0; i < length; i++) {
                    //获取cell中的值
                    String cellValue = getCellValue(row.getCell(i,Row.MissingCellPolicy.CREATE_NULL_AS_BLANK));
                    r.add(cellValue);
                }

                //将每一行的数据保存到map
                map.put(row.getRowNum(),r);
            }
        }catch (Exception e){

        }finally {
            if(fis != null){
                fis.close();
            }
            if(workbook != null){
                workbook.close();
            }
        }

        return map;
    }

读取每个单元格的值

/**
     * 读取每个单元格的值
     * @param cell
     * @return
     */
    private static String getCellValue(Cell cell) {

        String cellValue = "";
        if (null != cell) {
            // 以下是判断数据的类型
            switch (cell.getCellType()) {
                case HSSFCell.CELL_TYPE_NUMERIC: // 数字
                    if (0 == cell.getCellType()) {// 判断单元格的类型是否则NUMERIC类型
                        if (HSSFDateUtil.isCellDateFormatted(cell)) {// 判断是否为日期类型
                            Date date = cell.getDateCellValue();
                            cellValue = getFormat().format(date);
                        } else {
                            // 有些数字过大,直接输出使用的是科学计数法: 2.67458622E8 要进行处理
                            DecimalFormat df = new DecimalFormat("####.####");
                            cellValue = df.format(cell.getNumericCellValue());
                        }
                    }
                    break;
                case HSSFCell.CELL_TYPE_NUMERIC: // 字符串
                    cellValue = cell.getStringCellValue();
                    break;
                case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
                    cellValue = cell.getBooleanCellValue() + "";
                    break;
                case HSSFCell.CELL_TYPE_FORMULA: // 公式
                    // 如果公式结果为字符串
                    cellValue = String.valueOf(Double.valueOf(cell.getNumericCellValue()));
                    break;
                case HSSFCell.CELL_TYPE_BLANK: // 空值
                    cellValue = "";
                    break;
                case HSSFCell.CELL_TYPE_ERROR: // 故障
                    cellValue = "非法字符";
                    break;
                default:
                    cellValue = "未知类型";
                    break;
            }
        }
        return cellValue;
    }

将读取的excel反射创建对象

 /**
     * 将读取的excel反射创建对象
     * @param map
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> List<T> reflectCrtObj(HashMap<Integer,List<T>> map,Class<T> clazz){
        ArrayList<T> res = new ArrayList<>();
        if (map.isEmpty())return res;
        //遍历map
        map.forEach((rowNum,rowData)->{
            try{
                //每一行创建一个对象
                T bean = clazz.newInstance();

                Field[] fields = clazz.getDeclaredFields();
                for (int i = 0; i < fields.length; i++) {
                    Field field = fields[i];
                    field.setAccessible(true);
                    field.set(bean,rowData.get(i));
                }

                res.add(bean);
            }catch (Exception e){
                e.printStackTrace();
            }
        });
        return res;
    }

完整代码

package poi;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 1、java读取excel
 *
 * 2、通过反射将excel读取的内容创建对象
 */
public class ExcelUtil {


    /**
     * 读取excel并存储到map中
     * @param fileName
     * @return
     * @throws IOException
     */
    public static HashMap<Integer, List<String>> readExcel(String fileName) throws IOException {
        HashMap<Integer, List<String>> map = new HashMap<>();
        FileInputStream fis = null;
        Workbook workbook = null;
        try{
            //加载文件
            fis = new FileInputStream(fileName);

            if(fileName.endsWith(".xlsx")){
                workbook = new XSSFWorkbook(fis);
            }else if(fileName.endsWith(".xls") || fileName.endsWith(".et")){
                workbook = new HSSFWorkbook(fis);
            }

            //读取第一个sheet
            Sheet sheet = workbook.getSheetAt(0);

            //获取第一行(通常为表头)
            Row row0 = sheet.getRow(0);
            //表头行单元格的数量
            int length = row0.getLastCellNum();
            //行迭代器
            Iterator<Row> rowIterator = sheet.rowIterator();

            Row row;

            //遍历每一行
            while(rowIterator.hasNext()){
                //每一行的内容存储在list中
                List<String> r = new ArrayList<String>();

                //跳过第一行
                row = rowIterator.next();
                if(row.getRowNum() == 0)continue;;

                //获取每行单元格中的值
                for (int i = 0; i < length; i++) {
                    //获取cell中的值
                    String cellValue = getCellValue(row.getCell(i,Row.MissingCellPolicy.CREATE_NULL_AS_BLANK));
                    r.add(cellValue);
                }

                //将每一行的数据保存到map
                map.put(row.getRowNum(),r);
            }
        }catch (Exception e){

        }finally {
            if(fis != null){
                fis.close();
            }
            if(workbook != null){
                workbook.close();
            }
        }

        return map;
    }


    /**
     * 读取每个单元格的值
     * @param cell
     * @return
     */
    private static String getCellValue(Cell cell) {

        String cellValue = "";
        if (null != cell) {
            // 以下是判断数据的类型
            switch (cell.getCellType()) {
                case HSSFCell.CELL_TYPE_NUMERIC: // 数字
                    if (0 == cell.getCellType()) {// 判断单元格的类型是否则NUMERIC类型
                        if (HSSFDateUtil.isCellDateFormatted(cell)) {// 判断是否为日期类型
                            Date date = cell.getDateCellValue();
                            cellValue = getFormat().format(date);
                        } else {
                            // 有些数字过大,直接输出使用的是科学计数法: 2.67458622E8 要进行处理
                            DecimalFormat df = new DecimalFormat("####.####");
                            cellValue = df.format(cell.getNumericCellValue());
                        }
                    }
                    break;
                case HSSFCell.CELL_TYPE_NUMERIC: // 字符串
                    cellValue = cell.getStringCellValue();
                    break;
                case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
                    cellValue = cell.getBooleanCellValue() + "";
                    break;
                case HSSFCell.CELL_TYPE_FORMULA: // 公式
                    // 如果公式结果为字符串
                    cellValue = String.valueOf(Double.valueOf(cell.getNumericCellValue()));
                    break;
                case HSSFCell.CELL_TYPE_BLANK: // 空值
                    cellValue = "";
                    break;
                case HSSFCell.CELL_TYPE_ERROR: // 故障
                    cellValue = "非法字符";
                    break;
                default:
                    cellValue = "未知类型";
                    break;
            }
        }
        return cellValue;
    }


    /**
     * 将读取的excel反射创建对象
     * @param map
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> List<T> reflectCrtObj(HashMap<Integer,List<T>> map,Class<T> clazz){
        ArrayList<T> res = new ArrayList<>();
        if (map.isEmpty())return res;
        //遍历map
        map.forEach((rowNum,rowData)->{
            try{
                //每一行创建一个对象
                T bean = clazz.newInstance();

                Field[] fields = clazz.getDeclaredFields();
                for (int i = 0; i < fields.length; i++) {
                    Field field = fields[i];
                    field.setAccessible(true);
                    field.set(bean,rowData.get(i));
                }

                res.add(bean);
            }catch (Exception e){
                e.printStackTrace();
            }
        });
        return res;
    }


    private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    private static SimpleDateFormat getFormat(){
        return format;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值