专栏首页cwl_JavaJava工具集-Excel指定文件名称读取工具类

Java工具集-Excel指定文件名称读取工具类

添加依赖

		<!--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>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.1</version>
        </dependency>

代码示例

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * @program: simple_tools
 * @description: Excel读取工具类
 * @author: Mr.chen
 * @create: 2020-04-30 09:55
 **/
public class ExcelReader {

    private static final String XLS = "xls";
    private static final String XLSX = "xlsx";
    private static final String ENCODING_TYPE_UTF = "UTF-8";
    private static final int ROW_TYPE_FLAG = 0;
    private static final int LIST_TYPE_FLAG = 1;
    /**
     * 读取Excel文件
     *
     * @param fileName 读取Excel文件的名称
     * @param sheetName 读取Excel文件的SheetName
     * @return
     */
    public static Map<String, Object> readExcel(String fileName, String sheetName) {
        FileInputStream inputStream = null;
        Workbook workbook = null;
        try {
            String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
            File excelFile = new File(fileName);
            if (!excelFile.exists()) {
                System.out.println("the excel file does not exist!");
                return null;
            }
            inputStream = new FileInputStream(excelFile);
            workbook = getWorkbook(inputStream, fileType);
            return parseExcel(workbook, sheetName);
        } catch (Exception e) {
            System.out.println(String.format("read excel file throws error :{}",e.getMessage()));
            e.printStackTrace();
        } finally {
            try {
                if (workbook != null) workbook.close();
                if (inputStream != null) inputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 获取一个Excel文件对象
     *
     * @param inputStream
     * @param fileType
     * @return
     * @throws Exception
     */
    private static Workbook getWorkbook(InputStream inputStream, String fileType) throws Exception {
        Workbook workbook = null;
        if (fileType.equalsIgnoreCase(XLS)) {
            workbook = new HSSFWorkbook(inputStream);
        } else if (fileType.equalsIgnoreCase(XLSX)) {
            workbook = new XSSFWorkbook(inputStream);
        }
        return workbook;
    }

    /**
     * 解析Excel文件对象
     *
     * @param workbook
     * @param sheetName
     * @return
     */
    private static Map<String, Object> parseExcel(Workbook workbook, String sheetName) {
        Map<String, Object> result = new HashMap<>();
        for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
            String name = workbook.getSheetName(sheetNum);
            if (sheetName == null || sheetName.equals(name)) {
                Sheet sheet = workbook.getSheet(name);
                result.put(name, convertSheet(sheet));
            }
        }
        return result;
    }

    /**
     * 转换Sheet表为List<Object>集合
     *
     * @param sheet
     * @return
     */
    private static List<Object> convertSheet(Sheet sheet) {
        List<Object> sheetDataList = new ArrayList<>();
        for (int rowNum = 0; rowNum < sheet.getPhysicalNumberOfRows(); rowNum++) {
            Row row = sheet.getRow(rowNum);
            List<Object> rowDataList = convertRow(row);
            sheetDataList.add(rowDataList);
        }
        return sheetDataList;
    }

    /**
     * 转换行为List<Object>集合
     *
     * @param row
     * @return
     */
    private static List<Object> convertRow(Row row) {
        List<Object> rowDataList = new ArrayList<>();
        for (int cellNum = 0; cellNum < row.getPhysicalNumberOfCells(); cellNum++) {
            Cell cell = row.getCell(cellNum);
            Object value = convertCell(cell);
            rowDataList.add(value);
        }
        return rowDataList;
    }

    /**
     * 转换每个cell单元格为Object对象
     *
     * @param cell
     * @return
     */
    private static Object convertCell(Cell cell) {
        CellType cellType = cell.getCellTypeEnum();
        Object value = null;
        switch (cellType) {
            case _NONE:
            case BLANK:
            case ERROR:
                break;
            case STRING:
                value = cell.getStringCellValue();
                break;
            case BOOLEAN:
                value = cell.getBooleanCellValue();
                break;
            case NUMERIC:
                value = cell.getNumericCellValue();
                break;
            case FORMULA:
                value = cell.getCellFormula();
                break;
        }
        return value;
    }

    /**
     * 读取项目资源目录下 Excel文件
     * @param fileName 文件名称
     * @param sheetName Excel中的sheet名称
     * @return 读取的Map集合
     */
    public static Map<String, Object> readExcelFile(String fileName , String sheetName) {
        URL resource = ExcelReader.class.getClassLoader().getResource(fileName);
        Map<String, Object> result = null;
        try {
            result = readExcel(URLDecoder.decode(resource.getPath(), ENCODING_TYPE_UTF), sheetName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 获取Excel文件中的具体值
     *
     * @param excelMap Excel读取出来的Map结果集
     * @param row 需要获取值得行数
     * @param list 需要获取值得列数
     * @return
     */
    public static String getExcelValue(Map<String,Object> excelMap,int row,int list){
        // 行数组集合
        ArrayList<Object> rowValues = (ArrayList<Object>) excelMap.values();
        // 列数组集合
        ArrayList<Object> listValues = (ArrayList<Object>) rowValues.get(row);
        return String.valueOf(listValues.get(list));
    }


    /**
     * 获取指定列的List集合
     *
     * @param rowList 行的集合
     * @param index 列的索引
     * @return
     */
    private static List<Object> getLineList(List<Object> rowList, int index){
        List<Object> resultList = new ArrayList<>();
        Object cell;
        for (Object obj : rowList) {
            if(obj instanceof ArrayList){
                cell = ((ArrayList) obj).get(index);
                resultList.add(cell);
            }
        }
        return resultList;
    }

    /**
     * 获取行的集合
     *
     * @param excelMap
     * @return
     */
    private static List<Object> getRowList(Map<String, Object> excelMap, int index) {
        // 行数组集合
        List<Object> resultList = new ArrayList<>();
        Iterator<Object> iterator = excelMap.values().iterator();
        while(iterator.hasNext()){
            Object next = iterator.next();
            if(next instanceof ArrayList){
                for (Object value : (List<?>)next) {
                    resultList.add(value);
                }
            }
        }
        if (index < 0){
            return resultList;
        }
        Object result = resultList.get(index);
        return result instanceof ArrayList ? (List<Object>) result :new ArrayList<>();
    }

    /**
     * 获取Excel文件中指定的一行数据或者是一列数据
     *
     * @param excelMap 需要进行获取的Excel文件
     * @param index 需要获取的一行或者是一列
     * @param type 行或者列的类型 0 表示获取行 1 表示获取列
     * @return 获取的结果集
     */
    public static List<String> getList(Map<String,Object> excelMap,int index,int type){
        switch(type){
            case ROW_TYPE_FLAG:
                return handleRow(excelMap,index);
            case LIST_TYPE_FLAG:
                return handleList(excelMap,index);
            default:return Collections.EMPTY_LIST;
        }
    }

    /**
     * 获取Excel中指定列的信息
     *
     * @param excelMap
     * @param index
     * @return
     */
    private static List<String> handleList(Map<String, Object> excelMap, int index) {
        List<Object> rowList = getRowList(excelMap, -1);
        List<Object> lineList = getLineList(rowList, index);
        List<String> resultList = new ArrayList<>();
        for (Object obj : lineList) {
            resultList.add(obj.toString());
        }
        return resultList;
    }

    /**
     * 获取Excel中指定行的信息
     *
     * @param excelMap
     * @param index
     * @return
     */
    private static List<String> handleRow(Map<String, Object> excelMap, int index) {
        List<Object> rowList = getRowList(excelMap, index);
        List<String> resultList = new ArrayList<>();
        for (Object obj : rowList) {
            resultList.add(obj.toString());
        }
        return resultList;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java工具集-复杂更新逻辑工具

    cwl_java
  • Java工具集-判断(AssertUtil)

    cwl_java
  • Java工具集-MD5加密工具

    cwl_java
  • 字符串,整型,长整型转换工具类

     package my; /**  *   * @author  chendongj  *  */ public class Util {      /** ...

    用户1220053
  • Laravel源码解析之ENV配置

    Laravel在启动时会加载项目中的 .env文件。对于应用程序运行的环境来说,不同的环境有不同的配置通常是很有用的。 例如,你可能希望在本地使用测试的 Mys...

    KevinYan
  • 成都活动 | 5月19日「DnA数字不会说谎:精益数据分析」

    然而,在如今的互联网时代,我们所面对的不是数据匮乏,而是数据过剩。如何能在纷繁复杂的数据中抽丝剥茧,读懂数据背后的真实意义?

    ThoughtWorks
  • hashCode、equals的使用

    hash code、equals是Java用来比较对象是否相等,下面介绍一下自己在工作中对hash code、equals的使用. 首先介绍下String类中的...

    LiosWong
  • Java8-理解Collector

    Ryan-Miao
  • 一份值得收藏的 Git 异常处理清单

    Git 作为一种分布式版本控制系统已经成为现在开发的宠儿,不仅应用在前端、后端、客户端等开发场景中,也成为各行业互联网企业分工协作的必备技能之一。

    政采云前端团队
  • 整理了一份 Docker系统知识,从安装到熟练操作看这篇就够

    当我们在工作中,一款产品从开发设计到上线运行,其中需要开发人员和运维工程师,开发人员负责代码编写,开发产品,运维工程师需要测试环境,产品部署。这之间就会有分歧。

    用户2781897

扫码关注云+社区

领取腾讯云代金券