概述
Java Excel 合并单元格 Java Excel 实现尾部添加数据 Java Excel 合并单元格 添加数据
一、前言
最近的工作中,遇到一个需求,在生成的Excel表格后,需要在尾部添加 一个合并的单元格数据。 因生成的表格 行数 不确定,可以将需求理解为:导出Excel后,需要在尾部动态添加一行内容。
分析:
- 导出 Excel 文件,现有功能,可以直接实现 ,比如参考这个。
- 尾部的单元格,需要合并功能,且需要换行,支持行高,字体配置等。
- 生成数据行数不确定,尾部内容需要在 生成数据后添加。
二、代码实现
1、Excel 合并单元格 伪代码如下:
sheet.addMergedRegion(new CellRangeAddress(起始行,终止行,起始列,终止列));
2、创建一个 ExcelConfig 类,用于 excel 单元格合并 相关配置
/**
* Description: Excel 合并单元格的配置
* @author w
* @version 1.0
* @date 2022/8/23 9:25
*/
public class ExcelConfig {
private List<Ext> extList;
public static class Ext{
private Integer offsetDown ; // 字体下移的位置
private String color ; // 字体颜色: RED 红色 【可选】
private String content ; // 添加的内容
private Float height ; // 行高 【可选】
private String fontName ; // 字体名称 【可选】
// ignore getter , setter
}
public List<Ext> getExtList() {
return extList;
}
public void setExtList(List<Ext> extList) {
this.extList = extList;
}
}
3、完成的测试代码如下 , 核心方法:processExt
package poi.test;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Description: poi excel 尾部添加合并内容
* <br> excel 合并单元格 测试 excel merge cell
* @author w
* @version 1.0
* @date 2022/8/23 10:35
*/
public class ExcelMergeTest {
public static void main(String[] args) throws IOException {
genExcelTest();
}
/**
* @Description: 生成 合并格式的excel 文件
* @return void
* @version v1.0
* @author wu
* @date 2022/8/23 10:36
*/
private static void genExcelTest() throws IOException {
SXSSFWorkbook workbook = new SXSSFWorkbook();
SXSSFSheet sheet = workbook.createSheet("第一页");
// 开始写入的行数
SXSSFRow headerRow = sheet.createRow(0);
List<String> headerList = Arrays.asList("姓名", "年龄", "addr");
for (int i = 0; i < headerList.size(); i++) {
SXSSFCell cell = headerRow.createCell(i);
cell.setCellValue(headerList.get(i));
}
// 行数数据
List<User> rowList = loadRowList();
// 加载行数据
loadRowData(workbook,sheet,rowList);
// 处理尾部合并的数据
processExt(workbook,sheet,headerList,rowList);
// 导出文件
String fileName = "D:\文件导出" +System.currentTimeMillis()+".xlsx" ;
FileOutputStream out = new FileOutputStream(new File(fileName));
workbook.write(out);
workbook.dispose();
}
/**
* @Description: 处理 excel 单元格 合并、扩展内容
* @param workbook
* @param sheet
* @param headerList 表头
* @param rowList
* @return void
* @version v1.0
* @author wu
* @date 2022/8/25 21:24
*/
private static void processExt(SXSSFWorkbook workbook, SXSSFSheet sheet, List<String> headerList, List<User> rowList) {
// 加载合并的配置
ExcelConfig config = loadExtList();
List<ExcelConfig.Ext> extList = config.getExtList();
// 计算 表头长度 、 内容数据长度
int headerSize = headerList.size();
int rowSize = rowList.size();
for (ExcelConfig.Ext e : extList) {
int rowIndex = rowSize + e.getOffsetDown();
// 创建 合并的区域
sheet.addMergedRegion(new CellRangeAddress(rowIndex,rowIndex,0,headerSize));
SXSSFRow row = sheet.createRow(rowIndex);
SXSSFCell cell = row.createCell(0); // 合并后的单元格
cell.setCellValue(e.getContent());
// 属性相关的配置
CellStyle cellStyle = workbook.createCellStyle();
Font font = workbook.createFont();
// 配置字体
if(StringUtils.isNotBlank(e.getFontName())){
font.setFontName(e.getFontName());
}
// 配置字体颜色
if(StringUtils.isNotBlank(e.getColor())){
if("RED".equals(e.getColor())){
font.setColor(Font.COLOR_RED);
}
}
// 配置行高
if(null != e.getHeight()){
row.setHeightInPoints(e.getHeight());
}
// 额外相关的配置
cellStyle.setWrapText(true);
cellStyle.setAlignment(HorizontalAlignment.LEFT); // 对齐方式
cellStyle.setVerticalAlignment(VerticalAlignment.TOP);
// 完成配置
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
}
}
/**
* @Description: 加载 Excel 合并相关的配置信息
* @return poi.test.ExcelConfig
* @version v1.0
* @author wu
* @date 2022/8/25 21:25
*/
private static ExcelConfig loadExtList() {
ExcelConfig excelConfig = new ExcelConfig();
ExcelConfig.Ext ext = new ExcelConfig.Ext();
ext.setColor("RED");
ext.setContent(" 内容红色的字体 -- 全部配置");
ext.setOffsetDown(1);
ext.setHeight(33F);
ext.setFontName("黑体");
ExcelConfig.Ext ext2 = new ExcelConfig.Ext();
ext2.setContent(" 最简单的 部分配置 ");
ext2.setOffsetDown(3);
ArrayList<ExcelConfig.Ext> list = Lists.newArrayList();
list.add(ext);
list.add(ext2);
excelConfig.setExtList(list);
return excelConfig;
}
/**
* @Description: excel 填充数据
* @param workbook
* @param sheet
* @param rowList
* @return void
* @version v1.0
* @author wu
* @date 2022/8/25 21:25
*/
public static void loadRowData(Workbook workbook, Sheet sheet, List<User> rowList) {
int startRow = 1 ;
for (int i = 0; i < rowList.size(); i++) {
User user = rowList.get(i);
Row row = sheet.createRow(i + startRow);
Cell cell0 = row.createCell(0);
cell0.setCellValue(user.getName());
Cell cell1 = row.createCell(1);
cell1.setCellValue(user.getAge());
Cell cell2 = row.createCell(2);
cell2.setCellValue(user.getAddr());
}
}
/**
* @Description: 加载 rowList 数据
* @return java.util.List<poi.test.User>
* @version v1.0
* @author wu
* @date 2022/8/25 21:26
*/
public static List<User> loadRowList() {
ArrayList<User> rowList = Lists.newArrayList();
rowList.add(new User("小明",18,"北京市"));
rowList.add(new User("小狗",22,"河北省"));
rowList.add(new User("小猫",33,"天津市"));
return rowList;
}
}
4、测试后的效果如下:
5、可以在指定位置完成数据填充,说明满足需求。
三、总结
1、本文示例代码是基于 poi 3.16版本,原汁原味,没有其他的任何添加剂 。。。
2、重点关注:loadExtList 方法中excel 合并部分内容的配置; 和 processExt 方法中,对于配置的处理 ;功能应用上,可以将 ExcelConfig.Ext 类的配置,转换为 JSON文件,改成配置,可以根据情况进行调整。
3、配置中,文字要实现换行,可以用 n 来实现换行;文字 加粗、靠右、居中 等效果还未找到办法来配置...
4、excel软件中操作时,可以通过 ALT+Enter 键实现换行。
最后
以上就是生动河马为你收集整理的Java Excel 合并单元格 Java Excel 实现尾部添加数据 Java Excel 合并单元格 添加数据 poi excel 合并单元格的全部内容,希望文章能够帮你解决Java Excel 合并单元格 Java Excel 实现尾部添加数据 Java Excel 合并单元格 添加数据 poi excel 合并单元格所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复