java excel导入工具类

<!-- excel工具 -->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>${poi.version}</version>
</dependency>

<properties>
   <poi.version>3.17</poi.version>
</properties>

首先poi的pom文件  版本号

里面的代码,改改包名,别的应该就不用改了

package com.ruoyi.web.controller.system;

import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * excel 导入工具类
 * @author 姜文林 2020/6/2
 */
public class ImportExcelFile {

    private static final Logger log = LoggerFactory.getLogger(ImportExcelFile.class);

    /**
     * excel版本
     */
    private static final String EXCEL_XLS = "xls";
    private static final String EXCEL_XLSX = "xlsx";

    /**
     * 时间格式
     */
    public final static String DATE_OUTPUT_PATTERNS = "yyyy-MM-dd HH:mm:ss";
    public final static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_OUTPUT_PATTERNS);

    /**
     * 判断版本获取Wordboook
     *
     * @param in       输入流
     * @param fileName 文件名称
     * @return Workbook版本
     * @throws IOException
     */
    private static Workbook getWorkbook(InputStream in, String fileName) throws IOException {
        Workbook wbook = null;
        if (fileName.endsWith(EXCEL_XLS)) {
            wbook = new HSSFWorkbook(in);
        } else if (fileName.endsWith(EXCEL_XLSX)) {
            wbook = new XSSFWorkbook(in);
        }
        return wbook;
    }

    /**
     * 解析excel文件问对象集合
     *
     * @param file     文件上传
     * @param fileName 文件名称 file.getOriginalFilename()可以获得
     * @return
     */
    public static String getExcelData(MultipartFile file, String fileName) {
        //文件校验
        long size = file.getSize();
        if (file == null || fileName == null ||
                StringUtils.isEmpty(fileName) && size == 0) {
            throw new BusinessException("导入数据不能为空!");
        }
        //成功数量
        int successNum = 0;
        // 失败数量
        int failureNum = 0;
        // 成功集合
        StringBuilder successMsg = new StringBuilder();
        // 失败集合
        StringBuilder failureMsg = new StringBuilder();
        // 行数 用来抛出错误用或者成功用
        int linesNumber = 0;
        List<List<String>> lists = new ArrayList<>();
        try {
            // 获取版本
            Workbook workbook = getWorkbook(file.getInputStream(), fileName);
            //获取Sheet的数量
            int sheetCount = workbook.getNumberOfSheets();
            // 第一个Sheet
            Sheet sheet = workbook.getSheetAt(0);
            //表头
            Row rowHead = sheet.getRow(0);
            //总列数
            int columns = rowHead.getPhysicalNumberOfCells();
            //总行数
            int lines = sheet.getPhysicalNumberOfRows();
            /**
             * 判断是不是空的excel 下面有一个for循环 所以行数的判断根据具体情况来,因为
             *  表头可能是多行,我下面的循环从2开始,所有行数应该 >2
             */
            if (columns < 1 || lines < 2) {
                throw new BusinessException("导入数据不能为空!");
            }
            //循环获取每行数据
            for (int i = 2; i < lines; i++) {
                // 行数+1是正确的行数
                linesNumber = i + 1;
                Row row = sheet.getRow(i);
                视情况而定的代码();
                // 失败判断条件  触发failureNum ++ 触发failureNum集合 后面的.getCell(1)是第几列 +1
                if (i == 0) {
                    failureNum++;
                    failureMsg.append("<br/>" + failureNum + "、【行数】" + linesNumber + "【某某字段】" + row.getCell(1) + " 添加怎么了(例如不存在)");
                    continue;
                }
                // String.valueOf(getCellValue(row.getCell(1))) 用来判断类型
                // qqq 实体类
//                qqq.setxx(String.valueOf(getCellValue(row.getCell(1))));
                // 添加数据库
//                 xxxMapper.insertxxx(qqq);
                // 成功  successNum ++ successMsg 后面的.getCell(1)是第几列 +1
                successNum++;
                successMsg.append("<br/>" + successNum + "、【某某字段】 " + row.getCell(1) + " 已添加");

            }
        } catch (Exception e) {
            failureNum++;
            String msg = "<br/>" + failureNum + "、【行数】 " + linesNumber + " 导入失败:";
            failureMsg.append(msg + e.getMessage());
            log.error(msg, e);
        }
        if (failureNum > 0) {
            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
            throw new BusinessException(failureMsg.toString());
        } else {
            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
        }
        return successMsg.toString();

//        JSONArray array = JSONArray.parseArray(JSON.toJSONString(lists));
//        return null;
//        return array.toJavaList(User.class);
    }

    /**
     * 获取对应的枚举类型数据
     *
     * @param cell 单元格
     * @return 对应的枚举类型数据
     */
    public static String getCellValue(Cell cell) {
        String ret = "";
        if (cell == null) {
            return ret;
        }
        CellType type = cell.getCellTypeEnum();
        switch (type) {
            case BLANK:
                ret = "";
                break;
            case BOOLEAN:
                ret = String.valueOf(cell.getBooleanCellValue());
                break;
            case ERROR:
                ret = null;
                break;
            case FORMULA:
                Workbook wb = cell.getSheet().getWorkbook();
                CreationHelper crateHelper = wb.getCreationHelper();
                FormulaEvaluator evaluator = crateHelper.createFormulaEvaluator();
                ret = getCellValue(evaluator.evaluateInCell(cell));
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    Date theDate = cell.getDateCellValue();
                    ret = simpleDateFormat.format(theDate);
                } else {
                    ret = NumberToTextConverter.toText(cell.getNumericCellValue());
                }
                break;
            case STRING:
                ret = cell.getRichStringCellValue().getString();
                break;
            default:
                ret = "";
        }

        // 有必要自行trim
        return ret;
    }

    public static void 视情况而定的代码() {
        /**
         * 这一行的代码视情况而定 直接打在这一行
         * //循环获取每列
         *                 List<String> list = new ArrayList<>();
         *                 for (int j = 0; j < columns; j++) {
         *                     if (sheet.getRow(i).getCell(j) != null) {
         *                         Object obj = getCellValue(sheet.getRow(i).getCell(j));
         *                         list.add(String.valueOf(obj));
         *                     } else {
         *                         list.add(null);
         *                     }
         *                 }
         *                 lists.add(list);
         */
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值