JAVA -- 导出动态excel表,并且表头是组合表头
背景:
接到一个需求,要导出一批商店的商品是否有存货和订单的报表,一开始就一个商品一条数据,但是这样业务在看报表感觉不够直观,因为一个商店有多个商品,这样看一个店需要看很多行,于是让我把一个店所有行的商品信息汇聚成一行来展示,一个店多个商品就有多列,少商品就有少列,这里面涉及到一些数据列对齐的就不细讲了,大概导出模板如下
代码:
使用的是 EasyExcel ,逻辑代码大致如下
@Override public void export(HttpServletResponse response, YxStorePrototypeRequest req) throws Exception{ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("XXX报表", "UTF-8").replaceAll("\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8" + fileName + ".xlsx"); //数据 自己根据实际需求去调用数据获取方法 //List<PrototypeLoadInfoDTO> data = //表头 自己根据实际需求去调用数据获取方法 //List<String> goodsCodeList = //创建表头 List<List<String>> header = new ArrayList<>(); List<String> cellContain7 = new ArrayList<>(); cellContain7.add("商店"); header.add(cellContain7); //组合表头如果值相同会自动合并 for (int i=0 ; i<10 ;i++) { List<String> tempZuhe1 = new ArrayList<>(); tempZuhe1.add("商品"+i); tempZuhe1.add("库存"); header.add(tempZuhe1); List<String> tempZuhe2 = new ArrayList<>(); tempZuhe2.add("商品"+i); tempZuhe2.add("订单"); header.add(tempZuhe2); } //表格数据 List<List<String>> datas = new ArrayList<>(); //每个循环都是一行数据 for (int i=0 ; i<10 ;i++){ //一行数据,用list保存 自行组装,下面仅供参考 List<String> temp = new ArrayList<>(); temp.add("否"); temp.add("否"); temp.add("否"); temp.add("否"); temp.add("否"); temp.add("否"); ... datas.add(temp); } EasyExcel.write(response.getOutputStream()) .head(header) .registerWriteHandler(new SimpleColumnWidthStyleStrategy(32)) .sheet("模板").doWrite(datas); }