使用poi导入excel文件

120 篇文章 1 订阅
69 篇文章 2 订阅
该博客主要介绍如何处理Excel文件,包括读取XSSFSheet,校验模板文档,提取身份证号,转换时间戳以及判断数值类型。通过示例代码展示了如何获取真实行数,检查身份证号格式,格式化日期并识别数字。此外,还提供了去除字符串中特殊字符的方法。
摘要由CSDN通过智能技术生成

首先判断是不是是不是模板文档,并且读取成XSSFSheet

@Override
public XSSFSheet bulkLoadInformation(MultipartFile file) {
	try {
		InputStream inputStream = new ByteArrayInputStream(file.getBytes());
        ZipSecureFile.setMinInflateRatio(-1.0d);
        XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
        //读取第一个sheet页的数据
        XSSFSheet sheet = workbook.getSheetAt(0);
        //第一行
        XSSFRow row1 = sheet.getRow(0);
        //第一列
        XSSFCell cell = row1.getCell(0);
        //设置单元格格式
        cell.setCellType(CellType.STRING);
        //获取单元格中的字符串
        String stringCellValue = cell.getStringCellValue();
        //截取其中的一部分字符串
        String substring = stringCellValue.substring(10, 14);
        //第二行
        XSSFRow row2 = sheet.getRow(1);
        //第二行的列数
        int physicalNumberOfCells = row2.getPhysicalNumberOfCells();
        //校验是否是模板文档,设置的关键字是12列并且标题的其中一段为“测试用例”,这里因为我假设的第一行第一列是合并单元格的标题,
        //第二行是字段列名
        if (!"测试用例".equals(substring) || physicalNumberOfCells != 12){
            return null;
        }
        return sheet;
	} catch (IOException | StringIndexOutOfBoundsException e) {
		return null;
	}
}

然后对XSSFSheet进行分析
可以用这个代码来获得excel中的真实行数,但是有时候会失效,所以我用了另一种方法

Integer rows = sheet.getPhysicalNumberOfRows();

在这里插入图片描述

	/**
     * 用来得到真实行数
     * @param sheet 需要读取的Excel表格(excel文件的工作簿的名称)
     * @return
     *
     */
    public int readExcelValueRows(XSSFSheet sheet) {
        int realRow = 0;// 返回的真实行数
        // 标题行有几行就从几开始
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            //i从1开始,不判断第一行标题行
            XSSFRow row = sheet.getRow(i);
            if (row == null){
                continue;
            }
            for (Cell cell : row) {
                if (cell == null){
                    continue;
                }
                String value = cell.getStringCellValue().trim();
                if (value == null || "".equals(value)){
                    continue;
                } else{
                    realRow++;
                    break;
                }
            }
        }
        return realRow;
    }

对于身份证号的读取,因为身份证号都是15位或者18位的,所以我也写了个小方法

    private boolean isLetterOrDigits(String string) {
        boolean flag = false;
        if (string.length() == 15 || string.length() == 18) {
            for (int i = 0; i < string.length(); i++) {
                if (Character.isUpperCase(string.charAt(i)) || Character.isDigit(string.charAt(i))) {
                    flag = true;
                } else {
                    flag = false;
                    return flag;
                }
            }
        } else {
            flag = false;
        }
        return flag;

    }

excel中的时间读取出来会变成时间戳,所以需要自己转换一下
比如excel中的2019/6/17实际上就是43633,指的是从1900年到2019年6月17日间隔多少天
在这里插入图片描述

    public String formatExcelDate(int day) {
        Calendar calendar = new GregorianCalendar(1900, 0, -1);
        Date time = calendar.getTime();
        return DateUtil.addDate(time, day);
    }

这个小方法可以简单的判定是不是小数

    public boolean isNumeric(String str){
        Pattern pattern = Pattern.compile("[0-9]*\\.?[0-9]+");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

可以去除空格、回车、换行符、制表符

    private static String StringTrim(String str){
        String dest = "";
        if (str!=null) {
            //空格\t、回车\n、换行符\r、制表符\t
            Pattern p = Pattern.compile("\\s*|\\t|\\r|\\n");
            Matcher m = p.matcher(str);
            dest = m.replaceAll("");
        }
        return dest;
    }
	@Override
    @Transactional
    public void bulkLoadInformation(XSSFSheet sheet) {
    	//获取真实行数
        Integer rows = readExcelValueRows(sheet);
        //遍历处理数据
        for (int i = 2; i < rows; i++) {
        	XSSFCell cell = row.getCell(0);
            cell.setCellType(CellType.STRING);
            //第一列的数据
            String example = StringTrim(cell.getStringCellValue());
        	......
        	......
        }
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值