美文网首页程序员
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