美文网首页程序员
JAVA实现Excel的读取--ExcelUtil工具类

JAVA实现Excel的读取--ExcelUtil工具类

作者: 1994_老叶 | 来源:发表于2018-01-28 00:37 被阅读0次
dream.jpg

首先声明一点,这是自己的写法,并不是标准写法,标准写法可以google一下。
主要运用的apache的POI包中的类。

1.首先创建一个ExcelUtil的工具类,并且把自己需要的方法写出来。

其中我使用的maven的方式,引入了这两个依赖:

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.13</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.13</version>
            </dependency>

我这里暂时就需要两个方法:
第一个方法:读取Excel的文件表格的各个标题,一般的表格都是设有标题的,一般在Excel的第一行,但是不能例外有可能设在其他的行,所以设置的灵活一点。

 /**
     * 读取Excel文件的标题信息
     * @return
     */
public static List<String> readeExcelHeader(InputStream excelInputSteam,
                                         int sheetNumber,
                                         int headerNumber,
                                         int rowStart){...}

第二个方法:读取Excel的内容数据,同样的,要设置的灵活一点,同时要将每一行的数据与标题向对应,所以使用Map<String,Object>来存储每一列的数据,最后生成一个List,所以返回值是List<Map<String,Object>>

/**
     * 读取Excel文件的内容
     * @return
     */
public static List<Map<String,Object>> readeExcelData(InputStream excelInputSteam,
                                                   int sheetNumber,
                                                   int headerNumber,
                                                   int rowStart){...}

2.开始进行内容的填充

首先读出header,即我们的标题,放在一个List<String> headers中;
其次,每行的数据,放在HashMap<String,Object>(<header,data>这样的形式),每行一个HashMap,最后将所有的HashMap放在一个List中,这样将返回List。
因为两个方法都有读取header的部分,第二个方法包含第一个方法,我就只说第二个方法。
第一个方法的实现:

public static List<String> readeExcelHeader(InputStream excelInputSteam,
                                                int sheetNumber,
                                                int headerNumber,
                                                int rowStart) throws IOException, InvalidFormatException {
        //要返回的数据
        List<String> headers = new ArrayList<String>();
        //生成工作表
        Workbook workbook = WorkbookFactory.create(excelInputSteam);
        Sheet sheet = workbook.getSheetAt(sheetNumber);
        Row header = sheet.getRow(headerNumber);
        DataFormatter dataFormatter = new DataFormatter();
        for (int i = 0; i < header.getLastCellNum(); i++) {
            //获取单元格
            Cell cell = header.getCell(i);
            headers.add(dataFormatter.formatCellValue(cell));
        }
        return headers;
    }

第二个方法的实现:

 public static List<Map<String, Object>> readeExcelData(InputStream excelInputSteam,
                                                           int sheetNumber,
                                                           int headerNumber,
                                                           int rowStart) throws IOException, InvalidFormatException {
        //需要的变量以及要返回的数据
        List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
        List<String> headers = new ArrayList<String>();
        //生成工作表
        Workbook workbook = WorkbookFactory.create(excelInputSteam);
        Sheet sheet = workbook.getSheetAt(sheetNumber);
        Row header = sheet.getRow(headerNumber);
        //最后一行数据
        int rowEnd = sheet.getLastRowNum();
        DataFormatter dataFormatter = new DataFormatter();
        //获取标题信息
        for (int i = 0; i < header.getLastCellNum(); ++i) {
            Cell cell = header.getCell(i);
            headers.add(dataFormatter.formatCellValue(cell));
        }
        //获取内容信息
        for (int i = rowStart; i <= rowEnd; ++i) {
            Row currentRow = sheet.getRow(rowStart);
            if (Objects.isNull(currentRow)) {
                continue;
            }
            Map<String, Object> dataMap = new HashMap<>();
            for (int j = 0; j < currentRow.getLastCellNum(); ++j) {
                //将null转化为Blank
                Cell data = currentRow.getCell(j, Row.CREATE_NULL_AS_BLANK);
                if (Objects.isNull(data)) {     //感觉这个if有点多余
                    dataMap.put(headers.get(j), null);
                } else {
                    switch (data.getCellType()) {   //不同的类型分别进行存储
                        case Cell.CELL_TYPE_STRING:
                            dataMap.put(headers.get(j), data.getRichStringCellValue().getString());
                            break;
                        case Cell.CELL_TYPE_NUMERIC:
                            if (DateUtil.isCellDateFormatted(data)) {
                                dataMap.put(headers.get(j), data.getDateCellValue());
                            } else {
                                dataMap.put(headers.get(j), data.getNumericCellValue());
                            }
                            break;
                        case Cell.CELL_TYPE_FORMULA:
                            dataMap.put(headers.get(j), data.getCellFormula());
                            break;
                        case Cell.CELL_TYPE_BOOLEAN:
                            dataMap.put(headers.get(j), data.getBooleanCellValue());
                            break;
                        default:
                            dataMap.put(headers.get(j), null);
                    }
                }
                result.add(dataMap);
            }
        }
        return result;
    }

相关文章

网友评论

    本文标题:JAVA实现Excel的读取--ExcelUtil工具类

    本文链接:https://www.haomeiwen.com/subject/suznaxtx.html