java grid动态行合并_jxls动态合并单元格

这篇博客介绍了如何在Java中使用jxls库动态合并Excel单元格。作者通过创建Student类模拟数据,并利用反射机制找出需要合并的行,然后使用Apache POI库进行单元格合并,最终实现了根据数据动态合并Excel的效果。
摘要由CSDN通过智能技术生成

在研究jxls时  想生成的模板  和传入的javabean 怎么样才可以做到 动态合并 相邻行的同一信息的单元格

比如

王五 1 王五 1

王五 2 合并成: 2

王刘 3 王刘 3

看了很多博客 再结合自己的研究 和文档 发现 只能通过 先生成 没有合并过的输出流 转成 工作薄对象 再进行加工 从而 输出 思路为:先得到要传入到模板上的list 设置想要 合并的字段名 比如name (当然 这个list得要是后台按groupby 传来有顺序的。。毕竟 我的程序还是比较年幼) 找出相同名字的 起始位置 用poi进行单元格合并

首先 写了两个实体 1.为了模拟测试 的student类

package workdemo.entity;

public class Student {

private String name;

private String subject;

private int score;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSubject() {

return subject;

}

public void setSubject(String subject) {

this.subject = subject;

}

public int getScore() {

return score;

}

public void setScore(int score) {

this.score = score;

}

public Student(String name, String subject, int score) {

super();

this.name = name;

this.subject = subject;

this.score = score;

}

}

2.为了方便记录起始位置 我写了一个类

package workdemo.entity;

public class Merge {

private int fromRow;

private int toRow;

private int fromIndex;

private int toIndex;

public int getFromRow() {

return fromRow;

}

public void setFromRow(int fromRow) {

this.fromRow = fromRow;

}

public int getToRow() {

return toRow;

}

@Override

public String toString() {

return "Merge [fromRow=" + fromRow + ", toRow=" + toRow + ", fromIndex=" + fromIndex + ", toIndex=" + toIndex

+ "]";

}

public void setToRow(int toRow) {

this.toRow = toRow;

}

public int getFromIndex() {

return fromIndex;

}

public void setFromIndex(int fromIndex) {

this.fromIndex = fromIndex;

}

public int getToIndex() {

return toIndex;

}

public void setToIndex(int toIndex) {

this.toIndex = toIndex;

}

}

3.主函数 基于反射写了个方法 降低耦合度

package com.icom.util.base.test;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.lang.reflect.InvocationTargetException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.hssf.util.CellRangeAddress;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

import com.icom.util.base.test.entity.Merge;

import com.icom.util.base.test.entity.Student;

import net.sf.jxls.exception.ParsePropertyException;

import net.sf.jxls.transformer.XLSTransformer;

