zoukankan      html  css  js  c++  java
  • Apache POI 4.0.1版本读取普通Excel文件(兼容 xls 和 xlsx)(一)

    基于最新的Apache POI 4.0.1版本来总结一下写入Excel的过程。

    代码编写前准备-》

    添加POI 4.0.1 maven依赖:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.springbootedemo</groupId>
        <artifactId>springboot-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
        <name>springboot-demo</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
         
            <dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>1.11.3</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.41</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.10</version>
            </dependency>
    
           
            <dependency>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
                <version>1.8.3</version>
            </dependency>
    
     <!--poi -->
         <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.0.1</version>
            </dependency>
          <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.0.1</version>
            </dependency>
    
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    example-01.xlsx 文件 ,excel数据准备:

    上代码:

    DataVo(封装数据VO类)

    package com.springbootemaildemo.excel.b;
    
    /**
     * 读取Excel时,封装读取的每一行的数据
     */
    public class DataVo {
        /**
         * 姓名
         */
        private String name;
    
        /**
         * 年龄
         */
        private Integer age;
    
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
    }

    ExcelReader(主要读取excel文件代码类)

    package com.springbootemaildemo.excel.b;
    
    import org.apache.commons.lang3.StringUtils;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 读取Excel内容
     */
    public class ExcelReader {
        private static final Logger logger = LoggerFactory.getLogger(ExcelReader.class);
        private static final String XLS = "xls";
        private static final String XLSX = "xlsx";
    
        /**
         * 根据文件后缀名类型获取对应的工作簿对象
         *
         * @param inputStream 读取文件的输入流
         * @param fileType    文件后缀名类型(xls或xlsx)
         * @return 包含文件数据的工作簿对象
         * @throws IOException
         */
        public static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
            Workbook workbook = null;
            if (fileType.equalsIgnoreCase(XLS)) {
                workbook = new HSSFWorkbook(inputStream);
            } else if (fileType.equalsIgnoreCase(XLSX)) {
                workbook = new XSSFWorkbook(inputStream);
            }
            return workbook;
        }
    
        /**
         * 读取Excel文件内容
         *
         * @param fileName 要读取的Excel文件所在路径
         * @return 读取结果列表,读取失败时返回null
         */
        public static List<DataVo> readExcel(String fileName) {
            Workbook workbook = null;
            FileInputStream inputStream = null;
            try {
                // 获取Excel后缀名
                String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
                // 获取Excel文件
                File excelFile = new File(fileName);
                if (!excelFile.exists()) {
                    logger.warn("指定的Excel文件不存在!");
                    return null;
                }
                // 获取Excel工作簿
                inputStream = new FileInputStream(excelFile);
                workbook = getWorkbook(inputStream, fileType);
    
                // 读取excel中的数据
                List<DataVo> resultDataList = parseExcel(workbook);
                return resultDataList;
            } catch (Exception e) {
                logger.warn("解析Excel失败,文件名:" + fileName + " 错误信息:" + e.getMessage());
                return null;
            } finally {
                try {
                    if (null != workbook) {
                        workbook.close();
                    }
                    if (null != inputStream) {
                        inputStream.close();
                    }
                } catch (Exception e) {
                    logger.warn("关闭数据流出错!错误信息:" + e.getMessage());
                    return null;
                }
            }
        }
    
        /**
         * 解析Excel数据
         *
         * @param workbook Excel工作簿对象
         * @return 解析结果
         */
        private static List<DataVo> parseExcel(Workbook workbook) {
            List<DataVo> resultDataList = new ArrayList<>();
            // 解析sheet
            int numberOfSheets = workbook.getNumberOfSheets();
            for (int sheetNum = 0; sheetNum < numberOfSheets; sheetNum++) {
                Sheet sheet = workbook.getSheetAt(sheetNum);
    
                // 校验sheet是否合法
                if (sheet == null) {
                    continue;
                }
                // 获取第一行数据
                int firstRowNum = sheet.getFirstRowNum();
                Row firstRow = sheet.getRow(firstRowNum);
                if (null == firstRow) {
                    logger.warn("解析Excel失败,在第一行没有读取到任何数据!");
                }
                // 解析每一行的数据,构造数据对象
                int rowStart = firstRowNum + 1;
                int rowEnd = sheet.getPhysicalNumberOfRows();
                for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
                    Row row = sheet.getRow(rowNum);
                    if (null == row) {
                        continue;
                    }
                    DataVo resultData = convertRowToData(row);
                    if (null == resultData) {
                        logger.warn("第 " + row.getRowNum() + "行数据不合法,已忽略!");
                        continue;
                    }
                    resultDataList.add(resultData);
                }
            }
            return resultDataList;
        }
    
        /**
         * 将单元格内容转换为字符串
         *
         * @param cell
         * @return
         */
        private static String convertCellValueToString(Cell cell) {
            if (cell == null) {
                return null;
            }
            String returnValue = null;
            switch (cell.getCellType()) {
                case NUMERIC:   //数字
                    Double doubleValue = cell.getNumericCellValue();
                    // 格式化科学计数法,取一位整数
                    DecimalFormat df = new DecimalFormat("0");
                    returnValue = df.format(doubleValue);
                    break;
                case STRING:    //字符串
                    returnValue = cell.getStringCellValue();
                    break;
                case BOOLEAN:   //布尔
                    Boolean booleanValue = cell.getBooleanCellValue();
                    returnValue = booleanValue.toString();
                    break;
                case BLANK:     // 空值
                    break;
                case FORMULA:   // 公式
                    returnValue = cell.getCellFormula();
                    break;
                case ERROR:     // 故障
                    break;
                default:
                    break;
            }
            return returnValue;
        }
    
        /**
         * 提取每一行中需要的数据,构造成为一个结果数据对象
         * <p>
         * 当该行中有单元格的数据为空或不合法时,忽略该行的数据
         *
         * @param row 行数据
         * @return 解析后的行数据对象,行数据错误时返回null
         */
        private static DataVo convertRowToData(Row row) {
            DataVo resultData = new DataVo();
            Cell cell;
            int cellNum = 0;
            // 获取姓名
            cell = row.getCell(cellNum++);
            String name = convertCellValueToString(cell);
            resultData.setName(name);
            // 获取年龄
            cell = row.getCell(cellNum++);
            String ageStr = convertCellValueToString(cell);
            if (StringUtils.isEmpty(ageStr)) {
                // 年龄为空
                resultData.setAge(null);
            } else {
                resultData.setAge(Integer.parseInt(ageStr));
            }
            return resultData;
        }
    }

    MyTest(测试类)

    package com.springbootemaildemo.excel.b;
    
    import org.apache.commons.collections4.CollectionUtils;
    
    import java.util.List;
    
    public class MyTest {
        public static void main(String[] args) {
            // 设定Excel文件所在路径
            String excelFileName = "E:\files\example-01.xlsx";
            // 读取Excel文件内容
            List<DataVo> readResult = ExcelReader.readExcel(excelFileName);
            //TODO 可以写相应的业务
            if (CollectionUtils.isNotEmpty(readResult)) {
                readResult.stream().forEach(dataVo -> {
                    System.out.println(dataVo.getName() + "-" + dataVo.getAge());
                });
            }
        }
    
    }

    结果:

  • 相关阅读:
    ELK+Kafka集群日志分析系统
    Centos 6.5 部署 redmine 3.3
    Centos 6.5 搭建l2tp 服务端和客户端
    Logstash之multiline 插件
    MYSQL MHA
    windows上给yii2安装插件
    YII2框架的安装
    Apache服务器配置项和虚拟机配置
    浮点数的比较
    微信自定义菜单总结
  • 原文地址:https://www.cnblogs.com/weigy/p/12905857.html
Copyright © 2011-2022 走看看