使用HSSFWorkbook并简单对数据分批查询完成导出excel功能(java实现)

本文介绍了一个使用Java实现的Excel导出功能,针对分批量查询数据以满足不超过8MB的要求。首先,解释了需求背景和可能遇到的问题,如目录结构处理、分批查询、文件名乱码等。接着,展示了后台代码实现,包括controller层的逻辑,如何处理文件名乱码,以及构建和生成Excel的数据操作。此外,还提到了涉及的服务层、DAO层和SQL操作,以及采购品的实体类和DTO封装。
摘要由CSDN通过智能技术生成

##需求及思路详解
根据产品及需求,我们需要实现对采购品各分类下的采购品进行导出功能。
(可能会出现的问题):①因为要对采购品各分类下采购品进行导出excel文件的功能,所以要考虑到根目录及子目录下采购品数量及导出的不同。②因为dba对数据要求每次查询不大于8mb,所以要对查询数据进行分批查询。③:文件名乱码问题。④:导入所需jar包到pom文件,因博主是由公司自己封装的esaypoi框架,故在此不列出。
##后台代码实现

##controller层#

    @ApiOperation(value = "导出采购品到Excel文件", httpMethod = "GET")
    @RequestMapping(value = "downCorpDataByExcel", method = RequestMethod.GET)
    public void downCorpDataByExcel(@RequestParam(required = false) String name,
                                    @RequestParam(required = false) String code,
                                    @RequestParam(required = false) String spec,
                                    @RequestParam(required = true) Long catalogId,
                                    HttpServletResponse response,
                                    HttpServletRequest request) {
        TRegUser user = UserContext.getUser();
        if (user == null) {
            logger.warn("获取不到用户信息");
            return;
        }
        CorpDirectorysQueryDto cdQuery = new CorpDirectorysQueryDto();
        //公司id
        cdQuery.setCompanyId(user.getCompanyId());
        //采购品名称模糊查询
        if (StringUtils.isNotBlank(name)) {
            cdQuery.setNameLike(name.trim());
        }
        //采购品编码模糊查询
        if (StringUtils.isNotBlank(code)) {
            cdQuery.setCodeLike(code.trim());
        }
        //采购品规格型号模糊查询
        if (StringUtils.isNotBlank(spec)) {
            cdQuery.setSpecLike(spec.trim());
        }
        //采购品分类id(有前端从tree中获取)
        if (catalogId != null) {
            //判断当前目录是否有子目录
         ①   boolean b = corpDirectoryService.hasExistChild(catalogId, user.getCompanyId());
            logger.info("方法downCorpDataByExcel,公司{}目录{}是否有子目录:{}", user.getCompanyId(), catalogId, b);
            if (b) {
                //如果有,查询下当前子目录路径,通过路径去查询采购品列表
           ②   CorpCatalogs corpCatalogs = corpCatalogService.findById(catalogId, user.getCompanyId());
                //会查询like  CONCAT(#{treepathLike},'%')
                cdQuery.setTreepathLike(corpCatalogs.getTreepath());
            } else {
                cdQuery.setCatalogId(catalogId);
            }
        }
        PageSet pageSet = new PageSet();
        pageSet.setSortColumn("abandon asc,create_time desc");

        String corpDataName = "采购品信息.xls";
        //处理文件名乱码的问题
       ③ corpDataName = encodeDownloadFile(corpDataName, request.getHeader("User-Agent"));
        response.setHeader("content-disposition", "attachment;filename=" + corpDataName);
        //根据文件名自动获得文件类型
        response.setContentType(request.getSession().getServletContext().getMimeType(corpDataName));
        //告知服务器使用什么编码
        response.setCharacterEncoding("UTF-8");
        try {
          ④  HSSFWorkbook workbook = corpDirectoryService.createWorkbook(cdQuery, pageSet);
            workbook.write(response.getOutputStream());
        } catch (Exception e) {
            logger.error("构建excel出错", e);
        }
    }

/**判断当前目录是否有子目录
*/
①:

public boolean hasExistChild(Long catalogId, Long companyId) {
        ServiceResult<Boolean> booleanResult = dubboCorpCatalogsService.hasExistChild(catalogId, companyId);
        if (!booleanResult.getSuccess()) {
            logger.error("{}调用{}时发生未知异常,error Message:{}", "cn.bidlink.procurement.materials.app.service.CorpDirectoryService.hasExistChild",
                    " dubboCorpCatalogsService.hasExistChild(catalogId,companyId)", booleanResult.getCode() + "_" + booleanResult.getMessage());
            throw new RuntimeException("err_code:" + booleanResult.getCode() + ",err_msg:" + booleanResult.getMessage());
        }
        Boolean result = booleanResult.getResult();
        if (result == null) {
            logger.warn("cn.bidlink.procurement.materials.app.service.CorpDirectoryService.hasExistChild时未获取到结果");
        }
        return result;
    }

/**
如果有子目录,查询下当前子目录路径,通过路径去查询采购品列表
*/
②:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值