poi-excel导入导出

一、添加依赖

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

  

二、工具类

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.*;


@Slf4j
public class ExcelHelper<T> {
    //构造方法
    public ExcelHelper() {
    }

    Class<T> clazz;

    public Class<T> getClazz() {
        return clazz;
    }

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


    /**
     * 读EXCEL文件,获取信息集合
     *filePath:文件所在目录;name:文件名称;fieldmap:目标类需要导入的字段
     * @param filePath
     * @return
     */
    public List<T> getExcelInfo(String filePath,String name,Map fieldmap,MultipartFile Mfile) {
        //把spring文件上传的MultipartFile转换成CommonsMultipartFile类型
        CommonsMultipartFile cf = (CommonsMultipartFile) Mfile; //获取本地存储路径

        File file = new File(filePath);
        //创建一个目录 (它的路径名由当前 File 对象指定,包括任一必须的父路径。)
        if (!file.exists()) file.mkdirs();
        //新建一个文件
        String newFilePath=filePath+name;
        File file1 = new File(newFilePath);
        //将上传的文件写入新建的文件中
        try {
            cf.getFileItem().write(file1);
        } catch (Exception e) {
            log.error("ReadExcel:" + e);
            e.printStackTrace();
        }
        List<T> dist = new ArrayList<T>();
        try {
            FileInputStream in = new FileInputStream(file1);
            HSSFWorkbook book = new HSSFWorkbook(in);
            // // 得到第一页
            HSSFSheet sheet = book.getSheetAt(0);
            // // 得到第一面的所有行
            Iterator<Row> row = sheet.rowIterator();
            // 获取标题map
            Map titlemap = getTitleMap(row);
            while (row.hasNext()) {
                T tObject = clazz.newInstance();
                // 标题下的第一行
                Row rown = row.next();
                int k = 0;
                // 遍历一行的列
                for (int j = 0; j < rown.getLastCellNum() + 1; j++) {
                    Cell cell = rown.getCell(j);
                    if (cell == null) {
                        k++;
                        continue;
                    }
                    // 得到此列的对应的标题
                    String titleString = (String) titlemap.get(k);
                    // 如果这一列的标题和类中的某一列的Annotation相同,那么则调用此类的的set方法,进行设值
                    if (fieldmap.containsKey(titleString)) {
                        Method setMethod = (Method) fieldmap.get(titleString);
                        setData(tObject, cell, setMethod);
                    }
                    k++;
                }
                dist.add(tObject);
            }
        } catch (Exception e) {
            log.error(e.toString());
        }
        return dist;
    }


