java导入excel,我管你是2003还是2007?很好用,可定制

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

excel格式区别
.xlsxls 是一个特有的二进制格式,其核心结构是复合文档类型的结构
.xlsxxlsx 的核心结构是 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;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的小伙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值