Java微服务之文件上传下载导入导出Excel详情源码

本文详细介绍了在Java微服务环境中,如何使用wfw-erp-api-web和wfw-erp-service服务进行文件操作,特别是Excel的上传、下载、导入和导出。涉及的关键组件包括ErpMasterDataExcelController、ErpCompanyService及其实现类,以及MasterDataImportTaskService和相关的DAO层。还提到了监听器ExcelHeadListener,用于分析Excel头部信息。
摘要由CSDN通过智能技术生成

wfw-erp-api-web服务

ErpMasterDataExcelController

package cn.com.esgcc.wfw.web.controller.web;

import cn.com.esgcc.wfw.common.service.ErpServiceResult;
import cn.com.esgcc.wfw.common.service.ServiceResult;
import cn.com.esgcc.wfw.erp.company.entity.po.ErpCompany;
import cn.com.esgcc.wfw.erp.company.service.ErpCompanyServiceBiz;
import cn.com.esgcc.wfw.erp.enums.MasterDataEnum;
import cn.com.esgcc.wfw.erp.enums.MasterDataImportTaskStatus;
import cn.com.esgcc.wfw.erp.masterdata.entity.po.MasterDataImportTask;
import cn.com.esgcc.wfw.erp.masterdata.entity.vo.ImportTaskVo;
import cn.com.esgcc.wfw.erp.masterdata.service.MasterDataImportTaskService;
import cn.com.esgcc.wfw.erp.masterdata.service.MasterDataImportTaskServiceBiz;
import cn.com.esgcc.wfw.fastdfs.service.FastdfsServiceBiz;
import cn.com.esgcc.wfw.gwutil.log.LogUtil;
import cn.com.esgcc.wfw.organisation.entity.po.Organisation;
import cn.com.esgcc.wfw.organisation.service.OrganisationServiceBiz;
import cn.com.esgcc.wfw.web.ApiConstants;
import cn.com.esgcc.wfw.web.ApiResultCode;
import cn.com.esgcc.wfw.web.base.APIResponse;
import cn.com.esgcc.wfw.web.base.BaseController;
import cn.com.esgcc.wfw.web.entity.mapper.ImportTaskMapper;
import cn.com.esgcc.wfw.web.entity.req.ImportTaskReq;
import cn.com.esgcc.wfw.web.session.SessionUser;
import cn.com.esgcc.wfw.web.util.easyexcel.ExcelHeadListener;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@RestController
public class ErpMasterDataExcelController extends BaseController {
   

    private static final Logger logger = LoggerFactory.getLogger(ErpMasterDataExcelController.class);

    @Autowired
    private ErpCompanyServiceBiz erpCompanyServiceBiz;

    @Autowired
    private MasterDataImportTaskService masterDataImportTaskService;

    @Autowired
    private MasterDataImportTaskServiceBiz masterDataImportTaskServiceBiz;

    @Autowired
    private ImportTaskMapper importTaskMapper;

    @Autowired
    private FastdfsServiceBiz fastdfsServiceBiz;

    @Autowired
    private OrganisationServiceBiz organisationServiceBiz;



