导入excel数据,转换为java实体类

公司开发涉及到导入excel数据,自己封装了一个简单的方法,分享一下。

现在实体类只能支持基本的几种数据类型,date类型按照yyyy-MM-dd格式化了,需要不同的可以自行修改。

方法是以poi实现的

实体的创建要和excel的表头顺序对应

如:excel表头:序号,日期,姓名...

       实体类:序号,日期,姓名...

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class ImportExcel {

    /**
     *
     * @param workbook
     * @param clazz
     * @param x x表示从下标x行开始
     * @param y y表示从下标y列开始
     * @param <T>
     * @return
     * @throws Exception
     */
    public static <T>List<T> importData(XSSFWorkbook workbook,Class<T> clazz,int x, int y) throws Exception {
        Field[] fields = clazz.getDeclaredFields();
        List<T> list = new ArrayList();
        XSSFSheet sheetAt02 = workbook.getSheetAt(0);
        for ( int i=x; i <= sheetAt02.getLastRowNum() ; i++) {
            XSSFRow row = sheetAt02.getRow(i);
            short lastCellNum = row.getLastCellNum();
            String[] args = new String[lastCellNum];
            for ( int j = y; j < lastCellNum; j++) {

                args[j] =  getCellXlsx(row.getCell(j));
            }
            T o = setParam(clazz, args);
            list.add(o);
        }
        return list;
    }

    private static <T> T setParam(Class<T> clazz, String[] args)
        throws Exception {
        if (clazz == null || args == null) {
            throw new IllegalArgumentException();
        }
        T t = clazz.newInstance();
        Field[] fields = clazz.getDeclaredFields();
        if (fields == null || fields.length > args.length) {
            throw new IndexOutOfBoundsException();
        }
        for (int i = 0; i < fields.length; i++) {
            fields[i].setAccessible(true);
            Class<?> type = fields[i].getType();
            String name = type.getName();
            name = name.substring(name.lastIndexOf(".")+1,name.length());
            if (args[i] == null || "".equals(args[i])){
                fields[i].set(t, null);
                continue;
            }
            switch (name){
                case "Integer" : fields[i].set(t, Integer.valueOf(args[i]));
                    break;
                case "String" : fields[i].set(t, String.valueOf(args[i]));
                    break;
                case "Double" : fields[i].set(t, Double.valueOf(args[i]));
                    break;
                case "Float" : fields[i].set(t, Float.valueOf(args[i]));
                    break;
                case "Boolean" : fields[i].set(t,Boolean.valueOf(args[i]));
                    break;
                case "Short" : fields[i].set(t, Short.valueOf(args[i]));
                    break;
                case "Long" : fields[i].set(t, Long.valueOf(args[i]));
                    break;
                case "BigDecimal" : fields[i].set(t, new BigDecimal(args[i]));
                    break;
                case "Date" : fields[i].set(t,
                        new SimpleDateFormat("yyyy-MM-dd").parse(args[i]));
                    break;
            }

        }
        return t;
    }



    //获取单元格各类型值,返回字符串类型
    private static String getCellXlsx(XSSFCell cell) {
        //判断是否为null或空串
        if (cell==null || cell.toString().trim().equals("")) {
            return null;
        }
        String cellValue = "";
        int cellType=cell.getCellType();
        if(cellType==XSSFCell.CELL_TYPE_FORMULA){ //表达式类型
            try {
                return String.valueOf((int)cell.getNumericCellValue()).equals("")?null:String.valueOf((int)cell.getNumericCellValue());
            }catch (Exception e){
                return String.valueOf(cell.getBooleanCellValue()).equals("")?null:String.valueOf(cell.getBooleanCellValue());
            }
        }

        switch (cellType) {
            case XSSFCell.CELL_TYPE_STRING: //字符串类型
                cellValue= cell.getStringCellValue().trim();
                cellValue= StringUtils.isEmpty(cellValue) ? "" : cellValue;
                break;
            case XSSFCell.CELL_TYPE_BOOLEAN:  //布尔类型
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            case XSSFCell.CELL_TYPE_NUMERIC: //数值类型
                if (HSSFDateUtil.isCellDateFormatted(cell)) {  //判断日期类型
                    cellValue = new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue());
                } else {  //否
                    cellValue = new DecimalFormat("#.######").format(cell.getNumericCellValue());
                }
                break;
            default: //其它类型,取空串吧
                cellValue = "";
                break;
        }
        return cellValue;
    }

}

以下是pom依赖,主要也是以poi为主

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>

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


        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.17</version>
        </dependency>

限制比较多,对于导入的excel不算复杂的业务比较实用

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值