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

Posted ThiefOfTime

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中的数据

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

POI读取指定Excel中行与列的数据


import
org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.InputStream; public class PoiExcelTest public static XSSFWorkbook workbook; // 工作簿 public static XSSFSheet sheet; // 工作表 public static XSSFRow row; // public static XSSFCell cell; // public static void main(String[] args) throws Exception String fielName = "E:\\\\ExcelTest.xlsx"; String sheetName = "AI研发中心"; readExcelData(fielName,sheetName,2,1); readExcelData(fielName,sheetName,2,2); public static void readExcelData(String fielName,String sheetName,int rownum,int cellnum) throws Exception InputStream in = new FileInputStream(fielName); workbook = new XSSFWorkbook(in); sheet = workbook.getSheet(sheetName); row = sheet.getRow(rownum); cell = row.getCell(cellnum); switch (cell.getCellType()) case XSSFCell.CELL_TYPE_NUMERIC: System.out.println("第"+(rownum+1)+"行"+"第"+(cellnum+1)+"列的值: "+String.valueOf(cell.getNumericCellValue())); break; case XSSFCell.CELL_TYPE_STRING: System.out.println("第"+(rownum+1)+"行"+"第"+(cellnum+1)+"列的值: "+cell.getStringCellValue()); break; default: System.out.println("第"+(rownum+1)+"行"+"第"+(cellnum+1)+"列的值: "+cell.getStringCellValue()); break;

Excel数据:

技术图片

读取的数据:

技术图片

 

以上是关于Java读取excel指定行列的数据(poi的方式)的主要内容,如果未能解决你的问题,请参考以下文章

用javaPOI包的方法获取excel中的行列号

1. Java POI 读取写入Excel(包括样式)的工具类Utils

java中poi怎么获取指定列的行数?

javapoi数据导出成excel如何才能指定文件输出路径 现在是知道E盘路径 怎么弄成弹框选择路径

java将画面中输入的内容,写入到指定的Excel文件的指定的行列中(具体实例)

pandas读取excel的方式介绍行列元素访问以及读取数据后使用matplotlib画折线图