发布时间:2023-02-02 12:00
在应用程序的开发过程中,经常需要使用Excel文件来进行数据的导入或导出。所以,在通过Java语言实现此类需求的时候,往往会面临着Excel文件的解析(导入)或生出(导出)。
在Java技术生态圈中,可以进行Excel文件处理的主流技术包括:Apache POI,Alibaba EasyExcel等。
今天我们就来分别介绍一下这两种技术如何来进行解析文件和生成文件。
Apache POI 是一种免费开源的跨平台的Java API ,在Apache POI 中我们常用的解析文件的类有 HSSF 和 XSSF。
HSSF用于解析旧版本(*.xls) Excel文件,由于旧版本的Excel文件只能存在65535行数据,所前目前已经不常用。所以目前主要采用XSSF进行新版本(*xlsx)Excel文件的解析。
Workbook接口代表一个Excel文件,用于创建或者加载(解析)Excel文件。常见的实现类是XSSFWorkbook。
Sheet代表Excel表格中的一个工作簿,通过Workbook来进行Sheet对象的获取或创建。
Row代表Sheet工作簿中一行,通过Sheet来进行Row对象的获取和创建。
Cell代表一个数据行中的一个单元格,通过Row来进行Cell对象的获取和创建。
创建流程:
1,创建一个Workbook ,通过输出流写入Excel 文件
//输出流
FileOutputStream out = new FileOutputStream("c:\\test\\2022.xlsx");
//Excel文件对象
Workbook workbook = new XSSFWorkbook();
//通过输出流进行写入
workbook.write(out);
//关闭资源
2,通过Workbook创建一个工作簿Sheet
Sheet sheet = workbook.creatSheet();
3,通过Sheet创建一个工作行Row
Row row = sheet.createRow();
4,通过Row创建一个单元格Cell
//在row这行中创建第一个单元格
Cell cell = Row.createCell(0);
解析流程
1,创建一个Workbook ,通过输入流加载 (解析) Excel 文件
//输入流
FileInputStream in = new FileInputStream(c:\\test\\2022.xlsx);
//Excel文件对象
Workbook workbook = new XFFSWorkbook(in)
2,通过Workbook获取工作簿Sheet
//按照工作簿下标获取Sheet
Sheet sheet01 = workbook.getSheetAt(0);
//按照工作簿名称获取Sheet
Sheet sheet02 = workbook.getSheet("Sheet0");
3,通过Sheet获取行Row
//获取首行下标
int first = sheet.getFirstRowNum();
//获取尾行下标
int last = sheet.getLastRowNum();
//根据下标获取指定行
Row row = sheet.getRow(0);
4,通过Rowt获取单元格Cell
//根据下表获取单元格
Cell cell = row.getCell(1);
//获取单元格类型
CellType type = cell.getCellType();
//设置单元格样式
//创建格式编码值
DataFormat dataFormat = workbook.createDataFormat();
short dateFormatCode = dataFormat.getFormat("yyyy年MM月dd日 HH时mm分ss秒");
//创建日期格式对象
CellStyle dataCellStyle = workbook.createCellStyle();
dataCellStyle.setDataFormat(dateFormatCode);
//创建单元格,并未单元格设置格式
Cell cell = row.createCell(2);//日期
cell.setCellStyle(dataCellStyle);
cell.setCellValue(new Date());
部分代码实现如下
public class Demo {
public static void main(String[] args) {
try (FileOutputStream out = new FileOutputStream("C:\\POI\\data.xlsx");
Workbook workbook = new XSSFWorkbook()) {
//创建工作簿
Sheet sheet01 = workbook.createSheet("2020数据列表");
Sheet sheet02 = workbook.createSheet("2021数据列表");
Sheet sheet03 = workbook.createSheet("2022数据列表");
//创建行
Row row = sheet01.createRow(0);
//创建单元格
Cell cell0 = row.createCell(0);
cell0.setCellValue(UUID.randomUUID().toString());
Cell cell1 = row.createCell(1);
cell1.setCellValue(Math.random() * 10000);
Cell cell2 = row.createCell(2);
cell2.setCellValue(LocalDateTime.now());
//将workbook对象中包含的数据,通过输出流,写入至Excel文件
workbook.write(out);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
当我们需要读取或者写入一个超大Excel文件时,Apache POI技术已经无法快速的对文件进行读取和写入,此时我们需要使用Alibaba EasyExcel技术对文件进行操作,下来我们看一组两种技术对大文件进行读写的CPU和内存占用的对比图。
下面我们来看一下EasyExcel的部分代码实现
public class Demo {
public static void main(String[] args) {
long begin = System.currentTimeMillis();
// 写入100w
EasyExcel.write("E:\\easyExcel\\easy.xlsx", Order.class)
.sheet("订单列表")
.doWrite(data());
long end = System.currentTimeMillis();
System.out.println("共耗时" + (end - begin) + "毫秒");
}
// 创建100w条订单数据
private static List data() {
List list = new ArrayList();
for (int i = 0; i < 1000000; i++) {
list.add(new Order());
}
return list;
}
}
python网络爬虫从入门到精通吕云翔pdf_Python网络爬虫从入门到精通 吕云翔 张扬 韩延刚 等编著 PythonPython3.6网络爬虫爬虫JavaScript爬虫实战自学手册...
基于java springboot uniapp图书借阅系统源码(毕设)
SpringCloud Alibaba微服务第9章之Gateway
Flask:使用SocketIO实现WebSocket与前端Vue进行实时推送(gevent-websocket、flask-socketio、flask不出现running on 127..问题)
java cas登陆实例_Java CAS基本实现原理代码实例解析
【PyTorch】学习【深入浅出PyTorch | GitHub】