Java读取excel指定行列的数据(poi的方式)

一、前言

JAVA中的POI是一个由Apache提供的jar包,用于支持处理Excel、Word、PPT等文件。它是一套用Java编写的免费开源的跨平台的 Java API;用于给Java程序,访问微软格式文档Microsoft Office,读和写的功能的Java API。

二、业务需求背景

项目需要读取excel中部分行列的内容(可以延申为读取一个excel中的内容,并且这个excel中的行数和列数是动态变化的)。然后把读到的内容转化为Json格式的数据。
在这里插入图片描述
这是excel文件内容,要将这个文件中的内容读出并转化 为json格式的数据:(这里只是列举部分数据,Json格式已经体现了)

'p10':
	'3': 0.75
	'4': 0.428
	'6': 0.289
	'8': 0.22
	'10': 0.191
	'12': 0.158
	'14': 0.14
	'16': 0.125
	'18': 0.121
	'20': 0.113
'p20':
	'3': 0.652
	'4': 0.412
	'6': 0.267
	'8': 0.179
	'10': 0.141
	'12': 0.138
	'14': 0.116
	'16': 0.109
	'18': 0.12
	'20': 0.122

三、解决思路

  1. 把每个单元格当作一个对象,这个对象中包含横坐标,纵坐标,单元格中的数据值。
  2. 找出表头行(也就是第二行,因为第一行中的数据用不到,所以不需要读取,笔者的需求是这样的)。
  3. 找出表头列(也就是第一列)。
  4. 按照要求的格式拼接数据(要求的格式比如说是json或者其他格式进行拼接)。

四、实现方案

1.引入pom

<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>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>

2.按照解决思路2、3、4进行代码的编写

  		//获取文件路径
        String filePath = "D:\\TI.xls";
        File file = new File(filePath);
        //获取文件后缀
        String finishFile = filePath.substring(turbulenceCurveFile.lastIndexOf(".") + 1);
        InputStream inputStream = new FileInputStream(file);
        //这里需要注意XSSFWorkbook能够处理xlsx的文件
        //而HSSFWorkbook能够处理xls的文件,不然会报错,这样写是为了更好的兼容处理两种格式
        Workbook workbook;
        if ("xlsx".equals(finishFile)) {
    
    
            workbook = new XSSFWorkbook(inputStream);
        } else {
    
    
            workbook = new HSSFWorkbook(inputStream);
        }
        //这里是读取第几个sheet
        Sheet sheet = workbook.getSheetAt(0);
        //这里是读取总行数
        int rows = sheet.getPhysicalNumberOfRows();
        List<CoordinateVO> allList = new ArrayList<>();
        //1.找到所有的元素对象,然后用list存放
        for (int i = 1; i < rows; i++) {
    
    
            Row row = sheet.getRow(i);//获取每一行
            int columns = 0;
            if (1 == i) {
    
    
                //获取每一行的最后一列的列号,即总列数,这里需要注意一下,
                //这种方法读取第一行的列数的时候会多读取一列,所以这里要减1
                columns = row.getLastCellNum() - 1;
            } else {
    
    
                columns = row.getLastCellNum();
            }
            for (int j = 0; j < columns; j++) {
    
    
                //获取每个单元格
                Cell cell = row.getCell(j);
                //设置单元格类型
                cell.setCellType(CellType.STRING);
                //获取单元格数据
                String cellValue = cell.getStringCellValue();
                CoordinateVO coordinateVO = new CoordinateVO();
                coordinateVO.setCoordinateX(i);
                coordinateVO.setCoordinateY(j);
                coordinateVO.setDataValue(cellValue);
                allList.add(coordinateVO);
            }
        }
        //至此,所有的数据都已经获取完了,并且都存放在allList这个集合当中去了
        //接下来就是自己去拼接数据格式了,相信各位大佬这里应该没有问题,以下代码就不贴了

3.补充贴一下代码中的实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CoordinateVO {
    
    
    /**
     * excel中的横坐标
     */
    private Integer coordinateX;
    /**
     * excel中的纵坐标
     */
    private Integer coordinateY;
    /**
     * excel中的每个单元格的数据值
     */
    private String dataValue;
}

4.代码中关键点的说明

操作Excel包括对象Workbook(工作簿),Sheet(工作表) ,Cell(单元格)。一个Excel就对应一Workbook对象,一个Workbook可以有多个Sheet对象,一个Sheet对象可以有多个Cell对象。

说明:本文是通过poi的方式对excel进行操作,如果想通过jxl的方式对excel进行操作的话,可以点击链接:java使用jxl读取execl中的数据

备注:本文为作者原创作品,有什么不正确的地方希望各位大神能指出不当之处,笔者当虚心受教。不喜勿喷。(转载请说明出处)谢谢!

猜你喜欢

转载自blog.csdn.net/qq_41774102/article/details/127445159
今日推荐