这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战
因为一个小小的练手项目,涉及到了这方面,然后在网上查阅了大量的资料,然后发现并没有我想要的,目前网上检索的资料几乎全是抄袭,那个千篇一律的代码,都不管你能不能运行就网上搬,经过我不断地尝试,终于集百家于大成,给大家搞一个可用的工具类
首先要导入我们的依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-examples</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.7</version>
</dependency>
就是这么多,如果之前有人搜资料,肯定会发现晚上好多就几个依赖,而且也不好使,因为我们的Excel现在是两个版本的.xlsx和.xls ,很多资料都是老版本的,Workbook 都用不了,我之前找的好多都是这样的
之后在是我们的测试代码,这个代码是我的测试代码,用来跑本地的
@Test
public void FileDemo() throws IOException {
//.xlsx文件结尾使用XSSFWorkbook创建;.xls结尾的使用HSSFWorkbook创建
XSSFWorkbook workbook=new XSSFWorkbook(new FileInputStream("D://zhuomian/oj.xlsx"));
//这个是用来获取我们的sheel页面的,不明白的看图一
XSSFSheet sheet = workbook.getSheetAt(0);
//用来获取我们的行数
XSSFRow row = sheet.getRow(1);
//通过我们的行数在去获取我们的列,确定到我们指定的单元格
XSSFCell cell = row.getCell(2);
//创建list集合来存储我们的内容
List list=new ArrayList();
//根据我们单元格中存储的元素类型,只用相应的获取方式。详见图二
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
list.add(cell.getRichStringCellValue().getString());
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
list.add(cell.getDateCellValue());
} else {
list.add(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
list.add(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
list.add(cell.getCellFormula());
break;
default:
list.add("");
}
System.out.println(list);
}
图一
图二
上面我们本地弄完了,那web呢?
Controller层
@PostMapping("/importSubject")
public void importSubject(@RequestPart("file") MultipartFile file) throws IOException {
boolean b = subjectService.importSubject(file);
}
Service层
@Service
public class SubjectServiceImpl implements SubjectService {
@Override
public boolean importSubject(MultipartFile file) throws IOException {
ExcelAnalysis.analysisFile(file);
return true;
}
}
文件工具
public class ExcelAnalysis {
public static Subject[] analysisFile(MultipartFile file) throws IOException {
//定义一个题目变量
Subject[] subjects=null;
//获取文件后缀
String originalFilename = file.getOriginalFilename();
//获取输入流
InputStream inputStream = file.getInputStream();
Workbook workbook=null;
//根据文件类型创建相应的workbook
if(originalFilename.endsWith("xls")){
workbook = new HSSFWorkbook(inputStream);
}else if (originalFilename.endsWith("xlsx")){
workbook = new XSSFWorkbook(inputStream);
}
//获取文件中单元页
for (int i=0;i<workbook.getNumberOfSheets();i++){
//获取文件中单元页
Sheet sheet = workbook.getSheetAt(i);
//获取文件横向数据条数
int number = sheet.getPhysicalNumberOfRows()-1;
//每条数据都创建一个新的subject对象用来储存
subjects=new Subject[number];
for (int j=1; j<=number;j++){
subjects[j-1]=new Subject();
Row row = sheet.getRow(j);
if(row != null){
for (int k=1;k<9;k++){
Cell cell = row.getCell(k);
if(cell!=null){
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
list.add(cell.getRichStringCellValue().getString());
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
list.add(cell.getDateCellValue());
} else {
list.add(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
list.add(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
list.add(cell.getCellFormula());
break;
default:
list.add("");
}
}
}
}
}
}
}
return subjects;
}
}
因为是demo中的代码可能有些实体类中的代码没有展示,会造成一些错误,但是上面本地测试是可以直接使用的
好用记得点赞!!!