java excel上传--poi

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 工作中很多批量上传需求不同,每个需求都要写一次批量上传代码,太烦。。决定写一个通用工具,此代码复制即用。需要改进的地方请评论区留言 方法调用传参例子: 上传文件中列的字段对应的是对象的属性 String[] fieldsName = new String[]{"carModelName",".

工作中很多批量上传需求不同,每个需求都要写一次批量上传代码,太烦。。决定写一个通用工具,此代码复制即用。需要改进的地方请评论区留言

方法调用传参例子:
上传文件中列的字段对应的是对象的属性

String[] fieldsName = new String[]{"carModelName","salePrice"};  

此参数是上传文件中列必传字段对应对象的属性

String[] fieldsIsNull = new String[]{"carModelName"};  

注:数组属性顺序必须和文件中顺序一样,解析文件时赋值不会赋错字段

 public static final String OFFICE_EXCEL_2003_POSTFIX = "xls";
public static final String OFFICE_EXCEL_2007_POSTFIX = "xlsx";
public static final String EMPTY = "";
public static final String POINT = ".";

/
**

 * 通过反射处理以获得的数据
 * @param
 */
public T reflectDeal(T className, Cell cell, String fieldName){
    Class aClass = null;
    try {
        aClass = className.getClass();
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field field:declaredFields) {
            field.setAccessible(true);
            String names = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1, fieldName.length());
            if(field.getName().equals(fieldName) && field.getType().getName().equals("java.math.BigDecimal")){
                aClass.getMethod("set"+names,BigDecimal.class).invoke(className,new BigDecimal(""+cell));
            }else if(field.getName().equals(fieldName) && field.getType().getName().equals("java.lang.String")){
                aClass.getMethod("set"+names,String.class).invoke(className,cell.getStringCellValue().toString());
            }else if(field.getName().equals(fieldName) && field.getType().getName().equals("java.lang.Integer")){
                aClass.getMethod("set"+names,Integer.class).invoke(className,cell);
            }else if(field.getName().equals(fieldName) && field.getType().getName().equals("java.lang.Double")){
                aClass.getMethod("set"+names,Double.class).invoke(className,cell);
            }
        }
    }  catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
    return className;
}

 /**
 * 本段代码解析xls文件
 * @param
 */
