工具:Java解析Excel文件获取数据

394 阅读2分钟

这是我参与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中的代码可能有些实体类中的代码没有展示,会造成一些错误,但是上面本地测试是可以直接使用的

好用记得点赞!!!