excel主要有四个类:
Workbook.class(整个Excel文件)、
Sheet.class(Excel文件中的每个页)、
Row.class(页的行)、
Cell.class(行的每个单元格)
它们的层次:
由Workbook类对象(如名为workBook)获得/创建Sheet类对象(如名为sheet),
再由Sheet类对象获得/创建Row类对象(如名为row),
由Row类对象获得/创建Cell类对象(如名为cell)
常用的方法如下:
1. Workbook.class
获得sheet
getSheet(String str) //str:sheet名
getSheetAt(int i) //i:sheet所在页数的索引值
创建 sheet
createSheet() //创建默认名的sheet
createSheet(String str) //str:sheet名
得到workBook中的sheet数
getNumberOfSheets()
2. Sheet.class
获得row
getRow(int i) //i:要获取的行的索引值
创建row
createRow(int i) //i:要创建的行的索引值
得到页中的行数
getLastRowNum()
3. Row.class
获得cell
getCell(int i) //i:要获得的单元格的列的索引值
创建cell
createCell(int i) //i:创建的单元格的列的索引值
得到行的单元格的数量
getLastCellNum()
4. Cell.class
获得单元格的值的类型
cell0.getCellType(); //获得单元格中值的类型
cell0.getNumericCellValue(); //获得Numeric类型的值
cell0.getStringCellValue(); //获得String类型的值
创建单元格的值
cell0.setCellValue(T);
如图可以看到方法setCellValue()的参数有不同类型,可以给cell中创建对应类型的值
!!!此外有一种给单元格的值创建特定格式的方法
其中每种格式都有对应的码值,我们在添加格式时需要先获取格式对应的码值
例如:
cell单元格中的内容是日期,要创建"YYYY年MM月dd HH:mm:ss"的格式
代码如下
DataFormat dataFormat=workBook.createDataFormat();
//获得"YYYY年MM月dd HH:mm:ss"的格式对应的码值
short dataFormatCode=dataFormat.getFormat("YYYY年MM月dd HH:mm:ss");
//dataCellStyle数据格式
CellStyle dataCellStyle=workBook.createCellStyle();
dataCellStyle.setDataFormat(dataFormatCode);
Cell cell2=row.createCell(0);
cell2.setCellStyle(dataCellStyle);
cell2.setCellValue(new Date());
关于Excel的操作分为解析和写入
(1)解析Excel文件
需要通过输入流,并将输入流传入Workbook,再逐层次获取,直到获取到cell单元格的值
代码如下:
//解析一个excel文件
//通过输入流,读取excel文件
FileInputStream in=new FileInputStream("D:\\Text\\1627356552686.xlsx");
//将输入流传入Workbook
Workbook workBook=new XSSFWorkbook(in);
//sheet:工作簿
//获取工作簿数量
int sheetNum=workBook.getNumberOfSheets();
//按照名称获取工作簿
Sheet sheet0=workBook.getSheet("sheet0");
//按照工作簿位置获取工作簿
Sheet sheet1=workBook.getSheetAt(1);
//获取工作簿最后一行
Row row=sheet0.getRow(sheet0.getLastRowNum());
//获得最后一行的第一个单元格
Cell cell=row.getCell(0);
//在不知道单元格的值的类型的情况下,需要通过判断类型才能知道用哪种方法来获取
CellType cellType=cell.getCellType();
switch(cellType) {
case STRING:
String cellVal=cell.getStringCellValue();
System.out.println(cellVal);
break;
case NUMERIC:
double cellNum=cell.getNumericCellValue();
System.out.println(cellNum);
break;
}
(2)创建Excel
需要通过输出流,在创建完Workbook对象后,将Workbook对象中包含的数据,通过输出流,传入到Excel文件
代码如下:
public class Text04 {
public static void main(String[] args) {
try (Workbook workBook = new XSSFWorkbook();
FileOutputStream out = new FileOutputStream("D:\\Text\\Test03.xlsx")) {
//创建3个sheet
Sheet sheet0=workBook.createSheet("2022年度报表");
Sheet sheet1=workBook.createSheet("2021年度报表");
Sheet sheet2=workBook.createSheet("2020年度报表");
//在sheet0中创建数据行row
Row row=sheet0.createRow(0);
//创建单元格
Cell cell=row.createCell(1);
cell.setCellValue(Math.random()*1000);//cell单元格中放置随机数
//将Workbook对象中包含的数据,通过输出流,传入到Excel文件
workBook.write(out);
} catch (IOException e) {
e.printStackTrace();
}
}
}
此外可以看到创建Workbook对象时,用的是Workbook workBook = new XSSFWorkbook()方法,XSSFWorkbook与HSSFWorkbook不同的是XSSFWorkbook操作的是新版本的Excel,
HSSFWorkbook操作的是旧版本的Excel,我们使用XSSFWorkbook
Excel的新版本和旧版本可存储的容量不同,新版本可存储上万条数据
此外,easyExcel以及poi的SXSSFWorkbook类可以实现对于大量数据的Excel读写,
poi和easyExcel的数据处理能力对比
结构 | 支持Excael版本 | 读写行数 | 读写速度 | 格式 | 内存占用 | |||
HSSF | excel2003版本 | <=65536行 | 快 | 高 | ||||
XSSF | excel3007版本 | >=65536行 | 慢 | microsoft excel ooxml | 高 | |||
SXSSF | excel2007版本 | >=65536行 | 介于XSSF和SXSSF之间 | microsoft excel ooxml | 比较高 | |||
easyExcel | 内存占用 | 读写速度 | 读写行数 | |||||
2.0.0以上版本 | 比较低 | 非常快 | >65536 |
上手难易程度 |
SXSSFWorkbook 比较难(需要对源码有所研究需要写workbook),使用完必须手动关闭流 |
easyExcel 简单只需要提供数据和模板,不需要关闭流 |
使用SXSSFWorkbook类处理数据的代码与使用XSSFWorkbook类处理数据的代码编写方法一致,easyExcel的使用需要准备相关的实体类和数据等
打开任务管理器我们可以看到代码运行时的cpu和内存占用情况
这是使用easyExcel的情况:
这是使用SXSSFWorkbook的情况:
可见用这两种方法来创建含有大量数据的Excel是很快的。