    @PostMapping(ApiConstants.SYS_IMPORT_EXCEL+"{type}")
    public APIResponse companyExcleImport(MultipartFile file, HttpServletRequest request,@PathVariable Integer type){
   
        String check = fileCheck(file);
        if(StringUtils.isNotBlank(check)){
   
            return APIResponse.fail(ApiResultCode.FAIL,check);
        }
        String orgCode = request.getParameter("orgCode");
        if(StringUtils.isBlank(orgCode)){
   
            return APIResponse.fail(ApiResultCode.FAIL, "公司集成编码不能为空");
        }
        
        //根据集成编码查询公司集成配置
        ErpServiceResult result = erpCompanyServiceBiz.selectByCompanyCode(orgCode);
        
        ErpCompany erpCompany= (ErpCompany) result.getResult();
        if(erpCompany == null){
   
            return APIResponse.fail(ApiResultCode.FAIL, "公司集成编码不存在,无法导入数据");
        }
        MasterDataEnum masterDataEnum = MasterDataEnum.type(type);
        if(masterDataEnum == null){
   
            return APIResponse.fail(ApiResultCode.FAIL, "数据类型不存在,无法导入数据");
        }
        String aggregateType = request.getParameter("aggregateType");
        if(StringUtils.isBlank(aggregateType)){
   
            return APIResponse.fail(ApiResultCode.FAIL, "集成方式不能为空");
        }
        /*
          *对文件进行处理将其上传文件到服务器 获取上传路径
          * 处理文件名称
         */
        String filename = file.getOriginalFilename();
        try {
   
            InputStream inputStream = file.getInputStream();
            ExcelHeadListener headlis = new ExcelHeadListener(masterDataEnum);
            EasyExcel.read(inputStream, headlis).sheet().headRowNumber(2).doRead();
            if(headlis.getFlag()){
   
            //调用到fastdfs微服务 得到上传路径  这里也可以是本地路径
                String filePath = fastdfsServiceBiz.uploadFaceImg(file.getBytes(), filename);
                MasterDataImportTask task = buildTask(filename, filePath, erpCompany.getId(), erpCompany.getCompanyName(),type,orgCode,aggregateType);
                masterDataImportTaskService.save(task);
                return APIResponse.success(ApiResultCode.SUCCESS);
            }else{
   
                return APIResponse.fail(ApiResultCode.FAIL,"导入模板不正确,无法导入");
            }
        } catch (IOException e) {
   
            LogUtil.encError(logger, e.getMessage(), e);
            return APIResponse.fail(ApiResultCode.FAIL, "上传文件失败");
        }
    }

    /**
     * 基础数据导入任务查询
     *
     * @param req
     * @return
     */
    @PostMapping(ApiConstants.SYS_IMPORT_EXCEL_LIST)
    public APIResponse importTaskList(@RequestBody ImportTaskReq req) {
   
        try {
   
            //1.设置参数
            ImportTaskVo taskVo = importTaskMapper.importTaskReqToVo(req);

            //2.调用service服务
            ServiceResult result = masterDataImportTaskServiceBiz.findByVo(taskVo);

            //3.判断查询结果并根据查询结果响应请求
            if (!result.getStatus()) {
   
                return new APIResponse(ApiResultCode.FAIL, result.getMsg());
            }
            return new APIResponse(result.getResult());
        } catch (Exception e) {
   
            LogUtil.encError(logger, "查询任务列表方法(findByVo)出现异常: ", e);
            return new APIResponse(ApiResultCode.SYSTEM_ERROR);
        }
    }

    /**
     * 错误文件下载
     * @param id
     * @param resp
     */
    @PostMapping(ApiConstants.SYS_IMPORT_EXCEL_DOWNLOAD)
    public void downloadExcel(@PathVariable("id") Integer id, HttpServletResponse resp) {
   
        MasterDataImportTask importTask = masterDataImportTaskService.getByPrimaryKey(id);
        if(importTask != null || importTask.getId() != null){
   
            OutputStream os = null;

            try {
   
                resp.setContentType("application/octet-stream");
                // 表示不能用浏览器直接打开
                resp.setHeader("Connection", "close");
                // 告诉客户端允许断点续传多线程连接下载
                resp.setHeader("Accept-Ranges", "bytes");
                resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(importTask.getFileName(), "UTF-8"));
                resp.setCharacterEncoding("UTF-8");
//                resp.setHeader("Transfer-Encoding", "chunked");
                os = resp.getOutputStream();

                byte[] download = fastdfsServiceBiz.download(importTask.getDownloadUrl());
//                resp.addIntHeader("Content-length",download.length );

                LogUtil.encInfo(logger, "文件服务器,下载excel:{}", null == download);

                os.write(download);
            } catch (IOException e) {
   
                LogUtil.encError(logger, "下载excel异常:{}", e);
            } finally {
   
                try {
   
                    if (os != null) {
   
                        os.close();
                    }
                } catch (IOException e) {
   
                    LogUtil.encError(logger, "下载excel关闭流异常", e);
                }
            }
        }

    }
	
	/**
	*判断文件是否符合上传类型格式
	*/
    private String fileCheck(MultipartFile file){
   
        String fileExt = FilenameUtils.getExtension(file.getOriginalFilename());
        if (!"xlsx".equalsIgnoreCase(fileExt) && !"xls".
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值