🍁 作者:知识浅谈,CSDN签约讲师&博客专家,华为云云享专家,阿里云专家博主,InfoQ签约作者 📌 擅长领域:全栈工程师、爬虫、ACM算法,大数据,深度学习 💒 公众号:知识浅谈

🎈先上代码和案例

  • 案例如下:可以从下图中看到有三层标题 在这里插入图片描述
  • 总的代码如下
    @RestController
    @RequestMapping("/test")
    public class Test{
    	@GetMapping("/download")
    	public void download(HttpServletResponse response) {
            //根据角色不同,打印的汇总表的人不一样
            try {
                //添加两个数据
                List<A> list =  new ArrayList<>();
                A a = new A();
                a.setA1("1");a.setA2("111");a.setA3("111");a.setA4("222");a.setA5("333");
                A b = new A();
                b.setA1("1");b.setA2("111");b.setA3("112");b.setA4("223");b.setA5("334");
                list.add(a);  list.add(b);
    
                String sheetName = "测试";
                String fileName = IdUtil.fastSimpleUUID() + "_" + sheetName + ".xlsx"; //设置文件名
                FileUtils.setAttachmentResponseHeader(response, fileName);
                response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
                ServletOutputStream os = response.getOutputStream(); 
    
    
                EasyExcel.write(os, A.class)
                    .autoCloseStream(false)
                    // 自动适配
                    .registerWriteHandler(new CellMergeStrategy(list, true))   // 合并处理器
                    .registerWriteHandler(new ExcelDownHandler(null))// 添加下拉框操作
                    .registerWriteHandler(new CellWriteHandler() {
                        @Override
                        public void afterCellDispose(CellWriteHandlerContext context) { 
                            if(BooleanUtils.isNotTrue(context.getHead())){ //设置内容格式
                                WriteCellData<?> firstCellData = context.getFirstCellData();
                                WriteCellStyle cellStyle = firstCellData.getOrCreateStyle();
                                //设置垂直居中
                                cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
                                cellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
                                //设置框线
                                cellStyle.setBorderTop(BorderStyle.THIN);
                                cellStyle.setBorderBottom(BorderStyle.THIN);
                                cellStyle.setBorderLeft(BorderStyle.THIN);
                                cellStyle.setBorderRight(BorderStyle.THIN);
    
                                //设置字体
                                WriteFont writeFont = new WriteFont();
                                writeFont.setFontHeightInPoints((short) 10);
                                cellStyle.setWriteFont(writeFont);
    
                                //单独设置长度
                                List<String> headNameList = context.getHeadData().getHeadNameList();
                                String headName = headNameList.get(1);
                                if(headName.contains("特别标题")){
                                    int columnIndex = context.getCell().getColumnIndex();
                                    WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder();
                                    //设置符合条件的列的宽度
                                    writeSheetHolder.getSheet().setColumnWidth(columnIndex,60*256);
                                }
                            }else{//设置表头格式
                                if (context.getCell().getStringCellValue().contains("总表头")) {
                                    WriteCellData<?> firstCellData = context.getFirstCellData();
                                    WriteCellStyle headStyle = firstCellData.getOrCreateStyle();
    		//设置总表头为加粗且字体大小为10
                                    WriteFont writeFont = new WriteFont();
                                    writeFont.setFontHeightInPoints((short) 18);
                                    writeFont.setBold(true);
                                    headStyle.setWriteFont(writeFont);
                                }
                            }
                        }
                    })
                    // 大数值自动转换 防止失真
                    .registerConverter(new ExcelBigNumberConvert())
                    .head(creatHead())
                    .sheet(sheetName)
                    .doWrite(list);
            } catch (Exception e) {
                log.error("文件生成异常,{}", e.getMessage());
            }
        }
    
        private List<List<String>> creatHead() {
            String title = LocalDate.now().getYear()+"总表头";
            List<List<String>> lists = new ArrayList<>();
    
            String[] titles = {"序号","特别标题"};
            String[] vote = {"子标题1", "子标题2","子标题3"};
    
            //设计第一部分表头
            for (String s : titles) {
                ArrayList<String> head = new ArrayList<>();
                head.add(title);
                head.add(s);
                lists.add(head);
            }
            //处理第二部分表头
            for (String s : vote) {
                ArrayList<String> head = new ArrayList<>();
                head.add(title);
                head.add("子标题");
                head.add(s);
                lists.add(head);
            }
            return lists;
        }
    }
    
    @Data  //使用这个注解需要在maven中引入lombok 依赖
    class A{
          	private String a1;
    	private String a2;
    	private String a3;
    	private String a4;
    	private String a5;
    }
    

🎈复杂表头的生成

  • 表头的构建 是根据表头最后一行的个数来确定的,比如我们要有 "序号","特别标题","子标题1", "子标题2","子标题3" 5个
  • "子标题1", "子标题2","子标题3" 这三个是二级标题
  • 总结一下经验:从第一行标题到最后一行标题是一个list 然后加入到list<list< string>> lists 中
   private List<List<String>> creatHead() {
       String title = LocalDate.now().getYear()+"总表头";
       List<List<String>> lists = new ArrayList<>();

       String[] titles = {"序号","特别标题"};
       String[] vote = {"子标题1", "子标题2","子标题3"};

       //设计第一部分表头
       for (String s : titles) {
           ArrayList<String> head = new ArrayList<>();
           head.add(title);
           head.add(s);
           lists.add(head);
       }
       //处理第二部分表头
       for (String s : vote) {
           ArrayList<String> head = new ArrayList<>();
           head.add(title);
           head.add("子标题");
           head.add(s);
           lists.add(head);
       }
       return lists;
   }

🍚总结

大功告成,撒花致谢🎆🎇🌟,关注我不迷路,带你起飞带你富。 Writted By 知识浅谈