• excel 动态列导出


    1
    excel动态列,只好用poi来写了,也并不复杂,一样就这个件事情抽像为几步,就是套路了,开发效率就上去了。
    1 准备空模板
    导出操作与excel模板的导出一样,可以参考excel导出标准化
    1
    2 自定义SheetWriteHandler
    要通过pos自己创建每一样,像模板一样创建即可.

    WriteSheet sheet0 = EasyExcel.writerSheet(0)
                    //标题
                    .registerWriteHandler(new GoodsInvRdSumWriteHandler(goodsInvRdSumListDto.getHeader()))
                    .build();
    
    • 1
    • 2
    • 3
    • 4

    主要重写afterSheetCreate,也就是一行行的创建excel模板

     @Override
        public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
            Workbook workbook = writeWorkbookHolder.getWorkbook();
            this.centerCellStyle = createCellContentStyle(workbook,HorizontalAlignment.CENTER,BorderStyle.THIN);
            this.leftCellStyle = createCellContentStyle(workbook,HorizontalAlignment.LEFT,BorderStyle.THIN);
            this.rightCellStyle = createCellContentStyle(workbook,HorizontalAlignment.RIGHT,BorderStyle.THIN);
            Sheet sheet = workbook.getSheetAt(0);
            row1(sheet,workbook);
            row2(sheet,workbook);
            row34(sheet);
            row5(sheet);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    第一行

      /**
         * 第一行是标题
         * @param sheet
         */
        private void row1(Sheet sheet,Workbook workbook){
            Row row = sheet.createRow(0);
            row.setHeight((short) (50 * 20));
            Cell cell = row.createCell(0);
            cell.setCellValue("商品收发汇总表");
            cell.setCellStyle(getHeadCellStyle(workbook, this.centerCellStyle));
            CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, 9+this.dynamicHeader.size()*2-1);
            sheet.addMergedRegionUnsafe(cellRangeAddress);
            setMergedRegionStyleNoBorder(sheet, cellRangeAddress);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    第二行

    /**
         * 第二行 公司名称、日期
         * @param sheet
         */
        private void row2(Sheet sheet,Workbook workbook){
            Row row = sheet.createRow(1);
            CellStyle subHeaderStyle = createCellContentStyle(workbook, HorizontalAlignment.LEFT,BorderStyle.NONE);
            // 公司名称
            Cell cell = row.createCell(0);
            cell.setCellStyle(subHeaderStyle);
            cell.setCellValue("公司:{companyName}                               日期:{startBillDate}至{endBillDate}");
            sheet.addMergedRegionUnsafe(new CellRangeAddress(1, 1, 0, 9+this.dynamicHeader.size()*2-1));
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    第三行,第四行涉及到动态列的创建和合并表头

     private void row34(Sheet sheet){
            Row row3 = sheet.createRow(2);
            Row row4 = sheet.createRow(3);
            // 商品编码
            Cell cell = row3.createCell(0);
            cell.setCellValue("商品编码");
            cell.setCellStyle(this.centerCellStyle);
            CellRangeAddress cellRangeAddress = new CellRangeAddress(2, 3, 0, 0);
            sheet.addMergedRegionUnsafe(cellRangeAddress);
            setMergedRegionStyle(sheet, cellRangeAddress);
            // 商品名称
            cell = row3.createCell(1);
            cell.setCellValue("商品名称");
            cell.setCellStyle(this.centerCellStyle);
            cellRangeAddress = new CellRangeAddress(2, 3, 1, 1);
            sheet.addMergedRegionUnsafe(cellRangeAddress);
            setMergedRegionStyle(sheet, cellRangeAddress);
            // 商品规格
            cell = row3.createCell(2);
            cell.setCellValue("商品规格");
            cell.setCellStyle(this.centerCellStyle);
            cellRangeAddress = new CellRangeAddress(2, 3, 2, 2);
            sheet.addMergedRegionUnsafe(cellRangeAddress);
            setMergedRegionStyle(sheet, cellRangeAddress);
            //动态列
            int dySize = this.dynamicHeader.size();
            if (dySize>0){
                for (int i=0; i<dySize; i++){
                    Map<String,Object> colMap = this.dynamicHeader.get(i);
                    String busiType = String.valueOf(colMap.get("prop")).replace("busi_", BaseConstant.Separate.NONE);
                    BusinessTypeEnum businessTypeEnum = BusinessTypeEnum.getInvBusinessTypeEnum(busiType);
                    // 第3行——合并表头
                    cell = row3.createCell(3+i*2);
                    cell.setCellValue(businessTypeEnum.display());
                    cell.setCellStyle(this.centerCellStyle);
                    cellRangeAddress = new CellRangeAddress(2, 2, 3+i*2, 4+i*2);
                    sheet.addMergedRegionUnsafe(cellRangeAddress);
                    setMergedRegionStyle(sheet, cellRangeAddress);
                    // 第4行——成本
                    cell = row4.createCell(3+i*2);
                    cell.setCellStyle(this.centerCellStyle);
                    cell.setCellValue("数量");
                    // 第4行——数量
                    cell = row4.createCell(4+i*2);
                    cell.setCellStyle(this.centerCellStyle);
                    cell.setCellValue("成本");
    
                }
            }
            // 入库合计
            cell = row3.createCell(3+dySize*2);
            cell.setCellValue("入库合计");
            cell.setCellStyle(this.centerCellStyle);
            cellRangeAddress = new CellRangeAddress(2, 2, 3+dySize*2, 4+dySize*2);
            sheet.addMergedRegionUnsafe(cellRangeAddress);
            setMergedRegionStyle(sheet, cellRangeAddress);
            // 入库合计——成本
            cell = row4.createCell(3+dySize*2);
            cell.setCellStyle(this.centerCellStyle);
            cell.setCellValue("数量");
            // 入库合计——数量
            cell = row4.createCell(4+dySize*2);
            cell.setCellStyle(this.centerCellStyle);
            cell.setCellValue("成本");
            // 出库合计
            cell = row3.createCell(5+dySize*2);
            cell.setCellValue("出库合计");
            cell.setCellStyle(this.centerCellStyle);
            cellRangeAddress = new CellRangeAddress(2, 2, 5+dySize*2, 6+dySize*2);
            sheet.addMergedRegionUnsafe(cellRangeAddress);
            setMergedRegionStyle(sheet, cellRangeAddress);
            // 出库合计——成本
            cell = row4.createCell(5+dySize*2);
            cell.setCellStyle(this.centerCellStyle);
            cell.setCellValue("数量");
            // 出库合计——数量
            cell = row4.createCell(6+dySize*2);
            cell.setCellStyle(this.centerCellStyle);
            cell.setCellValue("成本");
            // 结余
            cell = row3.createCell(7+dySize*2);
            cell.setCellValue("结余");
            cell.setCellStyle(this.centerCellStyle);
            cellRangeAddress = new CellRangeAddress(2, 2, 7+dySize*2, 8+dySize*2);
            sheet.addMergedRegionUnsafe(cellRangeAddress);
            setMergedRegionStyle(sheet, cellRangeAddress);
            // 结余——成本
            cell = row4.createCell(7+dySize*2);
            cell.setCellStyle(this.centerCellStyle);
            cell.setCellValue("数量");
            // 结余——数量
            cell = row4.createCell(8+dySize*2);
            cell.setCellStyle(this.centerCellStyle);
            cell.setCellValue("成本");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95

    第五行是数据域

    /**
         * 第五行:数据域
         * @param sheet
         */
        private void row5(Sheet sheet){
            Row row = sheet.createRow(4);
            // 商品编码
            Cell cell = row.createCell(0);
            cell.setCellStyle(this.leftCellStyle);
            cell.setCellValue("{.stockCode}");
            // 商品名称
            cell = row.createCell(1);
            cell.setCellStyle(this.leftCellStyle);
            cell.setCellValue("{.stockName}");
            // 商品规格
            cell = row.createCell(2);
            cell.setCellStyle(this.leftCellStyle);
            cell.setCellValue("{.stockModel}");
            // 动态列
            int dySize = this.dynamicHeader.size();
            if (!CheckEmptyUtil.isEmpty(this.dynamicHeader)){
                for (int i=0; i<dySize; i++){
                    Map<String,Object> colMap = this.dynamicHeader.get(i);
                    List<Map<String,String>> chidren = (List<Map<String,String>>)colMap.get("children");
                    // 数量
                    Map<String,String> countMap = chidren.get(0);
                    cell = row.createCell(3+i*2);
                    cell.setCellStyle(this.rightCellStyle);
                    cell.setCellValue(String.format("{.%s}", countMap.get("prop")));
                    // 成本
                    Map<String,String> costMap = chidren.get(1);
                    cell = row.createCell(4+i*2);
                    cell.setCellStyle(this.rightCellStyle);
                    cell.setCellValue(String.format("{.%s}", costMap.get("prop")));
                }
            }
            // 入库合计
            cell = row.createCell(3+dySize*2);
            cell.setCellStyle(this.rightCellStyle);
            cell.setCellValue("{.count_total_in}");
            cell = row.createCell(4+dySize*2);
            cell.setCellStyle(this.rightCellStyle);
            cell.setCellValue("{.cost_total_in}");
            // 出库合计
            cell = row.createCell(5+dySize*2);
            cell.setCellStyle(this.rightCellStyle);
            cell.setCellValue("{.count_total_out}");
            cell = row.createCell(6+dySize*2);
            cell.setCellStyle(this.rightCellStyle);
            cell.setCellValue("{.cost_total_out}");
            // 结余
            cell = row.createCell(7+dySize*2);
            cell.setCellStyle(this.rightCellStyle);
            cell.setCellValue("{.final_count}");
            cell = row.createCell(8+dySize*2);
            cell.setCellStyle(this.rightCellStyle);
            cell.setCellValue("{.final_cost}");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    表格样式这里只写一个,其他的参考pos文档即可,不要每一个单元都重新创建单元格样式,那样非常消耗性能.

     private CellStyle createCellContentStyle(Workbook workbook, HorizontalAlignment align,BorderStyle borderStyle) {
            CellStyle style = workbook.createCellStyle();
            // 设置对齐样式
            style.setAlignment(align);
            //背景为白色
            style.setFillForegroundColor(IndexedColors.WHITE.getIndex());
            // 设置边框样式
            // 下边框
            style.setBorderBottom(borderStyle);
            // 左边框
            style.setBorderLeft(borderStyle);
            // 上边框
            style.setBorderTop(borderStyle);
            // 右边框
            style.setBorderRight(borderStyle);
            // 生成字体
            Font font = workbook.createFont();
            font.setFontName("宋体");
            // 设置字体大小
            font.setFontHeightInPoints((short) 10);
            // 粗体显示
            font.setBold(false);
            // 选择创建的字体格式
            style.setFont(font);
            return style;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    [附源码]计算机毕业设计疫情管理系统Springboot程序
    电脑重装系统Win10“initpki.dll”加载失败怎么办?
    K3wise 常用表及视图
    微服务-gateway基本使用
    [含lw+源码等]S2SH学生会/社团活动管理系统[包运行成功]适合计算机毕业设计前端毕设程序设计
    前端总结——React的通信方式
    深度网络架构的设计技巧(三)之ConvNeXt:打破Transformer垄断的纯CNN架构
    day52 django的下载与安装
    windows server 2016 中users组用户权限实探
    Java 同步锁ReentrantLock与抽象同步队列AQS
  • 原文地址:https://blog.csdn.net/warrah/article/details/136477300