ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

「工具」Excel工具类

2022-01-06 13:02:33  阅读:146  来源: 互联网

标签:return Excel value cell static sheet 工具 public


pom.xml依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

完整代码

/**
 * @version 1.0.0
 * @ClassName ExcelUtil.java
 * @Description excel工具类
 */
public final class ExcelUtil {

    private ExcelUtil() {
    }

    /**
     * 2003以下版本的excel
     */
    public static final String EXCEL_2003L = ".xls";
    /**
     * 2007以上版本的excel
     */
    public static final String EXCEL_2007U = ".xlsx";

    public static final String DATA_GENERAL_FORMAT = "General";

    public static final ThreadLocal<DecimalFormat> DECIMAL_FORMAT_LOCAL = ThreadLocal.withInitial(() -> new DecimalFormat("0"));

    public static final ThreadLocal<DecimalFormat> DECIMAL_FORMAT_LOCAL2 = ThreadLocal.withInitial(() -> new DecimalFormat("0.00"));

    /**
     * 获取IO流中的数据,组装成List<Object[]>对象
     *
     * @param sheet    第几张工作簿(以0开始)
     * @param startRow 工作簿中第行开始(以0开始)
     * @return
     * @throws Exception
     */
    public static List<Object[]> getExcelData(Sheet sheet, int startRow) throws Exception {
        List<Object[]> list = new ArrayList();
        //遍历当前sheet中的所有行
        List<Object> tampList = null;
        Row row = null;
        Cell cell = null;
        for (int i = startRow; i <= sheet.getLastRowNum(); i++) {
            row = sheet.getRow(i);
            if (row == null) {
                continue;
            }
            //遍历所有的列
            tampList = new ArrayList();
            for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {
                cell = row.getCell(j);
                tampList.add(getCellValue(cell));
            }
            list.add(tampList.toArray());
        }
        return list;
    }

    /**
     * 获取指定某一行的数据
     *
     * @param sheet
     * @param rowIndex 工作簿中第行开始(以0开始)
     * @return
     */
    public static List<Object> getRowData(Sheet sheet, int rowIndex) {
        List<Object> list = new ArrayList();
        Row row = sheet.getRow(rowIndex);
        if (row == null) {
            return list;
        }
        Cell cell = null;
        for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) {
            cell = row.getCell(i);
            list.add(getCellValue(cell));
        }
        return list;
    }

    /**
     * 获取excel数据, 每一行数据就是一个Map, key为字段, value为数据值
     *
     * @return
     */
    public static List<Map<String, Object>> getExcelDataMapList(Sheet sheet, int startDataRowIndex, int headerRowIndex) throws Exception {
        //获取列头
        List<Object> headerCols = getRowData(sheet, headerRowIndex);
        //开始解析实际数据
        Row row = null;
        Cell cell = null;
        List<Map<String, Object>> list = new ArrayList();
        //遍历当前sheet中的所有行
        for (int i = startDataRowIndex; i <= sheet.getLastRowNum(); i++) {
            row = sheet.getRow(i);
            if (row == null) {
                continue;
            }
            Map<String, Object> rowMap = new HashMap(16);
            for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {
                cell = row.getCell(j);
                rowMap.put(String.valueOf(headerCols.get(j)), getCellValue(cell));
            }
            if (rowMap.isEmpty()) {
                continue;
            }
            list.add(rowMap);
        }
        return list;
    }

    /**
     * 描述:根据文件后缀,自适应上传文件的版本
     *
     * @param file
     * @return
     * @throws Exception
     */
    public static Workbook getWorkbook(File file) throws Exception {
        return getWorkbook(new FileInputStream(file), file.getName());
    }

    /**
     * 描述:根据文件后缀,自适应上传文件的版本
     *
     * @param file
     * @return
     * @throws Exception
     */
    public static Workbook getWorkbook(MultipartFile file) throws Exception {
        return getWorkbook(file.getInputStream(), file.getOriginalFilename());
    }

    /**
     * 获取sheet
     *
     * @param workbook
     * @param index    第几张工作簿(以0开始)
     * @return
     */
    public static Sheet getExcelSheet(Workbook workbook, int index) {
        Sheet sheet = workbook.getSheetAt(index);
        if (sheet == null) {
            throw new BizException("Excel工作薄为空!", CodeMsg.FILE_ANALYSIS_ERROR.getCode());
        }
        return sheet;
    }

    /**
     * 获取Sheet的最大行数
     *
     * @return
     */
    public static int getSheetMaxRowNum(Sheet sheet) {
        return sheet.getLastRowNum() - sheet.getFirstRowNum() + 1;
    }

    public static Workbook getWorkbook(InputStream in, String fileName) throws Exception {
        Workbook wb = null;
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        if (EXCEL_2003L.equals(fileType)) {
            //2003以下
            wb = new HSSFWorkbook(in);
        } else if (EXCEL_2007U.equals(fileType)) {
            //2007以上
            wb = new XSSFWorkbook(in);
        } else {
            throw new BizException(CodeMsg.FILE_ANALYSIS_ERROR);
        }
        if (null == wb) {
            throw new BizException("Excel为空!", CodeMsg.FILE_ANALYSIS_ERROR.getCode());
        }
        return wb;
    }

    /**
     * 描述:对表格中数值进行格式化
     *
     * @param cell
     * @return
     */
    public static Object getCellValue(Cell cell) {
        //用String接收所有返回的值
        String value = null;
        switch (cell.getCellType()) {
            case STRING:
                //String类型的数据
                value = cell.getStringCellValue();
                break;

            case NUMERIC:
                //数值类型(取值用cell.getNumericCellValue() 或cell.getDateCellValue())
                if (DATA_GENERAL_FORMAT.equals(cell.getCellStyle().getDataFormatString())) {
                    value = DECIMAL_FORMAT_LOCAL.get().format(cell.getNumericCellValue());
                } else if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    value = DateTimeUtil.DATE_TIME_LOCAL.get().format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
                } else {
                    value = DECIMAL_FORMAT_LOCAL2.get().format(cell.getNumericCellValue());
                }
                break;

            case BOOLEAN:
                //Boolean类型
                value = String.valueOf(cell.getBooleanCellValue());
                break;
            case FORMULA:
                //表达式类型
                value = String.valueOf(cell.getCellFormula());
                break;

            case ERROR:
                value = String.valueOf(cell.getErrorCellValue());
                break;
            default:
                value = "";
                break;
        }
        if (StringUtils.isBlank(value)) {
            value = "";
        }
        if (cell == null) {
            return "";
        }
        return value;
    }
}

 

标签:return,Excel,value,cell,static,sheet,工具,public
来源: https://www.cnblogs.com/xfeiyun/p/15770609.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有