EasyPoi导入与导出工具类及demo

EasyPoi导入与导出工具类

package com.cjhx.permission.utils;

import cn.afterturn.easypoi.cache.manager.POICacheManager;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.ExcelXorHtmlUtil;
import cn.afterturn.easypoi.excel.entity.ExcelToHtmlParams;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import cn.afterturn.easypoi.word.WordExportUtil;
import cn.afterturn.easypoi.word.parse.ParseWord07;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

/**
 * Excel导入导出工具类
 */

public class ExcelUtils {

    /**
     * excel 导出
     *
     * @param list     数据列表
     * @param fileName 导出时的excel名称
     * @param response
     */
    public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {
        defaultExport(list, fileName, response);
    }

    /**
     * 默认的 excel 导出
     *
     * @param list     数据列表
     * @param fileName 导出时的excel名称
     * @param response
     */
    private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {
        //把数据添加到excel表格中
        Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
        downLoadExcel(fileName, response, workbook);
    }

    /**
     * excel 导出
     *
     * @param list         数据列表
     * @param pojoClass    pojo类型
     * @param fileName     导出时的excel名称
     * @param response
     * @param exportParams 导出参数(标题、sheet名称、是否创建表头,表格类型)
     */
    private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) throws IOException {
        //把数据添加到excel表格中
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
        downLoadExcel(fileName, response, workbook);
    }

    /**
     * excel 导出
     *
     * @param list         数据列表
     * @param pojoClass    pojo类型
     * @param fileName     导出时的excel名称
     * @param exportParams 导出参数(标题、sheet名称、是否创建表头,表格类型)
     * @param response
     */
    public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams, HttpServletResponse response) throws IOException {
        defaultExport(list, pojoClass, fileName, response, exportParams);
    }

    /**
     * excel 导出
     *
     * @param list      数据列表
     * @param title     表格内数据标题
     * @param sheetName sheet名称
     * @param pojoClass pojo类型
     * @param fileName  导出时的excel名称
     * @param response
     */
    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) throws IOException {
        defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName, ExcelType.XSSF));
    }

    /**
     * 根据模板生成excel后导出
     *
     * @param templatePath 模板路径
     * @param map          数据集合
     * @param fileName     文件名
     * @param response
     * @throws IOException
     */
    public static void exportExcel(TemplateExportParams templatePath, Map<String, Object> map, String fileName, HttpServletResponse response) throws IOException {
        Workbook workbook = ExcelExportUtil.exportExcel(templatePath, map);
        downLoadExcel(fileName, response, workbook);
    }

    /**
     * excel 导出
     *
     * @param list           数据列表
     * @param title          表格内数据标题
     * @param sheetName      sheet名称
     * @param pojoClass      pojo类型
     * @param fileName       导出时的excel名称
     * @param isCreateHeader 是否创建表头
     * @param response
     */
    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) throws IOException {
        ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
        exportParams.setCreateHeadRows(isCreateHeader);
        defaultExport(list, pojoClass, fileName, response, exportParams);
    }


    /**
     * excel下载
     *
     * @param fileName 下载时的文件名称
     * @param response
     * @param workbook excel数据
     */
    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * word下载
     *
     * @param fileName 下载时的文件名称
     * @param response
     * @param doc
     */
    private static void downLoadWord(String fileName, HttpServletResponse response, XWPFDocument doc) throws IOException {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/msword");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".docx", "UTF-8"));
            doc.write(response.getOutputStream());
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }


    /**
     * excel 导入
     *
     * @param file      excel文件
     * @param pojoClass pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(MultipartFile file, Class<T> pojoClass) throws IOException {

        if (file == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        try {
            return ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("excel文件不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel 导入
     *
     * @param filePath   excel文件路径
     * @param titleRows  表格内数据标题行
     * @param headerRows 表头行
     * @param pojoClass  pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
        if (StringUtils.isBlank(filePath)) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        params.setNeedSave(true);
        params.setSaveUrl("/excel/");
        try {
            return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("模板不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }


    /**
     * excel 导入
     *
     * @param file       上传的文件
     * @param titleRows  表格内数据标题行
     * @param headerRows 表头行
     * @param pojoClass  pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
        if (file == null) {
            return null;
        }
        try {
            return importExcel(file.getInputStream(), titleRows, headerRows, pojoClass);
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel 导入
     *
     * @param inputStream 文件输入流
     * @param titleRows   表格内数据标题行
     * @param headerRows  表头行
     * @param pojoClass   pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
        if (inputStream == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        params.setSaveUrl("/excel/");
        params.setNeedSave(true);
        try {
            return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("excel文件不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }


    /**
     * excel转html预览
     *
     * @param filePath 文件路径
     * @param response
     * @throws Exception
     */
    public static void excelToHtml(String filePath, HttpServletResponse response) throws Exception {
        ExcelToHtmlParams params = new ExcelToHtmlParams(WorkbookFactory.create(POICacheManager.getFile(filePath)), true);
        response.getOutputStream().write(ExcelXorHtmlUtil.excelToHtml(params).getBytes());
    }

    /**
     * word模板导出
     *
     * @param map
     * @param templatePath
     * @param fileName
     * @param response
     * @throws Exception
     */
    public static void WordTemplateExport(Map<String, Object> map, String templatePath, String fileName, HttpServletResponse response) throws Exception {
        XWPFDocument doc = WordExportUtil.exportWord07(templatePath, map);
        downLoadWord(fileName, response, doc);
    }

    /**
     * word模板导出多页
     *
     * @param list
     * @param templatePath
     * @param fileName
     * @param response
     * @throws Exception
     */
    public static void WordTemplateExportMorePage(List<Map<String, Object>> list, String templatePath, String fileName, HttpServletResponse response) throws Exception {
        XWPFDocument doc = new ParseWord07().parseWord(templatePath, list);
        downLoadWord(fileName, response, doc);
    }

    /**
     * excel 导入,有错误信息
     *
     * @param file      上传的文件
     * @param pojoClass pojo类型
     * @param <T>
     * @return
     */
    public static <T> ExcelImportResult<T> importExcelMore(MultipartFile file, Class<T> pojoClass) throws IOException {
        if (file == null) {
            return null;
        }
        try {
            return importExcelMore(file.getInputStream(), pojoClass);
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel 导入
     *
     * @param inputStream 文件输入流
     * @param pojoClass   pojo类型
     * @param <T>
     * @return
     */
    private static <T> ExcelImportResult<T> importExcelMore(InputStream inputStream, Class<T> pojoClass) throws IOException {
        if (inputStream == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(1);//表格内数据标题行
        params.setHeadRows(1);//表头行
        params.setSaveUrl("/excel/");
        params.setNeedSave(true);
        params.setNeedVerify(true);
        try {
            return ExcelImportUtil.importExcelMore(inputStream, pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("excel文件不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }
}



导入 demo 使用

    @Override
    public BaseResponse<UserImportResultsResp> batchUploadUserInFo(MultipartFile file, UserUploadReq userUploadReq) {
        log.info("批量人员导入入参:文件名称:{},文件大小:{},入参:{}", file.getOriginalFilename(), file.getSize(), JSON.toJSONString(userUploadReq));

            List<UserUploadExcelVo> userUploadExcelVos = ExcelUtils.importExcel(file, UserUploadExcelVo.class);
            }

配合excel校验(自校验及数据库校验,提示用户报错信息)

处理逻辑:在excel导入VO 中定义两个字段 (1、成功还是失败,2、错误提示信息),默认值都为成功。校验异常信息则插入,如果有多个则展示多个

                //先校验excel中,自校验
                this.excelCheck(userUploadExcelAccountMap, userUploadExcelNameMap, userUploadExcelMobileMap, u);

                //对数据库信息校验
                this.check(channelCode, staffResultVoMap, stringStaffResultVoMap, mobileStaffResultVoMap, u, channelDetail, channelMole);

======================================================================================
    private void excelCheck(Map<String, List<UserUploadExcelVo>> userUploadExcelAccountMap, Map<String, List<UserUploadExcelVo>> userUploadExcelNameMap, Map<String, List<UserUploadExcelVo>> userUploadExcelMobileMap, UserUploadExcelVo u) {
        //上级渠道
        String supChannel = u.getSupChannel();
        //子渠道
        String channel = u.getChannel();
        //姓名
        String name = u.getName();
        //账号
        String account = u.getAccount();
        //手机号
        String mobile = u.getMobile();
        //账号校验
        List<UserUploadExcelVo> userUploadExcelAccountVoList = userUploadExcelAccountMap.get(account);
        if (!CollectionUtils.isEmpty(userUploadExcelAccountVoList) && userUploadExcelAccountVoList.size() > 1) {
            setFailReason(u, "用户账号重复");
        }
        //上级渠道加子渠道加姓名 校验
        List<UserUploadExcelVo> userUploadExcelNameVoList = userUploadExcelNameMap.get(supChannel + channel + name);
        if (!CollectionUtils.isEmpty(userUploadExcelNameVoList)) {
            if (userUploadExcelNameVoList.size() > 1) {
                setFailReason(u, "用户姓名重复");
            }
        }
        //手机号校验
        List<UserUploadExcelVo> userUploadExcelVos = userUploadExcelMobileMap.get(mobile);
        if (!CollectionUtils.isEmpty(userUploadExcelVos)) {
            if (userUploadExcelVos.size() > 1) {
                setFailReason(u, "用户手机号重复");
            }
        }

    }

    private void check(String channelCode, Map<String, StaffResultVo> staffResultVoMap, Map<String, StaffResultVo> stringStaffResultVoMap, Map<String, StaffBase> mobileStaffResultVoMap, UserUploadExcelVo u, ChannelAndParentResp channelDetail, ChannelMole channelMole) {
        //姓名
        String name = u.getName();
        //账号
        String account = u.getAccount();
        //手机号
        String mobile = u.getMobile();
        //上级渠道
        String supChannel = u.getSupChannel();
        //子渠道
        String channel = u.getChannel();

        //未查询到渠道信息 不添加 set失败原因
        if (StringUtils.isEmpty(channelDetail)) {
            //未查到,顶级渠道特殊处理
            if (org.apache.commons.lang3.StringUtils.equals(channel, supChannel) && channelMole.getMoleName().equals(channel)) {
                u.setImportResult(PermissionConstant.SUCCESS);
            } else {
                setFailReason(u, "子渠道与上级渠道未匹配");
            }
            log.info("子渠道与上级渠道未匹配,退出循环!");
        }
        //校验姓名不能为空
        if (org.apache.commons.lang3.StringUtils.isBlank(name)) {
            setFailReason(u, "用户姓名为空");
        } else {
            //子渠道和姓名唯一
            if (!Objects.isNull(channelDetail)) {
                StaffResultVo staffResultVo = stringStaffResultVoMap.get(name + ":" + channelDetail.getChannelCode());
                if (Objects.nonNull(staffResultVo)) {
                    setFailReason(u, "用户名已存在");
                }
            }
        }

        //校验账号不能为空,且不能重复
        if (org.apache.commons.lang3.StringUtils.isBlank(account)) {
            setFailReason(u, "用户账号为空");
        } else {
            //查询该渠道下账号是否存在
            StaffResultVo staffResultVo = staffResultVoMap.get(accountHandleSuffix(account, channelCode, UserTypeEnum.ADD.getType()));
            if (!StringUtils.isEmpty(staffResultVo)) {
                setFailReason(u, "用户账号已存在");
            }
        }

        //手机号校验
        //如果手机号为空,不校验;
        //如果手机号不为空,则校验启用状态下的用户重有无重复,若重复则校验失败,标识“手机号重复”
        if (org.apache.commons.lang3.StringUtils.isNotBlank(mobile)) {
            StaffBase staffResultVo = mobileStaffResultVoMap.get(mobile);
            if (!StringUtils.isEmpty(staffResultVo)) {
                setFailReason(u, "用户手机号已存在");
            }
        }
    }
    
    private void setFailReason(UserUploadExcelVo u, String reason) {
        String failReason = u.getFailReason();
        u.setImportResult(PermissionConstant.FAIL);
        if (org.apache.commons.lang3.StringUtils.isBlank(failReason)) {
            u.setFailReason(reason);
        } else {
            u.setFailReason(u.getFailReason() + ";" + reason);
        }
    }

导出

    public void impPoolExcelExport(ImpQueryVo vo, HttpServletResponse response) {
            BasePageResponse<ImpPoolResultVo> impListPage = getImpListPage(voQuery);
            List<ImpPoolResultVo> result = impListPage.getResult();
                ExcelUtils.exportExcel(result, null, "重点池信息明细", ImpPoolResultVo.class, "重点池信息明细", response);
    }
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值