java操作Excel简单入门

简介

在项目中使用到Excel是很常见的,如批量导入数据,批量导出数据。这里我们使用Apache的开源项目POI来操作Excel。官网

添加依赖

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>3.9</version>
</dependency>

创建Excel文件

@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@ToString
@Accessors(chain = true)
public class Person {

  private String username;
  private String gender;
  private String address;
}

定义用户模型

public class Client {

  public static void main(String[] args) throws Exception {
    List<Person> personList = Arrays.asList(
        new Person().setUsername("李四").setGender("男").setAddress("北京"),
        new Person().setUsername("小王").setGender("女").setAddress("上海"));
    //工作簿 表示一个excel文件
    Workbook wb = new SXSSFWorkbook();
    //一个表格
    Sheet sheet = wb.createSheet();
    //创建标题行
    Row row = sheet.createRow(0);
    //1个单元格
    Cell cell = row.createCell(0);
    cell.setCellValue("用户名");
    cell = row.createCell(1);
    cell.setCellValue("性别");
    cell = row.createCell(2);
    cell.setCellValue("地址");

    AtomicInteger rowIndex = new AtomicInteger(1);
    for (Person person : personList) {
      //创建数据行
      row = sheet.createRow(rowIndex.getAndIncrement());
      row.createCell(0).setCellValue(person.getUsername());
      row.createCell(1).setCellValue(person.getGender());
      row.createCell(2).setCellValue(person.getAddress());
    }
    wb.write(new FileOutputStream("D:\\person.xlsx"));
  }
}

生成的Excel如下

Workbook在POI中有3种实现,

  • HSSFWorkbook,适用于2003及之前的版本,后缀为.xls,行数最多为65536行
  • XSSFWorkbook,适用于2007及之后的版本,后缀为.xlsx,行数最多为1048576行,可能出现OutOfMemoryError错误
  • SXSSFWorkbook,适用于大型Excel文件的操作,不会造成内存溢出,基本原理就是空间换时间,将数据保存到硬盘中

可以看到两种版本的行大小和列大小


可以看到,在创建行对象之前都会校验最大行数。
SXSSFWorkbook会使用很低的内存,这是因为超过100行的数据都会保存到临时文件中

临时文件中内容为

读取Excel文件

public class Client {

  public static void main(String[] args) throws Exception {

    Workbook wb = new XSSFWorkbook(new FileInputStream("D:\\person.xlsx"));
    Sheet sheet = wb.getSheetAt(0);
    Iterator<Row> rowIterator = sheet.iterator();
    //过滤标题行
    rowIterator.next();
    List<Person> personList = new ArrayList<>();
    while (rowIterator.hasNext()) {
      Row row = rowIterator.next();
      Person person = new Person();
      Cell cell;
      cell = row.getCell(0);
      if (cell != null) {
        person.setUsername(cell.getStringCellValue());
      }
      cell = row.getCell(1);
      if (cell != null) {
        person.setGender(cell.getStringCellValue());
      }
      cell = row.getCell(2);
      if (cell != null) {
        person.setAddress(cell.getStringCellValue());
      }
      personList.add(person);
    }
    System.out.println(personList);
  }

}

可以看到,使用POI操作Excel还是很简单的,关于更加复杂的Excel功能,请读者自行研究。

posted @ 2020-12-08 21:26  strongmore  阅读(1537)  评论(0编辑  收藏  举报