POI读取不同的数据类型

简介: POI读取不同的数据类型

首先准备一个多种数据类型的excel

image.png

里面有以下数据

image.png

获取全部表头信息

row.getPhysicalNumberOfCells(),获取全部的列并返回行数

获取全部表头数并且打印输出


package com.wyh.Test;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;
import javax.sql.RowSet;
import java.io.FileInputStream;
/**
 * @program: JavaExecl
 * @description: 读取不同的excel数据类型
 * @author: 魏一鹤
 * @createDate: 2021-12-16 23:42
 **/
public class ReadManyInfo {
//全局路径,供我们操作使用方便
    static String path="D:\\Tools\\JavaWorkSpace\\JavaExecl\\";
    @Test
public void BigDateExcelWrite07() throws Exception {
//需要读取,肯定需要流 所以这边我们创建流
        FileInputStream filterInputStream = new FileInputStream(path+"会员消费商品明细表.xls");
// 1 创建工作簿 使用excel可以完成的操作这边通过poi都可以完成
        //把我们的流放在工作簿用 用于读取excel数据
        Workbook workbook = new HSSFWorkbook(filterInputStream);
//2 获取工作表
        Sheet sheet = workbook.getSheetAt(0);
//3获取行(表头)
        Row rowTitle = sheet.getRow(0); //其实这就是我们的表头 最上面的部分
        //判断行不为空才读
        if(rowTitle!=null){
//如果行不为空才去读列的信息
            //getPhysicalNumberOfCells()获取全部的列并且返回行数
            int cellCount = rowTitle.getPhysicalNumberOfCells();
            System.out.println("cellCount = " + cellCount);
for (int cellNum = 0; cellNum<cellCount; cellNum++) {
//得到每一行的数据
                Cell cell = rowTitle.getCell(cellNum);
//判断每一行是否为空 不为空再做处理
                if(cell!=null){
//获取全部行的数据类型
                    int cellType = cell.getCellType();
//获取行的值
                    String stringCellValue = cell.getStringCellValue();
//进行输出 这里就不换行了 直接一行显示用竖线分割
                    System.out.print(stringCellValue+"|");
                }
            }
//打印完一行换行打印另外一行
            System.out.println();
        }
//关闭流
        filterInputStream.close();
    }
}


image.png

打印结果和我们的excel表头内容个数是完全对的上的

image.png

获取表中内容

row.getPhysicalNumberOfCells()获取全部的列

比较复杂的就是不同的数据类型进行判断,我们可以把这些提取成一个公用的方法


image.png


package com.wyh.Test;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import org.junit.Test;
import javax.sql.RowSet;
import java.io.FileInputStream;
import java.util.Date;
/**
 * @program: JavaExecl
 * @description: 读取不同的excel数据类型
 * @author: 魏一鹤
 * @createDate: 2021-12-16 23:42
 **/
