Java实现excel动态列导出的示例代码

 更新时间:2024年03月05日 16:47:15   作者:warrah  
这篇文章主要为大家详细介绍了如何使用Java实现excel动态列导出,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下

excel动态列,只好用poi来写了,也并不复杂,一样就这个件事情抽像为几步,就是套路了,开发效率就上去了。

准备空模板

导出操作与excel模板的导出一样,可以参考excel导出标准化

自定义SheetWriteHandler

要通过pos自己创建每一样,像模板一样创建即可.

WriteSheet sheet0 = EasyExcel.writerSheet(0)
                //标题
                .registerWriteHandler(new GoodsInvRdSumWriteHandler(goodsInvRdSumListDto.getHeader()))
                .build();

主要重写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);
    }

第一行

  /**
     * 第一行是标题
     * @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);
    }

第二行

/**
     * 第二行 公司名称、日期
     * @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));

​​​​​​​    }

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

 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("成本");
    }

第五行是数据域

/**
     * 第五行:数据域
     * @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}");
    }

表格样式这里只写一个,其他的参考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;
    }

到此这篇关于Java实现excel动态列导出的示例代码的文章就介绍到这了,更多相关Java excel动态列导出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现利用图片或视频生成GIF并发送微信

    Java实现利用图片或视频生成GIF并发送微信

    这篇文章主要为大家详细介绍了Java语言如何利用图片或视频实现生成GIF并发送微信的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-11-11
  • Java通俗易懂系列设计模式之模板模式

    Java通俗易懂系列设计模式之模板模式

    这篇文章主要介绍了Java通俗易懂系列设计模式之模板模式,想了解设计模式的同学,可以仔细看一下
    2021-04-04
  • 新手了解java基础知识(一)

    新手了解java基础知识(一)

    这篇文章主要介绍了Java基础知识,本文介绍了Java语言相关的基础知识、历史介绍、主要应用方向等内容,需要的朋友可以参考下,希望对你有所帮助
    2021-07-07
  • Springboot整合https的实例代码

    Springboot整合https的实例代码

    本文简单介绍了一些密码学的基础和如何通过Springboot整合HTTPS,本文将通过实例代码给大家详细介绍整合过程,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Java通用Mapper UUID简单示例

    Java通用Mapper UUID简单示例

    今天小编就为大家分享一篇关于Java通用Mapper UUID简单示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Spring IOC源码剖析_如何整体认知Spring体系结构

    Spring IOC源码剖析_如何整体认知Spring体系结构

    这篇文章主要介绍了Spring IOC源码剖析_如何整体认知Spring体系结构方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring中的FactoryBean与BeanFactory详细解析

    Spring中的FactoryBean与BeanFactory详细解析

    这篇文章主要介绍了Spring中的FactoryBean与BeanFactory详细解析,在Spring框架中,FactoryBean和BeanFactory是两个关键的接口,用于创建和管理对象实例,它们在Spring的IoC(Inversion of Control,控制反转)容器中发挥着重要的作用,需要的朋友可以参考下
    2023-11-11
  • IDEA运行SpringBoot项目的图文教程

    IDEA运行SpringBoot项目的图文教程

    本文主要介绍了IDEA运行SpringBoot项目的图文教程,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Mybatis_plus基础教程(总结篇)

    Mybatis_plus基础教程(总结篇)

    这篇文章主要介绍了Mybatis_plus基础教程(总结篇),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • java.lang.Instrument 代理Agent使用详细介绍

    java.lang.Instrument 代理Agent使用详细介绍

    这篇文章主要介绍了java.lang.Instrument 代理Agent使用详细介绍的相关资料,附有实例代码,帮助大家学习参考,需要的朋友可以参考下
    2016-11-11

最新评论