美文网首页工具类
java导入excel,我管你是2003还是2007?亲测可用

java导入excel,我管你是2003还是2007?亲测可用

作者: 爱吃苹果的西瓜 | 来源:发表于2019-08-02 13:15 被阅读0次

    写代码一定要先搞清楚本质!

    excel格式 区别
    .xls xls 是一个特有的二进制格式,其核心结构是复合文档类型的结构
    .xlsx xlsx 的核心结构是 XML 类型的结构,采用的是基于 XML 的压缩方式,使其占用的空间更小

    这就是为什么有2003和2007之分,2003是之前的版本,而2007采用的是xml的压缩方式,所以我们解析的时候需要对不同的格式进行解析!

        我们先举个例子:

    demo.xlsx
        输出的结果:
    结果

    需要导入的包:

        // excel 解析
        implementation('org.apache.poi:poi:3.17')
        implementation('org.apache.poi:poi-ooxml:3.17')
    

    原理:先获取excel中的第一行作为一个header,然后从第二行开始把对应的值放到header中去,这样就可以获得excel中的值啦!(注:每个cell需要先转成String类型,不然在读取excel cell中数据的时候报错,或者对每个cell的header做类型判断)
    github地址(代码可能会更新):https://github.com/furtech/java_utils/blob/master/src/main/java/com/furtech/javautils/ExcelImportHandler.java

    下面就是对一个excel导入的处理过程,希望可以帮到大家!

    package com.furtech.javautils;
    
    
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.*;
    
    
    /**
     * @des 解析excel(2003/2007版)
     *
     * @author 719383495@qq.com | 719383495qq@gmail.com | 有问题可以邮箱或者github联系我
     * @date 2019/8/3 12:20
     */
    public class ExcelImportHandler {
    
        private static final Logger logger = LoggerFactory.getLogger(ExcelImportHandler.class);
    
        public static void main(String[] args) {
            String filePath = "C:\\Users\\Desktop\\demo\\demo.xlsx";
            excelImportHandler(filePath);
        }
    
        public static void excelImportHandler(String filepath) {
    
            ExcelHandler excelHandler = new ExcelHandler();
            List<Map<String, Object>> excelInfo = excelHandler.getExcelInfo(filepath);
            logger.info("result:{}",excelHandler);
            for (Object p : excelInfo) {
                //处理逻辑
            }
        }
    
        static class ExcelHandler {
    
            private int totalRows = 0;
    
            private int totalCells = 0;
    
            public ExcelHandler() {
            }
    
            public int getTotalRow() {
                return totalRows;
            }
    
            public void setTotalRow(int totalRow) {
                this.totalRows = totalRow;
            }
    
            public int getTotalCells() {
                return totalCells;
            }
    
            public void setTotalCells(int totalCells) {
                this.totalCells = totalCells;
            }
    
            /**
             * 获取excel中的内容
             *
             * @param filePath
             * @return
             */
            public List<Map<String, Object>> getExcelInfo(String filePath) {
                boolean isExcel2003 = true;
                InputStream is = null;
                try {
                    if (!validateExcel(filePath)) {
                        return null;
                    }
                    if (isExcel2007(filePath)) {
                        isExcel2003 = false;
                    }
                    is = new FileInputStream(filePath);
                    return createExcel(is, isExcel2003);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
    
            /**
             * 判断是否为excel文件
             *
             * @param filePath
             * @return
             */
            public boolean validateExcel(String filePath) {
                if (null == filePath  ||
                        !(isExcel2003(filePath) ||
                                isExcel2007(filePath))) {
                    logger.info("文件名不是excel格式");
                    return false;
                }
                return true;
            }
    
            /**
             * 是否是2003的excel,返回true是2003
             *
             * @param filePath
             * @return
             */
            public boolean isExcel2003(String filePath) {
                return filePath.matches("^.+\\.(?i)(xls)$");
            }
    
            /**
             * 是否是2007的excel,返回true是2007
             *
             * @param filePath
             * @return
             */
            public boolean isExcel2007(String filePath) {
                return filePath.matches("^.+\\.(?i)(xlsx)$");
            }
    
            /**
             * 创建excel对应的执行器去执行对应的版本
             *
             * @param is
             * @param isExcel2003
             * @return
             */
            public List<Map<String, Object>> createExcel(InputStream is, boolean isExcel2003) {
                try {
                    Workbook wb = null;
                    if (isExcel2003) {
                        wb = new HSSFWorkbook(is);
                    } else {
                        wb = new XSSFWorkbook(is);
                    }
                    return readExcelValue(wb);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
    
            /**
             * 处理行(如果第一行不需要的话,可以从i=1开始,第一行作为冻结行)
             *
             * @param wb
             * @return
             */
            private List<Map<String, Object>> readExcelValue(Workbook wb) {
                Sheet sheet = wb.getSheetAt(0);
                List<Map<String, Object>> list = new ArrayList<>();
                this.totalRows = sheet.getPhysicalNumberOfRows();
                if (totalRows > 1 && sheet.getRow(0) != null) {
                    this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
                }
                List<String> header = getSheetHead(sheet.getRow(0));
    
                for (int i = 1; i < totalRows; i++) {
                    Row row = sheet.getRow(i);
                    if (row == null) {
                        continue;
                    }
                    Map<String, Object> p = excelCellHandler(header, row);
                    list.add(p);
                }
                return list;
            }
    
    
            private List<String> getSheetHead(Row row) {
                List<String> header = new LinkedList<>();
                for (int i = 0; i < totalCells; i++) {
                    Cell cell = row.getCell(i);
                    cell.setCellType(CellType.STRING);
                    String value = cell.getStringCellValue();
                    header.add(value);
                }
                return header;
            }
    
            /**
             * 处理excel中的列,需要对每一列的值进行相应的处理
             *
             * @param row
             * @return
             */
            private Map<String, Object> excelCellHandler(List<String> header,Row row) {
                Map<String, Object> p = new HashMap();
                for (int i = 0; i < totalCells; i++) {
                    Cell cell = row.getCell(i);
                    if (null != cell) {
                        cell.setCellType(CellType.STRING);
                        p.put(header.get(i), cell.getStringCellValue());
    
                    }
    
                }
                return p;
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:java导入excel,我管你是2003还是2007?亲测可用

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