excel 动态列导出

news2025/6/18 17:45:43

1
excel动态列,只好用poi来写了,也并不复杂,一样就这个件事情抽像为几步,就是套路了,开发效率就上去了。
1 准备空模板
导出操作与excel模板的导出一样,可以参考excel导出标准化
1
2 自定义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;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1503607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TI IWR6843ISK ROS驱动程序搭建

1、设备准备 1.1 硬件设备 1&#xff09;TI IWR 6843 ISK 1块 2&#xff09;Micro USB 数据线 1条 1.2 系统环境 1&#xff09;VMware Workstation 15 Player 虚拟机 2&#xff09;Ubuntu18.04 并安装有 ROS1 系统 如若没有安装 ROS 系统&#xff0c;可通过如下指令进行…

HTML 02

1.列表 布局内容排列整齐的区域 (1)无序列表 写法&#xff1a; <ul><li>列表条目1</li><li>列表条目2</li><li>列表条目3</li></ul> 浏览器中显示&#xff1a; 注意&#xff1a; ul标签里只能包裹li标签 li标签里可以包…

算法学习系列(四十):贡献法

目录 引言概念一、孤独的照片二、牛的基因学三、字串分值 引言 关于这个贡献法考的不是很多&#xff0c;主要题型是出现在需要枚举每一个组合这类题&#xff0c;出现的次数较多。没有固定的模板&#xff0c;就是一种思想&#xff0c;跟贪心一样&#xff0c;每个题都是不一样的…

探讨系统测试的最佳实践与思维模式!

这是测试活动过程详解系列的最后一篇文章。之前的想法&#xff0c;是对测试过程各重要环节进行拆解&#xff0c;然后介绍这个环节重点要做的事情&#xff0c;为什么要做这些事&#xff0c;以及注意事项。 前面几篇文章分别介绍了单元测试、集成测试、回归测试阶段要解决的问题…

yolo模型中神经节点Mul与Sigmoid 和 Conv、Concat、Add、Resize、Reshape、Transpose、Split

yolo模型中神经节点Mul与Sigmoid 和 Conv、Concat、Add、Resize、Reshape、Transpose、Split 在YOLO&#xff08;You Only Look Once&#xff09;模型中&#xff0c;具体作用和用途的解释&#xff1a;

qt 日志 格式化打印 QMessagePattern

进入 qt源码 调试:qt creator debug 无法进入 qt源码 调试-CSDN博客 qt为 格式化打印 日志 提供了一个简易的 pattern(模式/格式) 词法解析类QMessagePattern,该类在qt的专门精心日志操作的源码文件Src\qtbase\src\corelib\global\qlogging.cpp 中 该类直接在构造函数中…

基于springboot+vue的食品安全管理系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 1 首页 2 后台登录 3 食品信息添加页面 4 食品查询 三、库表设计 四、论文 前言 从事食品行业的商家可能会对于食品的储存以及食品的销售&#xff0c;都有着不同门道的想法&#xff0c;那么如何能将这些想法一一实现&#xff0c;…

图像处理ASIC设计方法 笔记8 卷积计算芯片的结构

(一) P81 卷积芯片内部模板框图 该设计有两个数据通路:图像数据和模板数据。 图像数据是经过帧控制、实时图SPRAM(写控制、 SPRAM读控制、数据读控制)、计算单元; 模板数据是经过模板SPRAM、计算单元。 4.5.4运算单元像素寄存器控制 存储SPRAM写入的64bit数据,输出为…

FPGA的时钟资源

目录 简介 Clock Region详解 MRCC和SRCC的区别 BUFGs 时钟资源总结 简介 7系列FPGA的时钟结构图&#xff1a; Clock Region&#xff1a;时钟区域&#xff0c;下图中有6个时钟区域&#xff0c;用不同的颜色加以区分出来 Clock Backbone&#xff1a;从名字也能看出来&#x…

PermissionError: [Errno 13] Permission denied: ‘xview/xView_train.geojson‘

原因 如果你试图打开一个文件&#xff0c;但你的路径是一个文件夹&#xff0c;就会发生这种情况。 判断是否是文件夹 import os path r"my/path/to/file.txt" assert os.path.isfile(path) with open(path, "r") as f:pass或者可以看下该文件是否真没有…

