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 键实现换行。