首先创建一个maven项目,导入POI依赖包

 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
</dependency>

泛型的使用是为了让生成excel表格的方法具有通用性

代码里边需要有一个跟excel表格行数相对应的实体类,需求是将实体类集合存入表格中

public class UserEntity {

    private Long id;
    private String username;
    private String type;
    private String name;
    private String password;
}

 

这里通过传入参数:文件路径、文件要存储的集合数据、excel的sheet名称、表格第一行的数据(各个列的名称)

创建excel文件使用的都是POI的接口,创建excel,创建一个sheet,存入数据

public static<E> String exportExcel(List<E> entities, String sheetName, String[] rowHeads, String filePath) throws IllegalAccessException, IOException {
        //创建一个excel文件
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建excel的一个sheet
        HSSFSheet sheet = workbook.createSheet(sheetName);

        // 创建第一行
        HSSFRow row = sheet.createRow(0);
        // 创建表格样式
        HSSFCellStyle style = workbook.createCellStyle();

        style.setAlignment(HorizontalAlignment.CENTER);

        // 将列名放入
        for (int i = 0; i < rowHeads.length; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellValue(rowHeads[i]);
            cell.setCellStyle(style);
        }

        for (int i = 0; i < entities.size(); i++) {
            row = sheet.createRow(i+1);
            // 使用反射获取对象
            E entity = entities.get(i);
            Class clazz = entity.getClass();
            // 获取对象的属性集合
            Field[] fields = clazz.getDeclaredFields();

            for (int j = 0; j < fields.length; j++) {

                Field field = fields[j];
                field.setAccessible(true);

                Object object = field.get(entity);
                row.createCell(j).setCellValue(String.valueOf(object));
            }
        }
        workbook.write(new FileOutputStream(filePath));
        return filePath;
    }

这里传入的是一个泛型的集合,所以并不知道这个集合是哪种类型,只能通过反射获取对象的属性

首先获取对象的类定义,然后获取属性集合

  • 因为类在定义时属性都使用了private修饰,所以要设置属性为可访问的
  • 如果当前类有父类的话,这种方式不能获取父类属性,要通过父类获取

得到数据后便将excel表格数据存储到文件中

 

测试代码

public static void main(String[] args) throws IOException, IllegalAccessException {

        List<UserEntity> userEntities = new ArrayList<>();

        // 初始化数据
        for (int i = 0; i < 10; i++) {
            UserEntity entity = new UserEntity();
            entity.setId((long) (i+1));
            entity.setName("小明"  + i);
            entity.setUsername("username" + i);
            entity.setPassword("password" + i);
            entity.setType("教师");
            userEntities.add(entity);
        }

        // 表格第一行存储列的名称
        String[] headName = new String[]{"用户id","姓名","账号","密码","类型"};

        // sheet的名称
        String sheetName = "用户统计表";

        String fileName = UUID.randomUUID() + ".xls";

        exportExcel(userEntities,sheetName,headName,fileName);
    }

 

使用了UUID作为文件名,防止文件被重复,需要指定文件类型为xls

文件被创建了,如果没有指定路径,默认是和src文件夹在同一个目录下