导入excel详解--POI

java读写Excel三种常用的技术

1.POI
Apache POI是Apache软件基金会的开放源代码函数库,POI提供API给java程序对Microsoft Office格式档案读和写的功能。HSSF是Horrible SpreadSheet Format的缩写,及“讨厌的电子表格格式”,通过HSSF,你可以使用纯的java代码来读取,写入,修改Excel文件。 其中它有以下的功能:
HSSF-读写Mocrosoft Excel格式档案的功能
XSSF-读写Mocrosoft Excel OOXML格式档案的功能
HWPF-读写Mocrosoft World格式档案的功能
HSLF-对鞋Mocrosoft PowerPoint格式档案的功能
HDGF-读写Mocrosoft Visio格式档案的功能

2.JXL
java Excel是一个开放源代码的项目,
可以读取Excel文件的内容,创建Excel文件,更新已经存在的Excel文件。
包括常见格式的设置:字体,颜色,本经,合并单元格等。

3.FastExcel
FastExcel是一个采用纯java开发的excel文件读写组件,
持Excel 97-2003文件格式。FastExcel只能读取单元格的字符信息,而其他属性如颜色,
字体等就不支持了,因此FastExcel只需要很小的内存。

主要介绍一下poi
1. 首先导入pom文件

根据自己版本进行下载
    <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-excelant</artifactId>
            <version>3.14</version>
        </dependency>

在这里插入图片描述

2.编写代码

	public void importPriGoOutEmergency(MultipartFile file) {
	//截取到文件后缀名 
    String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
   //定义字节流接收文件的转换
    InputStream inputStream = null;
    try {
        Workbook wb = null;
        //将excel转换为字节流
        inputStream = file.getInputStream();
        //获取文件后缀名分别创建不同的工作簿
        if (fileType.equals("xlsx")) {
            wb = new XSSFWorkbook(inputStream);
        } else if (fileType.equals("xls")) {
            wb = new HSSFWorkbook(inputStream);
        }
     //获取工作簿
        Sheet sheetAt = wb.getSheetAt(0);
        //获取有效行数,包括标题
        int rows = sheetAt.getPhysicalNumberOfRows();
        //如果等于1,证明是excel标题,说明表格中没有数据
        if (rows == 1) {
            throw new MpaasRuntimeException("表格中没有数据可以被导入");
        }
        //从第二行开始遍历,因为第二行才是真正的有效数据
       // 行数:i=1开始是真正数据的开始,所以对应行数是(i+1)如图
        for (int i = 1; i < rows; i++) {
            //获取有效行,row指的不是行数,i是
            Row row = sheetAt.getRow(i);
            //获取单元格类型是否等于字符串类型还是数字类型,根据不同类型分别接受
            //这里我要说明一下,我数据库中存入的是string类型,但是编码格式为1001,在excel里面输入1001时,即使你设置了文本格式,但是他还是以数字格式存在,除非你点击忽略错误,但是用户一般不会注意到这一点,设置了也相当于没设置,所以接受类型进行判断.
            //第一行第一列的取值索引是从0开始的,不是1.(当时我以为是1,后来报错了)
            if (row.getCell(1).getCellType() == Cell.CELL_TYPE_STRING) {
                companyCode = row.getCell(1).getStringCellValue();
            } else if (row.getCell(1).getCellType() == Cell.CELL_TYPE_NUMERIC) {
                String cellValue = row.getCell(1).getNumericCellValue() + "";
                companyCode = cellValue.substring(0, cellValue.lastIndexOf("."));
            }
            .............后面是我代码逻辑,就不给大家展示了,常用的都在上面,防止大家踩雷,我都标注了注释
    } catch (IOException e) {
        throw new MpaasRuntimeException("数据异常,请重新校验!");
    } finally {
        try {
        //关流操作(别忘了)
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

憨憨有个提醒:
表格数据你用多少就操作多少,不要随便设置,否则也会记录进去,你操作一行数,但是设置了12行,就会获得12行.

常见报错

处理java.lang.IllegalStateException: Cannot get a text value from a numeric cell
翻译:java.lang.IllegalStateException:无法从数字单元格中获取文本值

原因:excel单元格是文本格式,但是你用的number类型接受就会报错,
解决办法
<1>在excel文件中有数字的单元格前面加上 ‘ ,这个大家应该明白什么意思
<2>在程序中进行类型转换,只要加上
row.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
程序运行到row.getCell(j).getStringCellValue()就不会再出错

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值