欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java实现excel导入数据的工具类

程序员文章站 2024-02-26 20:10:34
导入excel数据的工具类,调用也就几行代码,很简单的。 复制代码 代码如下:import jxl.cell;import jxl.sheet;import jxl.wo...

导入excel数据的工具类,调用也就几行代码,很简单的。

复制代码 代码如下:

import jxl.cell;
import jxl.sheet;
import jxl.workbook;
import jxl.read.biff.biffexception;
import org.apache.commons.beanutils.beanutils;
import org.slf4j.logger;
import org.slf4j.loggerfactory;

import java.io.ioexception;
import java.io.inputstream;
import java.util.*;

/**
 * excel导入的工具类.
 */
public class excelutils {
    private static final logger logger = loggerfactory.getlogger(excelutils.class);
    //成功
    public static final integer status_ok = integer.valueof(1);
    //失败
    public static final integer status_no = integer.valueof(0);
    /**
     * 私有化构造器
     */
    private excelutils(){

    }

    /**
     * 获取excel文件中的数据对象
     *
     * @param is                        excel
     * @param excelcolumnnames          excel中每个字段的英文名(应该与pojo对象的字段名一致,顺序与excel一致)
     * @return                          excel每行是list一条记录,map是对应的"字段名-->值"
     * @throws exception
     */
    public static list<map<string, string>> getimportdata(inputstream is, list<string> excelcolumnnames) throws exception {
        logger.debug("inputstream:{}", is);
        if (is == null) {
            return collections.emptylist();
        }

        workbook workbook = null;
        try {
            //拿到excel
            workbook = workbook.getworkbook(is);
        } catch (biffexception e) {
            logger.error(e.getmessage(), e);
            return collections.empty_list;
        } catch (ioexception e) {
            logger.error(e.getmessage(), e);
            return collections.empty_list;
        }
        logger.debug("workbook:{}", workbook);

        if (workbook == null) {
            return collections.emptylist();
        }

        //第一个sheet
        sheet sheet = workbook.getsheet(0);
        //行数
        int rowcounts = sheet.getrows() - 1;
        logger.debug("rowcounts:{}", rowcounts);
        list<map<string, string>> list = new arraylist<map<string, string>>(rowcounts - 1);

        //双重for循环取出数据
        for(int i = 1; i < rowcounts; i++){
            map<string, string> params = new hashmap<string, string>();
            //i,j i:行 j:列
            for(int j = 0; j < excelcolumnnames.size(); j++){
                cell cell = sheet.getcell(j, i);
                params.put(excelcolumnnames.get(j), cell.getcontents());
            }

            list.add(params);
        }

        return list;
    }

    /**
     * 获取导入数据为对象的list
     *
     * @param data
     * @param clazz
     * @param excelcolumnnames
     * @param checkexcel
     * @param <t>
     * @return
     * @throws exception
     */
    public static <t> list<t> makedata(list<map<string, string>> data, class<t> clazz, list<string> excelcolumnnames, checkexcel checkexcel) throws exception {
        if(data == null || data.isempty() || clazz == null || checkexcel == null) {
            return collections.empty_list;
        }

        list<t> result = new arraylist<t>(data.size());
        for(map<string, string> d : data) {
            if(checkexcel != null && !checkexcel.check(d)) {
                continue;
            }
            t entity = clazz.newinstance();
            for(string column : excelcolumnnames) {
                beanutils.setproperty(entity, column, d.get(column));
            }

            result.add(entity);
        }

        return result;
    }
}

检查excel中每一行的数据是否合法

复制代码 代码如下:

import java.util.map;
/**
 * 检查excel中每一行的数据是否合法
 */
public interface checkexcel {
    /**
     * 返回true合法
     *
     * @param data      excel中每一行的数据
     * @return
     */
    public boolean check(map<string, string> data);
}

调用部分

复制代码 代码如下:

list<map<string, string>> data = excelutils.getimportdata(is,constants.excel_column_names);
list<feeallocation> allocations = excelutils.makedata(data, feeallocation.class, constants.excel_column_names, new checkexcel() {
            public boolean check(map<string, string> data) {
                if(stringutils.isempty(data.get("name")))
                    return false;
                return true;
            }
        });