前后端分离项目Docker部署指南(下)

目录 前言&#xff1a; 一.安装nginx 创建目录 上传nginx.conf至/data/nginx/conf文件夹中 运行启动容器 上传静态资源文件 ​编辑 访问结果 前言&#xff1a; 在上一篇博客中&#xff0c;我们深入探讨了如何使用Docker部署一个前后端分离的项目中的后端部分。我们构建…

二叉树遍历(前中后序的递归/非递归遍历、层序遍历)

二叉树的遍历 1. 二叉树的前序、中序、后序遍历 前、中、后序遍历又叫深度优先遍历 注&#xff1a;严格来说&#xff0c;深度优先遍历是先访问当前节点再继续递归访问&#xff0c;因此&#xff0c;只有前序遍历是严格意义上的深度优先遍历 首先需要知道下面几点&#xff1a; …

STM32基础--位带操作

位带简介 位操作就是可以单独的对一个比特位读和写&#xff0c;这个在 51 单片机中非常常见。51 单片机中通过关键字 sbit 来实现位定义&#xff0c;STM32 没有这样的关键字&#xff0c;而是通过访问位带别名区来实现。 在 STM32 中&#xff0c;有两个地方实现了位带&#xff…

leetcode 1143. 最长公共子序列【动态规划】

leetcode 1143. 最长公共子序列 int longestCommonSubsequence(char* text1, char* text2) {int len1 strlen(text1);int len2 strlen(text2);int dp[len1 1][len2 1];memset(dp, 0, sizeof(dp));for (int i 1; i < len1; i) {for (int j 1; j < len2; j) {if (t…

读书笔记之《理解和改变世界》:从信息知识智能的本质看AI

《理解和改变世界: 从信息到知识与智能》作者:是(法) 约瑟夫希发基思&#xff0c; 原作名: Understanding and Changing the World: From Information to Knowledge and Intelligence&#xff0c;2023年出版。 约瑟夫希发基思&#xff08;Joseph Sifakis&#xff09;&#xff…

【Linux】第一个小程序--进度条

这篇博客要综合利用以前的知识&#xff0c;来实现一个进度条程序~ 目录 换行&回车 缓冲区 实现简单的倒计时 实现进度条 version1 version2 在开始写这个小程序之前&#xff0c;我们先学习一些预备知识&#xff1a; 换行&回车 缓冲区 在我们运行这个程序时&…

docker ENTRYPOINT [“sh“,“-c“,“java“,“-jar“,“Hello.jar“] 启动失败问题分析

因为没系统的学过linux语法&#xff0c;所以才会产生如下疑问。大佬请跳过。 问题&#xff1a;当在dockerfile里面配置 ENTRYPOINT ["sh","-c","java","-jar","Hello.jar"] &#xff0c;启动对应容器时会无法正常运行&…

【MySQL】MySQL 的 SSL 连接以及连接信息查看

MySQL 的 SSL 连接以及连接信息查看 在上篇文章中&#xff0c;我们学习过 MySQL 的两种连接方式&#xff0c;回忆一下&#xff0c;使用 -h 会走 TCP 连接&#xff0c;不使用 -h 可以使用另两种方式来走 UnixSocket 连接。我们就接着这个话题再聊点别的&#xff0c;首先要纠正一…

基于springboot+vue实现高校学生党员发展管理系统项目【项目源码+论文说明】

基于springboot实现高校学生党员发展管理系统演示 摘要 随着高校学生规模的不断扩大&#xff0c;高校内的党员统计及发展管理工作面临较大的压力&#xff0c;高校信息化建设的不断优化发展也进一步促进了系统平台的应用&#xff0c;借助系统平台可以实现更加高效便捷的党员信息…

抓包工具获取请求信息

Charles 下载安装 下载 官方下载地址&#xff1a;https://www.charlesproxy.com/latest-release/download.do 下载后傻瓜式安装就好&#xff0c;这个官方的需要激活&#xff0c;可以选择绿色版或者学习版 绿色版 绿色中文版&#xff1a;https://soft.kxdw.com/pc/Charles.z…