在使用导入导出功能时,会有选中多条甚至几百上千条进行导出,这个时候就是需要批量了,刚开始只会导全部和导单笔,现在配合这样一条工具类就可以了。
1.工具类格式
public static List<List<String>> splitStringList(List<String> list, int len) {
if (list == null || list.size() == 0 || len < 1) {
return null;
}
List<List<String>> result = new ArrayList<List<String>>();
int size = list.size();
int count = (size + len - 1) / len;
for (int i = 0; i < count; i++) {
List<String> subList = list.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
result.add(subList);
}
return result;
}
这是一种list里面进行String类型的一种写法,当然,如果你想写实体或者其他类型的格式只需要替换即可。下面给出另外一种格式的工具类形式。
public static List<List<FlxCreditcardPayment>> splitListFlxCreditcardPayment(List<FlxCreditcardPayment> list, int len) {
if (list == null || list.size() == 0 || len < 1) {
return null;
}
List<List<FlxCreditcardPayment>> result = new ArrayList<List<FlxCreditcardPayment>>();
int size = list.size();
int count = (size + len - 1) / len;
for (int i = 0; i < count; i++) {
List<FlxCreditcardPayment> subList = list.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
result.add(subList);
}
return result;
}
这就是典型的一种使用实体类的格式。
2.页面获取批量id
我采用的是通过在页面定义一个form表单,通过选中回显到form表单里面,通过form表单的submit进行提交,后台接收即可。
2.1定义表单,获取批量id回显。
<table id="table1" lay-filter="test">
</table>
<form action="/logs/logtest" id="tableForm" name="tableForm" method="post" >
<div id="test">
</div>
</form>
function toOut(){
var arr=[];
var checkStatus = table.checkStatus('table1');
var datas = checkStatus.data;
//var params = JSON.stringify(datas);
for(var i=0;i<datas.length;i++){
var ipt = document.createElement("input");
ipt.setAttribute("type","hidden");
ipt.setAttribute("name","params");
ipt.setAttribute("value",datas[i].id);
var div = document.getElementById("test");
div.appendChild(ipt);
arr.push(datas[i].id);
}
$("#tableForm").submit();
}
点击导出按钮,会将获取到的数组里面的id回显到form表单中,在这里可以看到在表单中定义了一个div,里面给定相应的元素,并赋给相应的属性,其中,params就是获取到的id,最后,通过submit表单进行提交到后台。
3,后台接收,调用相应的工具类进行截取操作
@ApiOperation("log导出excel测试")
@PostMapping("/logtest")
public void downloadExcelLog(HttpServletRequest request,HttpServletResponse response) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
String [] ar = (request.getParameterValues("params"));
List<String> list = new ArrayList<String>();
for (String str : ar) {
list.add(str);
}
List<List<String>> listss = PaymentUtil.splitStringList(list, 100);
List<SysLogsDto> lists = new ArrayList<SysLogsDto>();
for (List<String> end : listss) {
lists = sysLogsDao.getById(end);;
}
String fileName = "log测试excel导出下载";
ExcelUtil.excelExport4Template(
fileName, ExcelTemplate.LOG_INFO_TEMPLATE,
lists, response,SysLogsDto.class);
}
首先定义一个数组接收前台传过来的id,定义一个空的list集合进行遍历存值进行类型转换,注意这里的泛型是String,其次,调用工具类方法,第一个参数就是装载id的list集合,第二个就是批量条数,这里的批量条数自己可以根据实际情况测试后进行定义,最终用一个新的list集合接收查询出来的数据,最后通过模板进行输出即可。
4.sql语句
<select id="getById" parameterType="java.util.List" resultType="com.youfuli.admin.server.dto.SysLogsDto">
SELECT
*
FROM
t_sys_logs as t
where t.id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
order by t.createtime desc
</select>
其中,主要是foreach里面接受后台传过来的批量id进行批量处理。
5.日期格式转换
在导出操作很有可能会出现这样一种情况,日期格式不符合相应的规范,这个时候就需要比较相应的数据格式进行转换,关键词是instanceof。
首先定义一个静态的时间类型的格式:
public static final SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
其次在进行循环判断导出的数据是否是日期格式,如果是,就转换,不是则继续执行。
objects[j] = method.invoke(m, null);
if(objects[j] instanceof Date){
objects[j] = sdf.format(new Date());
}
如果数据格式中的类型是date,则转换成我们想要的类型。
6.注意事项
第一点:注意前台是否拿到值,后台是否接收到值,注意调试找问题,LZ亲测。
第二点:注意mybatis中的一些转义字符的处理,比如大于,小于,这些要记住怎么转义。
<if test="params.beginTime != null and params.beginTime != ''">
and t.createTime >= #{params.beginTime}
</if>
其实你会发现粘贴这几行代码到博客上面,会自动帮你转成相应的格式,这里的>代表的就是>
多实践,才有收获。