当前位置: 首页 > news >正文

JAVA 使用POI实现单元格行合并生成

预期效果

在这里插入图片描述

maven引用

 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>

Java代码实现

功能实现

    private boolean callExcel(List<MColumnValueVo> mColumnValueVos,String name){SXSSFWorkbook workbook = new SXSSFWorkbook(100);Sheet sheet = workbook.createSheet("明细信息");//设置单元格居中CellStyle cellStyle = workbook.createCellStyle();//设置边框样式cellStyle.setAlignment(HorizontalAlignment.CENTER);//左右居中cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 上下居中String[] headers1 = {"号码","名称"};//2个String[] mxHeaders = {"行号","行性质"};//2个String[] headers2 = {"合计金额","状态"};//2个Row headerRow = sheet.createRow(0); // 创建表头行,索引为0for (int i = 0; i < headers1.length; i++) {//headers1表格合并并赋值Cell cell = headerRow.createCell(i);//创建列cell.setCellStyle(cellStyle);//设置表格样式cell.setCellValue(headers1[i]);//表格赋值内容sheet.addMergedRegion(new CellRangeAddress(0, 1, i, i));//表格的合并,先填内容在合并且合并保留内容为合并的第一行内容}int firstCol = headers1.length+mxHeaders.length; // 从第一行开始填充数据int hlt = firstCol+headers2.length;// 合计列// 自动调整列宽(可选)for (int colNum = 0; colNum < hlt; colNum++) {sheet.setColumnWidth(colNum, 256 * 25);}//发票明细表格合并并赋值Row two = sheet.getRow(1);if (two == null) {two = sheet.createRow(1);}sheet.addMergedRegion(new CellRangeAddress(0, 0, headers1.length, firstCol-1));Cell mergedCell = headerRow.createCell(headers1.length); // 合并后的单元格左上角mergedCell.setCellStyle(cellStyle);mergedCell.setCellValue("明细");for (int i = 0; i < mxHeaders.length; i++) {//明细表头赋值Cell cell = two.createCell(i + headers1.length);cell.setCellStyle(cellStyle);cell.setCellValue(mxHeaders[i]);}for (int i = 0; i < headers2.length; i++) {Cell cell = headerRow.createCell(i + firstCol);cell.setCellStyle(cellStyle);cell.setCellValue(headers2[i]);sheet.addMergedRegion(new CellRangeAddress(0, 1, firstCol+i, firstCol+i));}// 填充数据int lastRowIndex = 2; //记录最后行位置for (MColumnValueVo vo : mColumnValueVos) {// 创建行Row row = sheet.createRow(lastRowIndex);if(vo.getMxQueryOuts()!=null){//添加发票明细for (int i = 0; i < vo.getMxQueryOuts().size(); i++) {MMColumnValueVo mxVo = vo.getMxQueryOuts().get(i);Row row1 = sheet.getRow(lastRowIndex + i);if(row1 == null) {row1 = sheet.createRow(lastRowIndex + i);}for (int j = 0; j < headers2.length; j++) {Cell cell = row1.createCell(headers1.length + j);cell.setCellStyle(cellStyle);cell.setCellValue(getValueFromMMVo(mxVo, j));}}}for (int i = 0; i < headers1.length; i++) {Cell cell = row.createCell(i);cell.setCellStyle(cellStyle);cell.setCellValue(getValueFromMxVo1(vo, i));if(vo.getMxQueryOuts()!=null && vo.getMxQueryOuts().size()>1){sheet.addMergedRegion(new CellRangeAddress(lastRowIndex, lastRowIndex+vo.getMxQueryOuts().size()-1, i, i));}}for (int i = 0; i < headers2.length; i++) {Cell cell = row.createCell(i + firstCol);cell.setCellStyle(cellStyle);cell.setCellValue(getValueFromMxVo2(vo, i));if(vo.getMxQueryOuts()!=null && vo.getMxQueryOuts().size()>1){sheet.addMergedRegion(new CellRangeAddress(lastRowIndex, lastRowIndex+vo.getMxQueryOuts().size()-1, firstCol+i, firstCol+i));}}if(vo.getMxQueryOuts()==null){lastRowIndex++;}else {lastRowIndex += vo.getMxQueryOuts().size();}logger.info("lastRowIndex:{}",lastRowIndex);}// 写入到文件 name:绝对路径并带excel文件名称及后缀try (FileOutputStream out = new FileOutputStream(name)) {workbook.write(out);} catch (IOException e) {logger.error("生成明细信息excel表格异常",e);return false;} finally {// 关闭workbook,释放资源workbook.dispose();}return true;}

返回内容

private String getValueFromMxVo1(MMColumnValueVo vo, int colNumMx) {switch (colNumMx) {case 0: return vo.getLineNo() != null ? vo.getLineNo().toString() : "";case 1: return vo.getLineNature();default: return "";}
}

注: 返回内容都可以按照该种方式

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 秋招面经9.11
  • FAT32文件系统详细分析 (格式化SD nandSD卡)
  • Spring Boot中实现定时任务的主要方式
  • 详细分析Mysql配置文件路径的查找(多种方法)
  • IDA动态调试
  • 【电力系统】清除故障后电力系统的摆动曲线
  • 信号量(二值信号量和计数信号量)和互斥量
  • 【hot100-java】【搜索二维矩阵 II】
  • 装备综合保障研究进展整理
  • 15_分布式数据结构
  • Lua 与 C#交互
  • 通过域名无法访问不到网站,IP可正常访问(DNS污染)
  • 01 Docker概念和部署
  • 计算机网络基础概念 交换机、路由器、网关、TBOX
  • 大数据之Flink(二)
  • 深入了解以太坊
  • [译]Python中的类属性与实例属性的区别
  • 【个人向】《HTTP图解》阅后小结
  • centos安装java运行环境jdk+tomcat
  • EOS是什么
  • Java-详解HashMap
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Object.assign方法不能实现深复制
  • Octave 入门
  • Rancher如何对接Ceph-RBD块存储
  • Redux 中间件分析
  • sessionStorage和localStorage
  • VUE es6技巧写法(持续更新中~~~)
  • 分布式任务队列Celery
  • 微服务核心架构梳理
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 通过调用文摘列表API获取文摘
  • ​MySQL主从复制一致性检测
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #define与typedef区别
  • ${factoryList }后面有空格不影响
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (多级缓存)多级缓存
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (回溯) LeetCode 78. 子集
  • (三)uboot源码分析
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (杂交版)植物大战僵尸
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net SqlSugarHelper
  • .net访问oracle数据库性能问题