这里入坑,用的是以前别人用过的项目框架,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,完工