最近做项目遇到了excel表格数据解析并将数据存入数据库的需求,这里就简单记录一下通过excel文件的路径,将数据解析出来的一个小demo案例。
一、引入poi依赖,借助poi可以将xls、xlsx格式的excel数据进行解析。
<!--读取 xls 和 xlsx 格式的Excel表格的依赖poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
二、具体代码
package org.jeecg.modules.dataset.controller;
import jdk.management.resource.internal.inst.SocketOutputStreamRMHooks;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class Test4 {
public static void main(String[] args) {
try {
String path = "E:\\数据集资料\\飞机作业信息-1\\云南飞机20230602.xlsx";
// 获取文件输入流
InputStream inputStream = new FileInputStream(path);
// 截取路径名 . 后面的后缀名,判断是xls还是xlsx
// 如果这个判断不对,就把equals换成 equalsIgnoreCase()
int index = path.lastIndexOf(".");
//获取后缀
String suf = path.substring(index + 1);
//去掉字符串两端空格
suf = suf.trim();
if (suf.equalsIgnoreCase("xls")) {
HSSFWorkbook workbook2 = new HSSFWorkbook(inputStream);
// 获取第一张表
Sheet sheet = workbook2.getSheetAt(0);
XlsData(sheet);
}
if (suf.equalsIgnoreCase("xlsx")) {
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
XlsxData(xssfWorkbook);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void XlsData(Sheet sheet) {
// sheet.getPhysicalNumberOfRows()获取总的行数
// 循环读取每一行
for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {
// 循环读取每一行
Row row = sheet.getRow(i);
// row.getPhysicalNumberOfCells()获取总的列数
for (int index = 0; index < row.getPhysicalNumberOfCells(); index++) {
// 获取数据,但是我们获取的cell类型
//代码上的内容自己根据实际需要自己调整就可以,这里只是展示一个样式···~
Cell cell = row.getCell(index);
System.out.println("cell:" + cell);
// 转换为字符串类型
//cell.setCellType(CellType.STRING);
//获取值
cell.getStringCellValue();
}
}
}
private static void XlsxData(XSSFWorkbook xssfWorkbook) {
//获取工作簿下sheet的个数
//int sheetNum = xssfWorkbook.getNumberOfSheets();
//System.out.println("该excel文件中总共有:"+sheetNum+"个sheet");
//遍历工作簿中的所有数据
//for(int i = 0;i<sheetNum;i++) {
//读取第i个工作表
//System.out.println("读取第"+(i+1)+"个sheet");
//XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
//获取第一个工作簿
XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
//获取最后一行的num,即总行数。此处从0开始
int maxRow = sheet.getLastRowNum();
List<String> list = new ArrayList<>();
for (int row = 1; row <= maxRow; row++) {
//获取最后单元格num,即总单元格数 ***注意:此处从1开始计数***
int maxRol = sheet.getRow(row).getLastCellNum();
System.out.println("--------第" + row + "行的数据如下--------");
String cell = "";
for (int rol = 0; rol < maxRol; rol++) {
System.out.print(sheet.getRow(row).getCell(rol) + " ");
cell += sheet.getRow(row).getCell(rol) + " ";
}
list.add(cell);
System.out.println();
}
System.out.println(list);
System.out.println("=================================");
for (String s : list) {
System.out.println(s);
}
//}
}
}
上面的代码可以优化的地方很多,我这里就赖得优化了,具体的使用场景和代码优化可以根据自己业务需求来进行代码重构。我这里只是简单记录一下,方便后面需要的时候拿来用。
三、数据解析的效果如图:
至于数据解析后,将数据存到数据库中的操作,那就是根据实际需求,建立实体类,遍历得到每一个列的值,然后进行 insert 操作就可以了。