【技术文章】POI操作Excel表格(读、写)

152人浏览 / 0人评论 / 2021-10-15 14:12:00.0发布

【技术文章】POI操作Excel表格(读、写)

 

因为项目要进行测试,领导给了我两万条数据在excel表格中,让我跑接口。然后将跑出来的结果写进表格。在此记录一下poi操作excel的代码。

 

  1. 首先就是Maven管理的项目在pom文件中引入poi。

我的版本可能不适用所有人,大家可以去Maven的官方仓库自己搜索,https://mvnrepository.com,搜索poi就可以。

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>

      2. 引入之后,就可以开始敲代码了。

    public void operationExcel(@RequestParam("file") MultipartFile file) {
        Workbook workbook = null;
        try {
            String fileName = file.getOriginalFilename();
            InputStream inputStream = file.getInputStream();
            //这里需要注意,poi的老版本是不支持xlsx文件格式的
            if (fileName.endsWith("xlsx")) {
                workbook = new XSSFWorkbook(inputStream);
            } else if (fileName.endsWith("xls")) {
                workbook = new HSSFWorkbook(inputStream);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 获取第一张表
        Sheet sheet = workbook.getSheetAt(0);
        //获取表格的第一列为数据的key
        Row keyRow = sheet.getRow(0);
        //将获取出来的数据放在list中
        List<Map> paramList = new ArrayList<>();
        // 获取每行中的字段
        for (int i = 0; i < sheet.getLastRowNum(); i++) {
            Row row = sheet.getRow(i + 1); // 获取行,这里 +1 是因为计算表格开始也是从0行开始,但是0行是这一列的参数名。
            Map map = new HashMap<>();
            for (int col = 0; col < row.getLastCellNum(); col++) {
                DataFormatter formatter = new DataFormatter();
                map.put(formatter.formatCellValue(keyRow.getCell(col)), formatter.formatCellValue(row.getCell(col)));
            }
            paramList.add(map);
        }
        //用于存放结果
        List<Map> resList = new ArrayList<>();
        //具体调用项目内的逻辑代码就不上了
        ...
        //在获取到结果后 (放在了resList中)
        //因为要将结果写进excel,所以加一列
        Cell keyRowCell1 = keyRow.createCell(keyRow.getLastCellNum());
        keyRowCell1.setCellValue("结果");
        //再次循环表格数据,将结果一一放到对应的行
        for (int i = 0; i < sheet.getLastRowNum(); i++) {
            Row row = sheet.getRow(i + 1);
            Cell cell1 = row.createCell(row.getLastCellNum() + 1);
            cell1.setCellValue((String) resList.get(i).get("结果"));
        }
        //最后就是将新的excel文件输出
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(file.getOriginalFilename());
            workbook.write(out);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

这就是具体操作excel的代码。

    3. poi方法讲解

方法归属方法名称解释具体引用
WorkbookgetSheetAt(int var1)根据sheet的下标(从0开始),获取sheet表Sheet sheet = workbook.getSheetAt(0);
SheetgetLastRowNum()获取当前工作表的最后一行的行号(有内容的行)int rowNum = sheet.getLastRowNum();
SheetgetRow(int var1)根据下标获取具体的行Row row = sheet.getRow(i);
RowgetLastCellNum()获取当前工作表的最后一列的列号int cellNum = row.getLastCellNum();
RowcreateCell(int var1)在对应的位置右侧加一列Cell keyRowCell = keyRow.createCell(keyRow.getLastCellNum());
CellsetCellValue(Object o)值可以为String、int等keyRowCell1.setCellValue(Object o);

 

 

好了,这就是poi操作excel,有不对的地方感谢大家指正!

全部评论