public class ReadManyInfo {
//全局路径,供我们操作使用方便
    static String path="D:\\Tools\\JavaWorkSpace\\JavaExecl\\";
    @Test
public void BigDateExcelWrite07() throws Exception {
//需要读取,肯定需要流 所以这边我们创建流
        FileInputStream filterInputStream = new FileInputStream(path+"会员消费商品明细表.xls");
        switchDataType(filterInputStream);
    }
public void switchDataType( FileInputStream filterInputStream ) throws Exception {
// 1 创建工作簿 使用excel可以完成的操作这边通过poi都可以完成
        //把我们的流放在工作簿用 用于读取excel数据
        Workbook workbook = new HSSFWorkbook(filterInputStream);
//2 获取工作表
        Sheet sheet = workbook.getSheetAt(0);
//3获取行(表头)
        Row rowTitle = sheet.getRow(0); //其实这就是我们的表头 最上面的部分
        //判断行不为空才读
        if(rowTitle!=null){
//如果行不为空才去读列的信息
            //getPhysicalNumberOfCells()获取全部的列并且返回行数
            int cellCount = rowTitle.getPhysicalNumberOfCells();
            System.out.println("cellCount = " + cellCount);
for (int cellNum = 0; cellNum<cellCount; cellNum++) {
//得到每一行的数据
                Cell cell = rowTitle.getCell(cellNum);
//判断每一行是否为空 不为空再做处理
                if(cell!=null){
//获取全部行的数据类型
                    int cellType = cell.getCellType();
//获取行的值
                    String stringCellValue = cell.getStringCellValue();
//进行输出 这里就不换行了 直接一行显示用竖线分割
                    System.out.print(stringCellValue+"|");
                }
            }
//打印完一行换行打印另外一行
            System.out.println();
        }
//获取表中的内容
        int rowCount = sheet.getPhysicalNumberOfRows();
//循环获取数据
        for (int rowNum = 0; rowNum < rowCount; rowNum++) {
            Row row = sheet.getRow(rowNum);
//不为空再做处理
            if(row!=null){
//读取行中的列    getPhysicalNumberOfCells获取全部的列
                int cellCount = rowTitle.getPhysicalNumberOfCells();
for (int cellNum = 0; cellNum < cellCount; cellNum++) {
                    System.out.print("["+(rowNum+1)+"-"+(cellNum + 1)+"]");
//获取数据
                    Cell cell = row.getCell(cellNum);
//因为不知道列的数据类型 所以这里我们要匹配数据类型
                    //如果不为空
                    if(cell != null){
//获取类型
                        int cellType = cell.getCellType();
                        String cellValue="";
//判断cell的数据类型
                        switch (cellType) {
case HSSFCell.CELL_TYPE_STRING://字符串
                                System.out.print("【STRING】");
                                cellValue = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BOOLEAN://布尔
                                System.out.print("【BOOLEAN】");
                                cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_BLANK://空
                                System.out.print("【BLANK】");
break;
case HSSFCell.CELL_TYPE_NUMERIC:
                                System.out.print("【NUMERIC】");
//cellValue = String.valueOf(cell.getNumericCellValue());
                                if (HSSFDateUtil.isCellDateFormatted(cell)) {//日期
                                    System.out.print("【日期】");
                                    Date date = cell.getDateCellValue();
                                    cellValue = new DateTime(date).toString("yyyy-MM-dd");
                                } else {
// 不是日期格式,则防止当数字过长时以科学计数法显示
                                    System.out.print("【转换成字符串】");
                                    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                                    cellValue = cell.toString();
                                }
break;
case Cell.CELL_TYPE_ERROR:
                                System.out.print("【数据类型错误】");
break;
                        }
                        System.out.println(cellValue);
                    }
                }
            }
        }
//关闭流
        filterInputStream.close();
    }
}


package com.wyh.Test;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import org.junit.Test;
import javax.sql.RowSet;
import java.io.FileInputStream;
import java.util.Date;
/**
 * @program: JavaExecl
 * @description: 读取不同的excel数据类型
 * @author: 魏一鹤
 * @createDate: 2021-12-16 23:42
 **/