    private Map getTitleMap(Iterator<Row> row) {

        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();
            // 还是把表头trim一下
            value = value.trim();
            titlemap.put(i, value);
            i = i + 1;
        }
        return titlemap;
    }


    private void setData(T tObject, Cell cell, Method setMethod) throws IllegalAccessException, InvocationTargetException {
        // 得到setter方法的参数
        Type[] ts = setMethod.getGenericParameterTypes();
        // 只要一个参数
        String xclass = ts[0].toString();
        // 判断参数类型
        try {
            switch (cell.getCellTypeEnum()) {
                // 数字
                case NUMERIC:
                    if ("class java.lang.String".equals(xclass)) {
                        if ((cell.getNumericCellValue() + "").indexOf(".") > 0) {
                            setMethod.invoke(tObject, (cell.getNumericCellValue() + "").substring(0, (cell.getNumericCellValue() + "").lastIndexOf(".")));
                        }
                    } else if ("class java.lang.Integer".equals(xclass)) {
                        setMethod.invoke(tObject, (int) cell.getNumericCellValue());
                    } else if ("int".equals(xclass)) {
                        setMethod.invoke(tObject, (int) cell.getNumericCellValue());
                    } else if ("class java.lang.Long".equals(xclass)) {
                        Long temp = (long) cell.getNumericCellValue();
                        setMethod.invoke(tObject, temp);
                    }
                    break;
                // 字符串
                case STRING:
                    if ("class java.lang.Integer".equals(xclass)) {
                        setMethod.invoke(tObject, Integer.parseInt(cell.getStringCellValue()));
                    } else if ("class java.lang.String".equals(xclass)) {
                        setMethod.invoke(tObject, cell.getStringCellValue().trim());
                    } else if ("int".equals(xclass)) {
                        int temp = Integer.parseInt(cell.getStringCellValue());
                        setMethod.invoke(tObject, temp);
                    } else if ("class java.lang.Long".equals(xclass)) {
                        Long temp = Long.parseLong(cell.getStringCellValue());
                        setMethod.invoke(tObject, temp);
                    }
                    break;
                // Boolean
                case BOOLEAN:
                    Boolean boolname = true;
                    if ("否".equals(cell.getStringCellValue())) {
                        boolname = false;
                    }
                    setMethod.invoke(tObject, boolname);
                    break;
                // 公式
                case FORMULA:
                    log.info(cell.getCellFormula() + "   ");
                    break;
                // 空值
                case BLANK:
                    log.info(" ");
                    break;
                // 故障
                case ERROR:
                    log.info(" ");
                    break;
                default:
                    log.info("未知类型   ");
                    break;
            }
        } catch (Exception e) {
            // 转换出错
            log.error(e.toString());
            throw e;
        }
    }


    // 得到目标类需要导入的字段
    public Map getFieldMap(String[] fileds) throws NoSuchMethodException {
        Field[] filed = clazz.getDeclaredFields();
        Map fieldmap = new HashMap();
        // 循环读取所有字段
        for (int i = 0; i < filed.length; i++) {
            Field f = filed[i];
            for(int j=0;j<fileds.length;j++){
                String fd=fileds[j];
                if(f.getName().equals(fd)){
                    String setMethodName = "set"
                            + f.getName().substring(0, 1).toUpperCase()
                            + f.getName().substring(1);
                    Method setMethod = clazz.getMethod(setMethodName,
                            new Class[]{f.getType()});
                    fieldmap.put(f.getName(), setMethod);
                }

            } }
        return fieldmap;
    }

    //导出EXCEL
    public  String export(String basePath,String excelPath,String [][] content,String[] title,String sheetName,String fileName){
        OutputStream os=null;

        try {
            fileName=new SimpleDateFormat("yyyy-MM-dd").format(new Date())+"/"+fileName;
            File folderFile=new File(basePath+excelPath+new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
            if(!folderFile.exists()){
                folderFile.mkdir();
            }
            os = new FileOutputStream(new File(basePath+excelPath + fileName));
            HSSFWorkbook wb = getHSSFWorkbook(sheetName, title, content, null);
            wb.write(os);
            os.flush();
            os.close();
        }catch (Exception e){
            e.printStackTrace();

        }finally {
            os=null;
        }
        return excelPath+fileName;
    }


    /**
     * 导出Excel
     * @param sheetName sheet名称
     * @param title 标题
     * @param values 内容
     * @param wb HSSFWorkbook对象
     * @return
     */
    private  HSSFWorkbook getHSSFWorkbook(String sheetName,String []title,String [][]values, HSSFWorkbook wb){

        // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
        if(wb == null){
            wb = new HSSFWorkbook();
        }

        // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet(sheetName);

        // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
        HSSFRow row = sheet.createRow(0);

        // 第四步,创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle style = wb.createCellStyle();
        //style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式

        //声明列对象
        HSSFCell cell = null;

        //创建标题
        for(int i=0;i<title.length;i++){
            cell = row.createCell(i);
            cell.setCellValue(title[i]);
            cell.setCellStyle(style);
        }

        //创建内容
        for(int i=0;i<values.length;i++){
            row = sheet.createRow(i + 1);
            for(int j=0;j<values[i].length;j++){
                //将内容按顺序赋给对应的列对象
                row.createCell(j).setCellValue(values[i][j]);
            }
        }
        return wb;
    }
}

  

posted @ 2018-10-17 10:16  撸码识途  阅读(422)  评论(0编辑  收藏  举报