首先创建一个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文件夹在同一个目录下