查询数据库数据填充到开始定好的excel模板

这里入坑,用的是以前别人用过的项目框架,excel导出用到的jar版本太多出现冲突,分别有3.8,3.13,3.15,3.17版本,折腾了一天

实际上需要用到的jar有,最后采用的是1.5版本竟然可以了,最新的类最全,不过还是找最合适的

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-scratchpad</artifactId>
	<version>3.17</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>3.17</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml-schemas</artifactId>
	<version>3.17</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-excelant</artifactId>
	<version>3.17</version>
</dependency>

前台代码:

 $('#getCustomerInfo').on('click', function () {
        var checkStatus = table.checkStatus('searchReloadCustomer');
        if (checkStatus.data.length === 0) {
            layer.msg('请最少选择一条数据');
            return;
        }
        var ids = [];
        for (var i = 0; i < checkStatus.data.length; i++) {
            ids.push(checkStatus.data[i].id);
        }

        common.ajaxDownloader({
            url: url_customer + "api/customer/getCustomerInfoByExcel?token=" + getToken(),
            data: {ids: ids.join(",")}
        });
    });

后台controller

service实现的代码——获取数据

public Map<String, Object> findCustomerInfoTemplateModel(String[] ids) {
		Map<String, Object> model = new HashMap<>(16);
        List<CustomerVoTemplateModel> templateVoList = new ArrayList<>();
        CustomerVoTemplateModel customerVoTemplateModel = new CustomerVoTemplateModel();
        for (String id : ids) {
        	CustomerVo customerVo = customerMapper.getCustomerVoById(id);
        	customerVoTemplateModel.setId(id); 
        	//用户名
        	customerVoTemplateModel.setUsername(customerVo.getUsername());
        	//用户编码
        	customerVoTemplateModel.setCustomerCode(customerVo.getCustomerCode());
        	//姓名
        	customerVoTemplateModel.setName(customerVo.getName());
        	//性别
        	if(customerVo.getGenderType() == null || "".equals(customerVo.getGenderType())){
        		customerVoTemplateModel.setGenderType(ConstantUtil.GENDER_SECRECY_ZH);
        	}else{
        		customerVoTemplateModel.setGenderType((ConstantUtil.GENDER_MAN_EN.equals(customerVo.getGenderType())) ? ConstantUtil.GENDER_WOMAN_ZH : ConstantUtil.GENDER_MAN_ZH);
        	}
        	//手机号
        	customerVoTemplateModel.setTelephone(customerVo.getTelephone());
        	//微信号
        	customerVoTemplateModel.setWechatOpenid(customerVo.getWechatOpenid());
        	//来源
        	customerVoTemplateModel.setRegisterFrom(ConstantUtil.COUPON_ORIGIN_ZC.equals(customerVo.getRegisterFrom())
								        			? ConstantUtil.CUSTOMER_CREATE_ZH 
								        			: ConstantUtil.CUSTOMER_REGISTER_ZH);
        	//注册日期
        	customerVoTemplateModel.setCreateTime(customerVo.getCreateTime());
        	templateVoList.add(customerVoTemplateModel);
        }
        
        model.put("templateVoList", templateVoList);
        return model;
	}

将数据导出为excel,controller中的这行代码

导出方法代码:

 public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException {
        Context context = PoiTransformer.createInitialContext();
        if (model != null) {
            for (String key : model.keySet()) {
                context.putVar(key, model.get(key));
            }
        }
        JxlsHelper jxlsHelper = JxlsHelper.getInstance();
        Transformer transformer = jxlsHelper.createTransformer(is, os);
        //获得配置
        JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
        //设置静默模式,不报警告
        evaluator.getJexlEngine().setSilent(true);
        //函数强制,自定义功能
        Map<String, Object> funcs = new HashMap<String, Object>(16);
        //添加自定义功能
        funcs.put("utils", new TemplateExcelUtil());
        evaluator.getJexlEngine().setFunctions(funcs);
        //必须要这个,否者表格函数统计会错乱
        jxlsHelper.setUseFastFormulaProcessor(false).processTemplate(context, transformer);
        is.close();
        os.close();
    }

我这里的导出是指定导出模板,然后直接会在对应位置填充值

上面的日期这么写

这里有一个问题,上面我的service层因为

CustomerVoTemplateModel customerVoTemplateModel = new CustomerVoTemplateModel();

这行代码的位置不对,导致批量导出时出现10条同样的数据,把上面的代码放在for循环的里面就好了,ok,完工

猜你喜欢

转载自blog.csdn.net/Sun_of_Rainy/article/details/88974454
今日推荐