public class Main {

public static List gen() {

// 模拟生成 一个学生list 经过排列 特意有几个是同一个学生考的

List list = new ArrayList();

for (int i = 50; i < 55; i++) {

list.add(new Student("吴承接", "数学", i));

}

list.add(new Student("多大的", "物理", 55));

list.add(new Student("多大的", "化学", 99));

list.add(new Student("多大的", "信息", 56));

list.add(new Student("呵呵", "物理", 55));

list.add(new Student("蛋蛋", "物理", 55));

list.add(new Student("蛋蛋", "物无", 55));

list.add(new Student("鸡儿", "物理", 55));

return list;

}

// 先用String

public static Object useMethod(T t, String sx) throws IllegalAccessException, IllegalArgumentException,

InvocationTargetException, NoSuchMethodException, SecurityException {

// 一般传入get方法

return (Object) t.getClass().getMethod(sx, null).invoke(t, null);

}

public static List getMerge(List list, String sx) throws IllegalAccessException,

IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {

// 可以传入 想合并的属性值 传入一个字符串 用反射找到相应的get方法 指定调用此方法。。这里先写死

List ml = new ArrayList();

for (int i = 0; i < list.size() - 1; i++) {

if (useMethod(list.get(i), sx) == useMethod(list.get(i + 1), sx)) {

Object property = useMethod(list.get(i), sx);

// System.out.println(property);

// System.out.println("第" + (i + 1) + "个和第" + i + "个一样");

Merge merge = new Merge();

int fromRow = i, toRow = i + 1;

if (i + 2 < list.size()) {

for (int j = i + 2; j < list.size(); j++) {

if (useMethod(list.get(j), sx) == property) {

toRow++;

} else {

i = j - 1;

break;

}

}

}

merge.setFromRow(fromRow);

merge.setToRow(toRow);

ml.add(merge);

}

}

return ml;

}

public static void main(String[] args)

throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException,

SecurityException, FileNotFoundException, ParsePropertyException, InvalidFormatException {

String templateFile = "d://test//mergedemo.xls";

Map beans = new HashMap();

InputStream is = new FileInputStream(templateFile);

List data = gen();

beans.put("data", data);

XLSTransformer transformer = new XLSTransformer();

HSSFWorkbook workBook = (HSSFWorkbook) transformer.transformXLS(is, beans); // 传入模板的输入流和map

// 开始进行合并单元格

HSSFSheet sheet = workBook.getSheetAt(0);// 1 1

List ml = getMerge(gen(), "getName");

for (Merge m : ml) {

// 因为知道是第一列 的合并 所以写死 行+1是因为 第一行是列名

sheet.addMergedRegion(new CellRangeAddress(m.getFromRow() + 1, m.getToRow() + 1, 0, 0));

}

try {

OutputStream os = new FileOutputStream("d://test//mergeResult.xls");

workBook.write(os);

is.close();

os.flush();

os.close();

} catch (IOException ie) {

ie.printStackTrace();

} catch (ParsePropertyException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

4.excle 模板

4c2143d73da70d1188c668b68ba049e5.png

5.输出结果:

701e3d483ae6acbe2532d34920a8da6b.png

最后就可以得到 装有Merge对象的list 循环list 就可以调用 poi里的 addMergedRegion( CellRangeAddress cellRangeAddress ) 进行合并

还是蛮有收获的。。。。。。复习了反射~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答您关于jxls合并单元格的问题。jxls是一个基于Java的开源Excel操作工具,可以通过Excel模板来实现数据的导出和导入等功能。下面是一个简单的jxls合并单元格示例: 1. 创建Excel模板 在Excel模板中,需要使用jxls提供的标记语言来标记出需要合并单元格。例如,下面是一个包含合并单元格的模板示例: ``` <html xmlns:jxl="http://jxls.sf.net/1.0/mini"> <body> <table> <tr> <td jxl:merge="0,1,0,2">姓名</td> <td>年龄</td> <td>性别</td> </tr> <tr> <td></td> <td></td> <td></td> </tr> <jxl:each items="users" var="user"> <tr> <td>${user.name}</td> <td>${user.age}</td> <td>${user.gender}</td> </tr> </jxl:each> </table> </body> </html> ``` 在上面的模板中,我们使用jxl:merge标记来标记需要合并单元格,其中0,1,0,2表示需要合并从第0到第1、从第0列到第2列的单元格。 2. 编写导出代码 在Java代码中,可以使用jxls提供的API来进导出操作。例如: ``` // 加载Excel模板 InputStream is = new FileInputStream("template.xls"); Workbook workbook = WorkbookFactory.create(is); // 创建Excel上下文对象 Map<String, Object> context = new HashMap<>(); context.put("users", getUserList()); // 执模板引擎,生成Excel文件 JxlsHelper.getInstance().processTemplate(context, workbook.getSheetAt(0)); // 保存Excel文件 OutputStream os = new FileOutputStream("output.xls"); workbook.write(os); os.close(); ``` 在上面的代码中,我们首先加载Excel模板,然后创建Excel上下文对象,并将需要合并单元格的数据添加到上下文中。最后,使用JxlsHelper的processTemplate方法执模板引擎,生成Excel文件,并保存到本地。 3. 导出Excel文件 运上面的代码后,会在项目根目录下生成一个名为output.xls的Excel文件,其中包含了我们导出的数据和合并单元格。 以上就是一个简单的jxls合并单元格示例,希望能对您有所帮助。如果您有其他问题,可以继续咨询我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值