使用Poi导入导出Excel
操作Excel的实体类
实体类代码如下:
package com.example.practicecode.wxy.Poi;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: wxy
* @Date: 2023/12/04 10:06
* @Description: poi实体类
*/
@Data
@AllArgsConstructor(staticName = "of")
@NoArgsConstructor
public class Person {
/**
* 主键
*/
private Long id;
/**
* 姓名
*/
private String name;
/**
* 昵称
*/
private String nickName;
/**
* 年龄
*/
private int age;
/**
* 身高
*/
private double height;
}
把数据导出Excel
代码如下:
package com.example.practicecode.wxy.Poi;
import lombok.extern.log4j.Log4j2;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @Author: wxy
* @Date: 2023/12/04 10:08
* @Description: 使用poi导出测试
*/
@Log4j2
public class PoiExportDemo {
public static void main(String[] args) {
long start = System.currentTimeMillis();
try (FileOutputStream outputStream = new FileOutputStream("D:\\demo.xlsx"); HSSFWorkbook workbook = new HSSFWorkbook()) {
// 创建一个工作表
HSSFSheet sheet = workbook.createSheet("人员名单");
// 设置工作表的列宽
sheet.setColumnWidth(0, 20 * 256);
sheet.setColumnWidth(1, 20 * 256);
sheet.setColumnWidth(2, 20 * 256);
sheet.setColumnWidth(3, 20 * 256);
// 模拟导出的数据
ArrayList<Person> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
list.add(Person.of(i + 1L, "吴新宇" + i, "吴同学" + i, 18 + i, 176.1 + i));
}
// 设置表头
String[] headers = {"姓名", "昵称", "年龄", "体重"};
HSSFRow headerRow = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
headerRow.createCell(i).setCellValue(headers[i]);
}
// 第二行的标记,从第二行开始循环创建单元格并插入数据
AtomicInteger rowNum = new AtomicInteger(1);
list.stream().forEach(l -> {
HSSFRow row = sheet.createRow(rowNum.getAndIncrement());
row.createCell(0).setCellValue(l.getName());
row.createCell(1).setCellValue(l.getNickName());
row.createCell(2).setCellValue(l.getAge());
row.createCell(3).setCellValue(l.getHeight());
});
//将数据写出
workbook.write(outputStream);
long end = System.currentTimeMillis();
log.info("导出方法执行完毕,当前方法消耗的时间为: " + (end - start) + "ms");
} catch (Exception e) {
log.error("当前方法出现异常,异常为" + e, e);
}
}
}
从Excel导入数据
代码如下:
package com.example.practicecode.wxy.Poi;
import lombok.extern.log4j.Log4j2;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Iterator;
/**
* @Author: wxy
* @Date: 2023/12/04 16:21
* @Description: poi导入测试类
*/
@Log4j2
public class PoiImportDemo {
public static void main(String[] args) {
long start = System.currentTimeMillis();
try (FileInputStream inputStream = new FileInputStream("D:\\demo.xlsx"); HSSFWorkbook workbook = new HSSFWorkbook(inputStream)) {
// 创建一个用于保存Excel数据的list
ArrayList<Person> list = new ArrayList<>();
// 从工作簿中得到工作表
HSSFSheet sheet = workbook.getSheet("人员名单");
// 创建工作表的迭代器
Iterator<Row> iterator = sheet.iterator();
// 跳过表头
if (iterator.hasNext()) {
iterator.next();
}
// 循环拿出Excel中的每一行单元格的数据保存并存入进list中
while (iterator.hasNext()) {
Row row = iterator.next();
list.add(Person.of(null, row.getCell(0).getStringCellValue(), row.getCell(1).getStringCellValue(), (int) row.getCell(2).getNumericCellValue(), row.getCell(3).getNumericCellValue()));
}
// 打印出list中的数据
list.forEach(System.out::println);
long end = System.currentTimeMillis();
log.info("导入方法执行完毕,当前方法消耗的时间为: " + (end - start) + "ms");
} catch (Exception e) {
log.error("当前方法出现异常,异常为" + e, e);
}
}
}