文章目录
一、前言
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
三、解决思路
- 把每个单元格当作一个对象,这个对象中包含横坐标,纵坐标,单元格中的数据值。
- 找出表头行(也就是第二行,因为第一行中的数据用不到,所以不需要读取,笔者的需求是这样的)。
- 找出表头列(也就是第一列)。
- 按照要求的格式拼接数据(要求的格式比如说是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@NoArgsConstructorpublic class CoordinateVO { private Integer coordinateX; private Integer coordinateY; private String dataValue;}
4.代码中关键点的说明
操作Excel包括对象Workbook(工作簿),Sheet(工作表) ,Cell(单元格)。一个Excel就对应一Workbook对象,一个Workbook可以有多个Sheet对象,一个Sheet对象可以有多个Cell对象。
说明:本文是通过poi的方式对excel进行操作,如果想通过jxl的方式对excel进行操作的话,可以点击链接:java使用jxl读取execl中的数据
备注:本文为作者原创作品,有什么不正确的地方希望各位大神能指出不当之处,笔者当虚心受教。不喜勿喷。(转载请说明出处)谢谢!
来源地址:https://blog.csdn.net/qq_41774102/article/details/127445159