java使用poi读取ecxel文件的工具类

本文介绍了一个实用的方法,用于将Excel文件中的数据读取并转换为Java List<Map<Integer,String>>格式。该方法支持.xls和.xlsx两种文件格式,并允许用户指定表头行数及读取的工作表编号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导入jar包

 poi-3.8-20120326.jar
 poi-examples-3.8-20120326.jar
 poi-excelant-3.8-20120326.jar
 poi-ooxml-3.8-20120326.jar
 poi-ooxml-schemas-3.8-20120326.jar
 poi-scratchpad-3.8-20120326.jar
 xmlbeans-2.3.0.jar

/**
     * 读取excel文件并转换成list 空行不会被存到list数据已key等于列数value等于值的形式存到map行和列都是从0开始
     *
     * @param file
     *            要读取的excel文件
     *
     * @param header
     *            表头所占用行数 0表示无表头
     *
     * @param sheetNum
     *            要读取excel的第几张表
     *
     * @return
     */
    public static List<Map<Integer, String>> excelToList(File file, int headerNum, int sheetNum) {
        try {
            // 把所有读取到的数据存到一个list
            List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
            // 把单行数据存到一个map
            Map<Integer, String> map = null;
            // 定义一个变量来记录此行是否为空行大于0表示此行有数据否则不会存到list
            int checkRow = 0;
            InputStream is = new FileInputStream(file);
            Workbook workbook = null;
            // 通过后缀来判断要是用的Workbook,xls是2003,xlsx是2007
            if ("xlsx".equals(StringUtil.getFileExt(file.getName()))) {
                workbook = new XSSFWorkbook(is);
            } else {
                workbook = new HSSFWorkbook(is);
            }

            // 得到第一个shell
            Sheet sheet = workbook.getSheetAt(sheetNum);
            // 得到Excel的行数
            int totalRows = sheet.getPhysicalNumberOfRows();
            int totalCells = 0;
            // 得到Excel的列数
            if (totalRows >= 1 && sheet.getRow(0) != null) {
                totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
            }

            Row row = null;
            Cell cell = null;
            StringBuffer value = new StringBuffer("");
            // 循环Excel的行
            for (int r = 0; r < totalRows; r++) {
                row = sheet.getRow(r);
                if (row == null) {
                    continue;
                }
               
                map = new LinkedHashMap<Integer, String>();
                // 跳过表头
                if (r >= headerNum) {
                  
                    // 循环Excel的列
                    for (int c = 0; c < totalCells; c++) {
                        cell = row.getCell(c);                                               
                        // 值为null时转换成空字符
                        if (String.valueOf(cell) != null) {
                            // 防止数字自然数格式读取
                            switch (cell.getCellType()) {
                            case HSSFCell.CELL_TYPE_NUMERIC: // 数字
                                DecimalFormat format = new DecimalFormat("0");
                                value = new StringBuffer(format.format(cell.getNumericCellValue()).replaceAll("\\s*|\t|\r|\n", ""));
                                break;

                            case HSSFCell.CELL_TYPE_STRING: // 字符串
                                value = new StringBuffer(String.valueOf(cell).replaceAll("\\s*|\t|\r|\n", ""));
                                break;
                            }
                        } else {
                            value = new StringBuffer("");
                        }
                   
                        map.put(c, value + "");
                        if (!"".equals(value) && (value != null) && (value.length() != 0)) {
                            checkRow++;
                        }
                        // 存完一列数据清空value以免空列无法更新value
                         value = new StringBuffer("");
                    }
                    // checkRow大于表示此行有数据需要存到list
                    if (checkRow > 0) {
                        list.add(map);
                        // 重置list来记录下一行是否为空行
                        checkRow = 0;
                    }
               

                }
            }
            return list;
        } catch (Exception e) {

            e.printStackTrace();
        }
        return null;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值