public class ReadManyInfo {
//全局路径,供我们操作使用方便
    static String path="D:\\Tools\\JavaWorkSpace\\JavaExecl\\";
    @Test
public void BigDateExcelWrite07() throws Exception {
//需要读取,肯定需要流 所以这边我们创建流
        FileInputStream filterInputStream = new FileInputStream(path+"会员消费商品明细表.xls");
        switchDataType(filterInputStream);
    }
public void switchDataType( FileInputStream filterInputStream ) throws Exception {
// 1 创建工作簿 使用excel可以完成的操作这边通过poi都可以完成
        //把我们的流放在工作簿用 用于读取excel数据
        Workbook workbook = new HSSFWorkbook(filterInputStream);
//2 获取工作表
        Sheet sheet = workbook.getSheetAt(0);
//3获取行(表头)
        Row rowTitle = sheet.getRow(0); //其实这就是我们的表头 最上面的部分
        //判断行不为空才读
        if(rowTitle!=null){
//如果行不为空才去读列的信息
            //getPhysicalNumberOfCells()获取全部的列并且返回行数
            int cellCount = rowTitle.getPhysicalNumberOfCells();
            System.out.println("cellCount = " + cellCount);
for (int cellNum = 0; cellNum<cellCount; cellNum++) {
//得到每一行的数据
                Cell cell = rowTitle.getCell(cellNum);
//判断每一行是否为空 不为空再做处理
                if(cell!=null){
//获取全部行的数据类型
                    int cellType = cell.getCellType();
//获取行的值
                    String stringCellValue = cell.getStringCellValue();
//进行输出 这里就不换行了 直接一行显示用竖线分割
                    System.out.print(stringCellValue+"|");
                }
            }
//打印完一行换行打印另外一行
            System.out.println();
        }
//获取表中的内容
        int rowCount = sheet.getPhysicalNumberOfRows();
//循环获取数据
        for (int rowNum = 0; rowNum < rowCount; rowNum++) {
            Row row = sheet.getRow(rowNum);
//不为空再做处理
            if(row!=null){
//读取行中的列    getPhysicalNumberOfCells获取全部的列
                int cellCount = rowTitle.getPhysicalNumberOfCells();
for (int cellNum = 0; cellNum < cellCount; cellNum++) {
                    System.out.print("["+(rowNum+1)+"-"+(cellNum + 1)+"]");
//获取数据
                    Cell cell = row.getCell(cellNum);
//因为不知道列的数据类型 所以这里我们要匹配数据类型
                    //如果不为空
                    if(cell != null){
//获取类型
                        int cellType = cell.getCellType();
                        String cellValue="";
//判断cell的数据类型
                        switch (cellType) {
case HSSFCell.CELL_TYPE_STRING://字符串
                                System.out.print("【STRING】");
                                cellValue = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BOOLEAN://布尔
                                System.out.print("【BOOLEAN】");
                                cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_BLANK://空
                                System.out.print("【BLANK】");
break;
case HSSFCell.CELL_TYPE_NUMERIC:
                                System.out.print("【NUMERIC】");
//cellValue = String.valueOf(cell.getNumericCellValue());
                                if (HSSFDateUtil.isCellDateFormatted(cell)) {//日期
                                    System.out.print("【日期】");
                                    Date date = cell.getDateCellValue();
                                    cellValue = new DateTime(date).toString("yyyy-MM-dd");
                                } else {
// 不是日期格式,则防止当数字过长时以科学计数法显示
                                    System.out.print("【转换成字符串】");
                                    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                                    cellValue = cell.toString();
                                }
break;
case Cell.CELL_TYPE_ERROR:
                                System.out.print("【数据类型错误】");
break;
                        }
                        System.out.println(cellValue);
                    }
                }
            }
        }
//关闭流
        filterInputStream.close();
    }
}
目录
相关文章
|
人工智能 监控 中间件
魔搭开源版GPTS来啦!轻松搭建个人超级智能体!
Openai DEV day上推出了GPT Stores, 允许用户通过聊天、直接配置的方式进行GPT的定制
|
Java
java8中List对象转另一个List对象
java8中List对象转另一个List对象
641 0
|
3月前
|
数据管理 开发工具 索引
在Python中借助Everything工具实现高效文件搜索的方法
使用上述方法,你就能在Python中利用Everything的强大搜索能力实现快速的文件搜索,这对于需要在大量文件中进行快速查找的场景尤其有用。此外,利用Python脚本可以灵活地将这一功能集成到更复杂的应用程序中,增强了自动化处理和数据管理的能力。
228 0
|
6月前
|
计算机视觉
用离散标记重塑人体姿态:VQ-VAE实现关键点组合关系编码
本文探讨了基于离散标记的人体姿态表示方法,受《Human Pose As Compositional Tokens》启发,构建了一个姿态重建模型。传统方法将关键点作为独立单元处理,而本文提出将姿态表示为一组学习到的离散标记组合,通过组合编码器、VQ码本和姿态解码器实现。实验使用合成火柴人数据集,包含13个二维关键点。初始端到端训练出现“码本崩溃”问题,后采用分阶段训练策略:先预训练编码器和解码器,再引入码本训练,有效缓解了该问题。此方法捕获了关键点间的结构化关系,为姿态分析提供了新思路。
152 2
用离散标记重塑人体姿态:VQ-VAE实现关键点组合关系编码
|
测试技术 开发工具 iOS开发
iOS自动化测试方案(三):WDA+iOS自动化测试解决方案
这篇文章是iOS自动化测试方案的第三部分,介绍了在没有MacOS系统条件下,如何使用WDA(WebDriverAgent)结合Python客户端库facebook-wda和tidevice工具,在Windows系统上实现iOS应用的自动化测试,包括环境准备、问题解决和扩展应用的详细步骤。
1855 1
iOS自动化测试方案(三):WDA+iOS自动化测试解决方案
|
10月前
|
Python
净利润断层策略
净利润断层策略通过分析公司财报公布后股价的异常波动来选股。当财报超预期且股价跳空高开时,视为买入信号。本文介绍了使用Python和Akshare库实现该策略的具体步骤,包括安装库、获取数据、识别断层及筛选股票等。
|
安全 JavaScript PHP
URL百分号编码
URL百分号编码
全双工与半双工技术解析
随着信息技术进步,通信系统对双工模式要求提升。全双工允许双向同时传输,提高效率和实时性,适合高速实时应用但成本高;半双工则单向传输,简单低成本,适用于实时性要求不高的场景。选择双工模式需权衡成本、技术与实时性需求。未来,双工模式将更灵活以适应多样化需求。
342 2
|
前端开发 NoSQL Java
基于Springboot+Vue实现前后端分离商城管理系统
基于Springboot+Vue实现前后端分离商城管理系统
716 1
|
Java
FreeMarker - 四种变量的用法
FreeMarker - 四种变量的用法
611 1