一、引言
在使用java开发应用程序的时候,经常会解析Excel文件,进行数据的写入(导入)与读取(导出)操作,在java中自带的jar包中并没有提供完成此项需求的类库,所以我们需要通过第三方的jar包导入来实现这类需求。
在我们常见的第三方jar包有Apache Poi , Alibaba EasyExcel,JXL,Apache Poi是第三方的免费跨平台开源用java编写的提供给office Excel数据操作的类库,本篇博客使用Poi对Excel文件进行操作。
在POI中提供了Excel文件的两种实现类 ,HSSFWrorBook和XSSFWorkBook,前者适用于Excel文件的老版本,后缀名为“.xls”,而后者适用于后缀名为“.xlsx”。
二、Excel文件的结构
WorkBook:Excel文件
Sheet:工作簿对象
Row:数据行
Cell:单元格
三、Excel文件的解析
创建一个WookBook类的实例化对象,与此同时创建输入流对文件进行文件的读取,按照文件的结构逐层读取。
//方式1
try (Workbook workbook = new XSSFWorkbook();
FileInputStream in = new FileInputStream("D:\\test\\1627356552686.xlsx")) {
} catch (IOException e) {
e.printStackTrace();
}
try (//方式2 通过匿名子类
Workbook workbook1 = new XSSFWorkbook(new FileInputStream("D:\\test\\1627356552686.xlsx"))) {
} catch (IOException e) {
e.printStackTrace();
}
1.先获取文件的工作簿(Sheet):
//获取Sheet的两种方式
//根据名称获取
Sheet sheet = workbook.getSheet("yyyy");
//根据下标获取第一个工作簿
Sheet sheet = workbook.getSheetAt(0);
2.获取当前工作簿中的数据行:
我们可以通过foreach循环和for循环遍历,foreach可以遍历所有行,for循环可以遍历部分行
//遍历所有行
for(Row row : sheet) {
System.out.println(row);
}
//遍历部分行
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
System.out.println(row);
}
3.获取当前行的每个单元格
Cell cell = row.getCell(0); //得到第一个单元格
cell.getNumericCellValue() //得到第一个单元格的内容
也可以使用foreach进行单元格的遍历
for(Cell cell : row) {
}
4.设置单元格的格式
使用DataFormat创建单元格的格式,获取格式编码,然后创建CellStyle单元格格式的对象。
//创建单元格格式
DataFormat dataFormat = workbook.createDataFormat();
//获取格式编码
Short formatCode = dataFormat.getFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("单元格格式编码:" + formatCode);
//创建CellStyle单元格格式对象
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(formatCode);
cell3.setCellStyle(cellStyle); //设置单元格格式
cell3.setCellValue(new Date()); //设置日期 = LocalDateTime.now()
四、Excel文件的写入
1.写入操作时,先创建WorkBook对象,伴随着输出流FileOutputStream的使用,用来决定写入到哪一个文件路径。
2.通过WorkBook来创建工作簿(Sheet)对象
Sheet sheet1 = workbook.createSheet();
//也可以自定义工作簿名称
Sheet sheet2 = workbook.createSheet("y");
3.创建数据行
Row row = sheet.createRow(0); //创建当前工作簿的第一行
4.创建单元格并且写入内容
Cell cell = row.createCell(0); //创建第一个单元格
//设置当前单元格的格式
cell.setCellValue(UUID.randomUUID().toString());
5.设置单元格格式
// 创建单元格样式
DataFormat dataFormat = workbook.createDataFormat();
Short formatCode = dataFormat.getFormat("yyyy-MM-dd HH:mm:ss");
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(formatCode);
// 为当前行创建单元格
Cell cell1 = row.createCell(1);
cell1.setCellStyle(cellStyle); // 设置单元格样式
cell1.setCellValue(new Date()); // 保存当前日期时间至本单元格
//设置单元格的水平对齐类型。 此时水平居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 设置单元格的垂直对齐类型。 此时垂直靠底边
cellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM);
6.通过输入流,写入excel文件
使用的是WorkBook对象的write!
workbook.write(out);