poi 读取excel例子

本文介绍了一款基于Java的Excel操作工具类,涵盖了从MultipartFile和InputStream创建WorkBook,以及读取指定Sheet数据的功能。该工具类支持Excel 2003和2007版本,能处理包括日期在内的各种单元格类型。
摘要由CSDN通过智能技术生成
package com.oneyac.milos.utils;

import com.alibaba.fastjson.JSONObject;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;


/**
 * Excel相关工具类
 *
 * @author yourin.yang
 */

public class ExcelUtils {

    /**
     * 创建workbook(会抛出异常,调用请捕获处理)
     *
     * @param file 文件
     * @return 返回workbook
     */
    public static Workbook createWorkbook(MultipartFile file) throws Exception {
        // 如果文件为空,则创建失败
        if (file.isEmpty()) {
            throw new Exception("文件为空");
        }
        String filename = file.getOriginalFilename();
        try {
            if (BaseUtils.isExcel2003(filename)) {
                return new HSSFWorkbook(file.getInputStream());
            } else if (BaseUtils.isExcel2007(filename)) {
                return new XSSFWorkbook(file.getInputStream());
            } else {
                throw new Exception("非EXCEL文件");
            }
        } catch (Exception e) {
            // 打印错误,并抛出
            e.printStackTrace();
            throw new Exception("文件解析失败");
        }
    }

    /**
     * 创建workbook(会抛出异常,调用请捕获处理)
     */
    public static Workbook createWorkbook(InputStream inputStream, String filename) throws Exception {
        try {
            if (BaseUtils.isExcel2003(filename)) {
                return new HSSFWorkbook(inputStream);
            } else if (BaseUtils.isExcel2007(filename)) {
                return new XSSFWorkbook(inputStream);
            } else {
                throw new Exception("非EXCEL文件");
            }
        } catch (Exception e) {
            // 打印错误,并抛出
            e.printStackTrace();
            throw new Exception("文件解析失败");
        }
    }

    /**
     * 从workbook读取指定sheet的数据 (会抛出异常,调用请捕获处理)
     * (统一转为String)
     * 日期指定为格式 yyyy-MM-dd HH:mm:ss
     *
     * @param wb         workbook
     * @param sheetIndex sheet索引
     * @return 指定sheet页的数据
     */
    public static List<List<String>> readData(Workbook wb, int sheetIndex) throws Exception {
        try {
            List<List<String>> data = new ArrayList<>();
            // 得到sheet
            Sheet sheet = wb.getSheetAt(sheetIndex);
            // 得到总行数
            int rowsCount = sheet.getLastRowNum();
            // 逐行取得数据
            for (int i = 0; i <= rowsCount; i++) {
                // 获取行
                Row row = sheet.getRow(i);
                if (BaseUtils.isEmpty(row)) {
                    continue;
                }
                // 获得每行列数
                int colsCount = row.getLastCellNum();
                List<String> lineData = new ArrayList<>();
                // 逐列取得数据
                for (int j = 0; j < colsCount; j++) {
                    // 获取单元格
                    Cell cell = row.getCell(j);
                    lineData.add(readData(cell));
                }
                data.add(lineData);
            }
            return data;
        } catch (Exception e) {
            // 打印错误,并抛出
            e.printStackTrace();
            throw new Exception("EXCEL数据读取失败");
        }
    }

    /**
     * 读取单元格数据
     * (统一转为String)
     * 日期指定为格式 yyyy-MM-dd HH:mm:ss
     *
     * @param cell 单元格
     * @return 单元格数据
     */
    private static String readData(Cell cell) throws Exception {
        if (cell == null) {
            return "";
        }
        CellType cellType = cell.getCellTypeEnum();
        switch (cellType) {
            case BOOLEAN:
                return cell.getBooleanCellValue() + "";
            case NUMERIC:
                // 数字的时候需要特别判断是否是日期 日期统一返回 yyyy-MM-dd HH:mm:ss
                if (DateUtil.isCellDateFormatted(cell)) {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    return sdf.format(cell.getDateCellValue());
                }
                return cell.getNumericCellValue() + "";
            case BLANK:
                // 空值暂时返回空字符串,有遇到再修改
                return "";
            case FORMULA: //公式
                return cell.getCellFormula();
            case _NONE:
                // 空值暂时返回空字符串,有遇到再修改
                return "";
            case ERROR:
                return "";
            case STRING:
                return cell.getStringCellValue();
            default:
                return "";
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值