EXCEL导入导出

一、使用Apache POI方式

1.1  基本实现方式

        HSSFWorkbook sheets = new HSSFWorkbook();
        HSSFSheet sheet = sheets.createSheet(aClass.getName());
        HSSFRow row = sheet.createRow(0);
        HSSFCell cell=null;
        for (int i = 0; i <declaredFields.length ; i++) {
            cell= row.createCell(i);
            cell.setCellValue(declaredFields[i].getName());
        }
        sheets.write(new FileOutputStream("C:\Users\yaohuiqin\Desktop\excel\excelname.xls"));    

1.2 列合并

        int mergeBeginRow = 3;
        int mergeEndRow = 4;
        int columnIndex = 0;
        sheet.addMergedRegion(new CellRangeAddress(
                mergeBeginRow , //first row (0-based)
                mergeEndRow, //last row  (0-based)
                columnIndex, //first column (0-based)
                columnIndex  //last column  (0-based)
        ));    

1.3 直接读EXCEL

package com.amazing.poi.excel.test;

import org.apache.poi.ss.usermodel.*;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;

/**
 * @author yaohuiqin
 * @description
 * @date 2020-04-20
 */
public class ReadTest {
    public static void main(String[] args) throws IOException {
        ReadTest readTest = new ReadTest();
        readTest.readexcel();
    }

    public void readexcel() throws IOException {
        System.out.println("开始读。。。。。。");
        String path = "C:\Users\yaohuiqin\Desktop\excel\m-cell-3.xls";
        FileInputStream fis = new FileInputStream(path);
        Workbook wb = WorkbookFactory.create(fis);
        Sheet sheetAt = wb.getSheetAt(0);
        Iterator<Row> rowIterator = sheetAt.rowIterator();
        while (rowIterator.hasNext()) {
            Row next = rowIterator.next();
            rowhandler(next);
            System.out.println();
        }
    }

    public void rowhandler(Row row0) {
        Iterator<Cell> cellIterator = row0.cellIterator();
        while (cellIterator.hasNext()) {
            Cell next = cellIterator.next();
            Object getvalue = getvalue(next);
            System.out.print(getvalue + "    ");
        }
    }

    public Object getvalue(Cell tmp) {
        Object value = null;
        switch (tmp.getCellType()) {
            case _NONE:
                break;
            case BLANK:
                break;
            case STRING:
                value = tmp.getStringCellValue();
                break;
            case BOOLEAN:
                value = tmp.getBooleanCellValue();
                break;
            case FORMULA:
                value = tmp.getCellFormula();
                break;
            case NUMERIC:
                value = tmp.getNumericCellValue();
                break;
            case ERROR:
                value = tmp.getErrorCellValue();
                break;
            default:
                break;
        }
        return value;
    }
}

1.4 读取excel,将excel转为对象列表

@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface excelvalue {
    String name() default "";
}
public class Person {
    @excelvalue(name = "姓名")
    String name;
    @excelvalue(name = "年龄")
    int age;
    @excelvalue(name = "性别")
    String gender;
//get and set
}
package com.amazing.poi.excel.test;

import com.amazing.poi.excel.commons.ObjectCastUtils;
import org.apache.poi.ss.usermodel.*;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

/**
 * @author yaohuiqin
 * @description
 * @date 2020-04-20
 */
public class ReadToObjectTest {
    public static void main(String[] args) throws Exception {
        ReadToObjectTest readToObjectTest = new ReadToObjectTest();
        String path = "C:\Users\yaohuiqin\Desktop\excel\m-cell-3.xls";
        FileInputStream fis = new FileInputStream(path);
        Person person = new Person();
        List<Person> peoples = readToObjectTest.readExcel(person, fis);
        for(Person people : peoples){
            System.out.println(people);
        }
    }
    public <T> List<T> readExcel(T t, FileInputStream fis) throws Exception {
        Workbook wb = WorkbookFactory.create(fis);
        List<T> list = new LinkedList<T>();
        Sheet sheetAt = wb.getSheetAt(0);
        Iterator<Row> rowIterator = sheetAt.rowIterator();
        Map<Integer, Method> headerhandler = null;
        //处理表头
        if(rowIterator.hasNext()){
            Row headerRow = rowIterator.next();
            headerhandler = headerhandler(t, headerRow);
        }
        while (rowIterator.hasNext()) {
            Row next = rowIterator.next();
            T t1 = rowhandler(t,next,headerhandler);
            list.add(t1);
        }
        return list;
    }

    public <T> Map<Integer,Method> headerhandler(T t, Row headerRow) throws Exception {
        Iterator<Cell> cellIterator = headerRow.cellIterator();
        int i = 1;
        Map<Integer,Method> map = new HashMap<Integer,Method>();
        while (cellIterator.hasNext()) {
            Cell next = cellIterator.next();
            Object getvalue = getvalue(next);
            Method writeMethod = getcellHandler(t, getvalue);
            if(writeMethod == null){
                throw new Exception("excel头部和对象不匹配");
            }
            map.put(i,writeMethod);
            i++;
        }
        return map;
    }

    public <T> T  rowhandler(T t, Row row0, Map<Integer, Method> headerhandler) throws IllegalAccessException, InstantiationException, InvocationTargetException {
        Class<?> aClass = t.getClass();
        T object = (T) aClass.newInstance();
        Iterator<Cell> cellIterator = row0.cellIterator();
        int i = 1;
        while (cellIterator.hasNext()) {
            Cell next = cellIterator.next();
            Object getvalue = getvalue(next);
            Method writeMethod = headerhandler.get(i);
            Class<?>[] parameterTypes = writeMethod.getParameterTypes();
            Class<?> parameterType = parameterTypes[0];
            Object castValue = ObjectCastUtils.objectCast(parameterType,getvalue);
            i++;
            writeMethod.invoke(object,castValue);
        }
        return object;
    }

    public <T> Method getcellHandler(T t,Object getvalue) throws IntrospectionException {
        System.out.println(getvalue.getClass());
        Field[] declaredFields = t.getClass().getDeclaredFields();
        List<String > list = new ArrayList<>();
        for(Field field :declaredFields){
            excelvalue annotation = field.getAnnotation(excelvalue.class);
            String name = annotation.name();
            if(name.equals(getvalue)){
               PropertyDescriptor pd = new PropertyDescriptor(field.getName(), t.getClass());
               Method writeMethod = pd.getWriteMethod();
               return writeMethod;
            }
        }
        return null;
    }

    public Object getvalue(Cell tmp) {
        Object value = null;
        switch (tmp.getCellType()) {
            case _NONE:
                break;
            case BLANK:
                break;
            case STRING:
                value = tmp.getStringCellValue();
                break;
            case BOOLEAN:
                value = tmp.getBooleanCellValue();
                break;
            case FORMULA:
                value = tmp.getCellFormula();
                break;
            case NUMERIC:
                value = tmp.getNumericCellValue();
                break;
            case ERROR:
                value = tmp.getErrorCellValue();
                break;
            default:
                break;
        }
        return value;
    }
}

  

  

 

  

  

  

原文地址:https://www.cnblogs.com/yaohuiqin/p/12717742.html