public List<T> analysisXls(InputStream in,Class<?> clazz,String[] fieldsName,String[] fieldsIsNull)  {
    int totalrows = 0;
    int totalCell = 0;

    List<T> list = new ArrayList();
    logger.info("====================  开始解析xls文件  =========================");
    //流读取文件
    //创建文件
    HSSFWorkbook wb = null;
    try {
        wb = new HSSFWorkbook(in);
        //读取页数
        for(int num = 0 ; num < wb.getNumberOfSheets() ; num ++){
            Sheet xs = wb.getSheetAt(num);
            if(xs == null){
                continue;
            }
            totalrows = xs.getLastRowNum()+1;
            for (int rnum = 1 ; rnum < totalrows ; rnum ++){
                boolean flag = false;
                T o = null;
                try {
                    o = (T)clazz.newInstance();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                Row row = xs.getRow(rnum);
                if(row != null){
                    totalCell = row.getLastCellNum();
                    int nullCellNumb = 0;
                    for (int cnum = 0 ; cnum < totalCell ; cnum ++){
                        Cell cell = row.getCell(cnum);
                        if(null == cell){
                            nullCellNumb++;
                            if(nullCellNumb>=10){
                                break;
                            }
                            continue;
                        }
                        if( cell != null && !"".equals(cell.toString().trim())){
                            this.reflectDeal(o, cell, fieldsName[cnum]);
                        }else {
                            for (int x=0;x<fieldsIsNull.length;x++){
                                if(fieldsIsNull[x].equals(fieldsName[cnum])){
                                    flag = true;
                                    break;
                                }
                            }
                        }
                    }
                    if (flag){
                        continue;
                    }
                    list.add(o);
                }else {
                    return list;
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            in.close();
            if(null != wb){
                wb.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return list;
}

/**

 * 本段代码解析xlsx文件
 * @param
 * @param clazz
 * @param fieldsName
 * @return
 */
public List<T> analysisXlsx(InputStream in,Class<?> clazz,String[] fieldsName,String[] fieldsIsNull){
    int totalrows = 0;
    int totalCell = 0;
    List<T> list = new ArrayList();
    logger.info("====================  开始解析xlsx文件  =========================");
    //流读取文件
    //创建文件
    XSSFWorkbook wb = null;
    try {
        wb = new XSSFWorkbook(OPCPackage.open(in));
        //读取页数
        for(int num = 0 ; num < wb.getNumberOfSheets() ; num ++){
            Sheet xs = wb.getSheetAt(num);
            if(xs == null){
                continue;
            }
            totalrows = xs.getLastRowNum()+1;
            for (int rnum = 1 ; rnum < totalrows ; rnum ++){
                boolean flag = false;
                T o = (T)clazz.newInstance();
                Row row = xs.getRow(rnum);
                if(row != null){
                    totalCell = row.getLastCellNum();
                    int nullCellNumb = 0;
                    for (int cnum = 0 ; cnum < totalCell ; cnum ++){
                        Cell cell = row.getCell(cnum);
                        if(null == cell){
                            nullCellNumb++;
                            if(nullCellNumb>=10){
                                break;
                            }
                            continue;
                        }

                        if( cell != null  && !"".equals(cell.toString().trim())){
                            nullCellNumb = 0;
                            this.reflectDeal(o, cell, fieldsName[cnum]);
                        }else {
                            for (int x=0;x<fieldsIsNull.length;x++){
                                if(fieldsIsNull[x].equals(fieldsName[cnum])){
                                    flag = true;
                                    break;
                                }
                            }
                        }
                    }
                    if (flag){
                        continue;
                    }
                    list.add(o);
                }else {
                    return list;
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (InvalidFormatException e) {
        logger.info("======= XSSF创建文件失败 ====");
        e.printStackTrace();
    }finally {
        try {
            in.close();
            if(null != wb){
                wb.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return list;
} 

/**

 *此段代码区分e'xcel版本,分别调用哪个方法
 * @param
 * @param clazz
 * @param fieldsName
 * @return
 * @throws IOException
 */
public List<T> readxlsAndXlsx(InputStream in,Class<?> clazz,String[] fieldsName,String fileName,String[] fieldsIsNull) {
    if(null != in  ){
        String postfix = ExcelImport.getpostfix(fileName);
        if(OFFICE_EXCEL_2003_POSTFIX.equals(postfix)){
            return this.analysisXls(in,clazz,fieldsName,fieldsIsNull);
        }else if(OFFICE_EXCEL_2007_POSTFIX.equals(postfix)){
           return this.analysisXlsx(in,clazz,fieldsName,fieldsIsNull);
        }else {
            return null;
        }
    }
    return null;
} 

/**

 * 获取文件后缀名
 * @param path
 * @return
 */
public static String getpostfix(String path){
    if(path == null || EMPTY.equals(path.trim())){
        return "";
    }
    if(path.contains(POINT)){
       return path.substring(path.lastIndexOf(POINT)+1,path.length());
    }
    return "";
}
相关文章
|
5天前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
27 5
|
4月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作
|
5天前
|
Java API Apache
|
8天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
20 4
|
5月前
|
Java 数据库 数据安全/隐私保护
Java操作Excel文件导入导出【内含有 jxl.jar 】
Java操作Excel文件导入导出【内含有 jxl.jar 】
81 0
|
26天前
|
前端开发 JavaScript Java
导出excel的两个方式:前端vue+XLSX 导出excel,vue+后端POI 导出excel,并进行分析、比较
这篇文章介绍了使用前端Vue框架结合XLSX库和后端结合Apache POI库导出Excel文件的两种方法,并对比分析了它们的优缺点。
190 0
|
2月前
|
存储 Java
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
44 2
|
1月前
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
34 0
|
3月前
|
存储 Java Apache
|
3月前
|
easyexcel Java 关系型数据库
阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
该文章主要介绍了在Java应用中如何使用EasyExcel技术完成对Excel文件的导入和导出操作,包括环境搭建、基本概念、快速入门、进阶操作和综合应用等内容,并提供了相关代码示例和注意事项。
 阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel