01- 概述
在应用程序的开发过程中,经常需要使用Excel文件来进行数据的导入或到出。所以,在通过java语言实现此类需求的时候,往往面临着Excel文件的解析(导入)或生成(导出)。
而Excel文件有大有小,在处理Excel文件时,我们有不同的处理方法。
02-XSSF解析Excel文件
Apache POI 提供给Java程序对Microsoft Office格式档案进行读写功能的API开源类库。XSSF就是其中的一种。
**一、添加Jar包依赖**
Workbook接口代表一个Excel文件,用于加载和创建Excel文件。常用的实现类是XSSFWorkbook。
读操作
创建Excel文件
//解析一个excel对象
//通过输入流,读取excel文件
FileInputStream in = new FileInputStream("E:\\QQ\\2646121219\\FileRecv\\16.xlsx");
//将输入流传入Workbook
Workbook workbook = new XSSFWorkbook(in);
获取工作簿数量
//sheet:工作簿
//获取工作部数量
int sheetNumber = workbook.getNumberOfSheets();
System.out.println("工作簿数量"+sheetNumber);
按照名称获取工作簿
//按照名称获取工作簿
Sheet sheet0 = workbook.getSheet("Sheet0");
Sheet sheet1 = workbook.getSheetAt(1);
System.out.println("工作簿1中的数据行"+sheet0.getLastRowNum());
System.out.println("工作簿2中的数据行"+sheet1.getLastRowNum());
写操作
创建工作簿
Sheet sheet0 = workbook.createSheet("2022");
Sheet sheet1 = workbook.createSheet("2021");
Sheet sheet2 = workbook.createSheet("2020");
创建行
Row row = sheet0.createRow(0);
创建单元格
Cell cell0 = row.createCell(1);
往单元格里添加值
cell0.setCellValue(UUID.randomUUID().toString());
Cell cell1 = row.createCell(2);
cell1.setCellValue(LocalDateTime.now());
Cell cell2 = row.createCell(3);
cell2.setCellValue(Math.random()*10);
03-超大Excel文件的读写
使用POI写入
使用SXSSFWorkbook进行写入,通过设置SXXFWorkbook的构造参数,可以设置每次在内存中保持的行数,当达到这个值的时候,那么会把这些数据flush到磁盘上,这样就会出现内存不够的情况。
try (Workbook workbook = new SXSSFWorkbook(100);
FileOutputStream fos = new FileOutputStream("c:\\test\\temp.xlsx")) {
Sheet sheet1 = workbook.createSheet();
for (int i = 0; i <= 1000000; i++) {
Row row = sheet1.createRow(i);
Cell cell0 = row.createCell(0);
cell0.setCellValue(UUID.randomUUID().toString());
Cell cell1 = row.createCell(1);
cell1.setCellValue(new Date());
}
workbook.write(fos);
} catch (IOException e) {
e.printStackTrace();
}
使用EasyExcel
1.下载相关alibaba easyexcel相关的jar包。
写入数据
public class Demo {
public static void main(String[] args) {
// 写入100w
EasyExcel.write("c:\\test\\run\\easy.xlsx", Order.class)
.sheet("订单列表")
.doWrite(data());
}
// 创建100w条订单数据
private static List<Order> data() {
List<Order> list = new ArrayList<Order>();
for (int i = 0; i < 1000000; i++) {
list.add(new Order());
}
return list;
}
}
读取数据
EasyExcel.read(“c:\test\run\easy.xlsx”, Order.class,new AnalysisEventListener() {
@Override
public void invoke(Order order, AnalysisContext arg1) {
// 读取每条数据
orderList.add(order);
}
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
// 读取到列头
System.out.println(headMap);
}
@Override
public void doAfterAllAnalysed(AnalysisContext arg0) {
// 读取完毕
System.out.println("END");
}
}).sheet().doRead();
总结
在解析一般文件时用到的是poi解析,而解析超大Excel文件时用到的就是EasyExcel解析。