比较灵活的java导入excel源码参考

package com.ggg.common.utils.excel;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * Excel
 */
public class ImportExcel<T> {
    Class<T> clazz;

    public ImportExcel(Class<T> clazz) {
        this.clazz = clazz;
    }

    /**
     * @Description: 导入excel文件
     * @param {String} 本地excel路径
     * @param {String} 网络url上的excel路径
     * @param {String...} pattern
     * @return {*}
     */    
    public Collection<T> importExcel(String filePath, String urlPath, String... pattern) {
        Collection<T> dist = new ArrayList();
        try {
            /**
             * 类反射得到调用方法
             */
            // 得到目标目标类的所有的字段列表
            Field filed[] = clazz.getDeclaredFields();
            // 将所有标有Annotation的字段,也就是允许导入数据的字段,放入到一个map中
            Map fieldmap = new HashMap();
            // 循环读取所有字段
            for (int i = 0; i < filed.length; i++) {
                Field f = filed[i];
                // 得到单个字段上的Annotation
                ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);
                // 如果标识了Annotationd的话
                if (exa != null) {
                    // 构造设置了Annotation的字段的Setter方法
                    String fieldname = f.getName();
                    String setMethodName = "set"
                            + fieldname.substring(0, 1).toUpperCase()
                            + fieldname.substring(1);
                    // 构造调用的method,
                    Method setMethod = clazz.getMethod(setMethodName,
                            new Class[]{f.getType()});
                    // 将这个method以Annotaion的名字为key来存入。
                    fieldmap.put(exa.exportName(), setMethod);
                }
            }
            /**
             * excel的解析开始
             */
            // 将传入的File构造为FileInputStream;
            FileInputStream in = null;
            InputStream ini = null;
            // 得到工作表
            XSSFWorkbook book = null;
            if (urlPath == null || urlPath.isEmpty()) {//使用本地文件模式
                in = new FileInputStream(new File(filePath));
                book = new XSSFWorkbook(in);
            } else {//直接导入网络url文件
                URL url = new URL(urlPath);
                URLConnection urlconn = url.openConnection(); // 试图连接并取得返回状态码
                urlconn.connect();
                HttpURLConnection httpconn = (HttpURLConnection) urlconn;
                int HttpResult = httpconn.getResponseCode();
                if (HttpResult != HttpURLConnection.HTTP_OK) {
                    System.out.print("无法连接到");
                } else {
                    int filesize = urlconn.getContentLength(); // 取数据长度
                    System.out.println("取数据长度====" + filesize);
                    urlconn.getInputStream();
                    ini = urlconn.getInputStream();
                    book = new XSSFWorkbook(ini);
                }
            }
            // // 得到第一页
            XSSFSheet sheet = book.getSheetAt(0);
            // // 得到第一面的所有行
            Iterator<Row> row = sheet.rowIterator();

            /**
             * 标题解析
             */
            // 得到第一行,也就是标题行
            Row title = row.next();
            // 得到第一行的所有列
            Iterator<Cell> cellTitle = title.cellIterator();
            // 将标题的文字内容放入到一个map中。
            Map titlemap = new HashMap();
            // 从标题第一列开始
            int i = 0;
            // 循环标题所有的列
            while (cellTitle.hasNext()) {
                Cell cell = cellTitle.next();
                String value = cell.getStringCellValue();
                titlemap.put(i, value);
                System.out.println("title_i:" + i + "_" + value);
                i = i + 1;
            }
            /**
             * 解析内容行
             */
            //用来格式化日期的DateFormat
            SimpleDateFormat sf;
            if (pattern.length < 1) {
                sf = new SimpleDateFormat("yyyy-MM-dd");
            } else {
                sf = new SimpleDateFormat(pattern[0]);
            }
            while (row.hasNext()) {
                // 标题下的第一行
                Row rown = row.next();

                // 行的所有列
                Iterator<Cell> cellbody = rown.cellIterator();
                // 得到传入类的实例
                T tObject = clazz.newInstance();
                // 遍历一行的列

                while (cellbody.hasNext()) {
                    Cell cell = cellbody.next();
                    int k = cell.getColumnIndex();
                    // 这里得到此列的对应的标题
                    String titleString = (String) titlemap.get(k);
                    // 如果这一列的标题和类中的某一列的Annotation相同,那么则调用此类的的set方法,进行设值
                    if (fieldmap.containsKey(titleString)) {
                        System.out.println("titleString:" + titleString + "_K:" + k);
                        Method setMethod = (Method) fieldmap.get(titleString);
                        //得到setter方法的参数
                        Class<?>[] ts = setMethod.getParameterTypes();
                        //只要一个参数
                        Object xclass = ts[0];
                        //判断参数类型
                        if (xclass.toString().equals("class java.lang.String")) {
                            cell.setCellType(CellType.STRING);
                            System.out.println("cell.getStringCellValue_class java.lang.String:" + cell.getStringCellValue());
                            if (!cell.getStringCellValue().isEmpty()) {
                                setMethod.invoke(tObject, cell.getStringCellValue());
                            }
                        } else if (xclass.toString().equals("class java.util.Date")) {
                            try {
                                setMethod.invoke(tObject, cell.getDateCellValue());
                            } catch (Exception e) {
                                cell.setCellType(CellType.STRING);
                                setMethod.invoke(tObject, sf.parse(cell.getStringCellValue()));
                                System.out.println("Exception:" + e.getMessage());
                            }
                        } else if (xclass.toString().equals("boolean")) {
                            cell.setCellType(CellType.STRING);
                            if (!cell.getStringCellValue().isEmpty()) {
                                boolean boolName = true;
                                if (cell.getStringCellValue().equals("否")) {
                                    boolName = false;
                                }
                                setMethod.invoke(tObject, boolName);
                            }
                        } else if (xclass.toString().equals("class java.lang.Long")) {
                            cell.setCellType(CellType.STRING);
                            if (!cell.getStringCellValue().isEmpty()) {
                                try {
                                    setMethod.invoke(tObject, Long.parseLong(cell.getStringCellValue()));
                                } catch (Exception e){
                                    setMethod.invoke(tObject, 0L);
                                }
                            }
                        } else if (xclass.toString().equals("float")) {
                            cell.setCellType(CellType.STRING);
                            if (!cell.getStringCellValue().isEmpty()) {
                                try {
                                    setMethod.invoke(tObject, Float.parseFloat(cell.getStringCellValue()));
                                } catch (Exception e) {
                                    setMethod.invoke(tObject, 0.00f);
                                }
                            }
                        } else if (xclass.toString().equals("int")) {
                            cell.setCellType(CellType.STRING);
                            if (!cell.getStringCellValue().isEmpty()) {
                                try {
                                    setMethod.invoke(tObject, Integer.parseInt(cell.getStringCellValue()));
                                } catch (Exception e){
                                    setMethod.invoke(tObject, 0);
                                }
                            }
                        } else {
                            System.out.println("xClass__:" + xclass.toString());
                        }
                    }
                }
                dist.add(tObject);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return dist;
    }

    public static void main(String[] args) {
//        ImportExcel<Loginfo> test = new ImportExcel(Loginfo.class);
//        File file = new File("D:\\testOne.xls");
//        Long befor = System.currentTimeMillis();
//        List<Loginfo> result = (ArrayList) test.importExcel(file);
//
//        Long after = System.currentTimeMillis();
//        System.out.println("此次操作共耗时:" + (after - befor) + "毫秒");
//        // for (int i = 0; i < result.size(); i++) {
//        // Loginfo loginfo=result.get(i);
//        // System.out.println("导入的信息为:"+loginfo.getLogInfo()+loginfo.getUserip()+loginfo.getUsername());
//        // }
//
//        System.out.println("共转化为List的行数为:" + result.size());
    }
}

本文来源:天下码农 作者:程序猿

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系Email:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行