文章目录
前言
这是一种读取excel文件数据以集合的事项来实现数据三级联动的一种实例,使用到的技术稳定,算法简单,但是可靠。期间穿插了一种以parentId来实现三级数据联动的方法,在这里也做了说明。做了这些,前端需要什么样的数据,就返回什么数据,分分钟的事情
提示:以下是本篇文章正文内容,下面案例可供参考
一、级联的示例数据
示例数据我们选取职业数据,比如:金融-投融资-投资顾问,这种三级的数据结构,当然,最简单的三级数据示例大家也可以选择省市区之类的,更直观。这里仅作示例说明,不做其他只用,各路大神定有更好的办法。
引入的依赖包:
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
大概就是这些依赖包,其他的也没啥了,根据环境的不同,大家调整
二、步骤
1.读取excel文件
excel文件里面有表,行,列数据,要分别读取。
frontDo方法先读取文件:
private Workbook frontDo(String excelPath) throws IOException, InvalidFormatException {
File excel = new File(excelPath);//excelPath是文件所在的路径
Workbook wb = null;
if (excel.isFile() && excel.exists()) {
String[] split = excel.getName().split("\\."); //.是特殊字符,需要转义!!!!!
//根据文件后缀(xls/xlsx)进行判断,但是自己的office一定是要激活的,打开的时候不能自动弹出窗口
if ("xls".equals(split[1])) {
FileInputStream fis = new FileInputStream(excel); //文件流对象
wb = new HSSFWorkbook(fis);
} else if ("xlsx".equals(split[1])) {
wb = new XSSFWorkbook(excel);
} else {
System.out.println("文件类型错误!");
}
}
return wb;
}
2.读取文件内数据表
readSheet方法代码如下:
private List<Sheet> readSheet(String url) throws IOException, InvalidFormatException {
Workbook wb = frontDo(url);
int sheetSize = wb.getNumberOfSheets();
List<Sheet> sheets = new ArrayList<Sheet>();
for (int i = 0; i < sheetSize; i++) {
Sheet sheet = wb.getSheetAt(i);
sheets.add(sheet);
}
return sheets;
}
3.读取数据表内的行并把行数据序列化到一个关于行的entity:RowEntity
RowEntity的代码如下:
package data.dictionary.plateform.core.occupation;
import lombok.Data;
@Data
public class RowEntity {
private String first; //每行的第一列数据
private String second;//每行的第二列数据
private String third;//每行的第三列数据
}
buildEntity读取每行方法:
private List<RowEntity> buildEntity(String path) throws IOException, InvalidFormatException {
//"C:\\Users\\yongc\\Desktop\\data\\19.xlsx";
List<RowEntity> rowEpntitys = new ArrayList<>();
List<Sheet> sheets = readSheet(path);
int firstRowIndex = sheets.get(0).getFirstRowNum();
int lastRowIndex = sheets.get(0).getLastRowNum();
System.out.println(firstRowIndex);
System.out.println(lastRowIndex);
System.out.println();
for (int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) {
//遍历行
Row row = sheets.get(0).getRow(rIndex);
RowEntity rowEntity = new RowEntity();
rowEntity.setFirst(row.getCell(0).toString());
rowEntity.setSecond(row.getCell(1).toString());
rowEntity.setThird(row.getCell(2).toString());
rowEpntitys.add(rowEntity);
}
return rowEpntitys;
}
到此,excel表的所有数据都序列化到一个list中了。
4.一级数据序列化:DataEntity
DataEntity类:
这个类也是建表的结构,数据库中这些数据是要入库的。
package data.dictionary.plateform.core.occupation;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName(value = "t_data_occupation",resultMap = "BaseResultMap")
public class DataEntity {
@TableId(value = "id",type = IdType.AUTO)
private int id;
private String dataName;
private int dataLeft;
private int dataRight