----这段时间一直在用若依的框架做开发,非常方便,其中自带了导入导出功能,但默认的导出只能是一条一条数据,没有合并行功能,于是就在若依的gitee提交仓库请求中找到了这个方案,使用简单,步骤如下。
第一步:我们在Excel中加入如下自定义注解
/**
* 是否合并单元格.
*/
public boolean isMerge() default false;
第二步:在ExcelUtil 加入 mergeCells变量
/**
* 要合并的单元格列
*/
public ArrayList<Integer> mergeCells = new ArrayList<>();
第三步:修改createExcelField方法如下
/**
* 得到所有定义字段
*/
private void createExcelField()
{
this.fields = new ArrayList<Object[]>();
List<Field> tempFields = new ArrayList<>();
tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields()));
tempFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
for (Field field : tempFields)
{
// 单注解
if (field.isAnnotationPresent(Excel.class))
{
putToField(field, field.getAnnotation(Excel.class));
}
// 多注解
if (field.isAnnotationPresent(Excels.class))
{
Excels attrs = field.getAnnotation(Excels.class);
Excel[] excels = attrs.value();
for (Excel excel : excels)
{
putToField(field, excel);
}
}
}
//以下为新加值
//筛选出需要合并的单元格的位置
if(this.fields.size()>0){
int column = 0;
for (Object[] os : fields){
Excel excel = (Excel) os[1];
if(excel.isMerge()){
this.mergeCells.add(column);
}
column++;
}
}
//以上为新加值
this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList());
this.maxHeight = getRowHeight();
}
第四步:修改fillExcelData方法如下
/**
* 填充excel数据
*
* @param index 序号
* @param row 单元格行
*/
public void fillExcelData(int index, Row row)
{
int startNo = index * sheetSize;
int endNo = Math.min(startNo + sheetSize, list.size());
for (int i = startNo; i < endNo; i++)
{
row = sheet.createRow(i + 1 - startNo);
// 得到导出对象.
T vo = (T) list.get(i);
int column = 0;
for (Object[] os : fields)
{
Field field = (Field) os[0];
Excel excel = (Excel) os[1];
// 设置实体类私有属性可访问
field.setAccessible(true);
this.addCell(excel, row, vo, field, column++);
}
}
//以下为新加值
//合并单元格(需要传入要合并的列序号)
if(mergeCells.size() > 0){
for (int mergeCell : mergeCells) {
mergeCells(sheet, mergeCell, 1, sheet.getLastRowNum());
}
}
}
第五步:合并方法
/**
* @param sheet
* @param cellLine 合并的列号
* @param startRow 开始行
* @param endRow 尾行
**/
private void mergeCells(Sheet sheet, int cellLine,int startRow, int endRow) {
// 获取第一行的数据,以便后面进行比较
String s_will = getCellValue(sheet.getRow(startRow),cellLine).toString();
//合并行数
int count = 0;
//数据比较,从第二行开始比较
for (int i = 2; i <= endRow; i++) {
//取出下一行的数据
String s_current = getCellValue(sheet.getRow(i),cellLine).toString();
//与相对的第一行的数据进行比较
if (s_will.equals(s_current) && !s_will.equals("")) {
//合并行数加一
count++;
} else {
//如果合并行数大于等于1就合并,现将需要合并的行数进行合并
if(count >= 1){
//合并从开始行到合并的行数
sheet.addMergedRegion(new CellRangeAddress( startRow, startRow+count,cellLine , cellLine));
}
//初始化数据,进行下一个单元格合并
startRow = i;
s_will = s_current;
count = 0;
}
//最后个单元格合并
if (i == endRow && count > 0) {
sheet.addMergedRegion(new CellRangeAddress(startRow,startRow+count ,cellLine , cellLine));
}
}
}
具体实现,类属性加注解:
@Excel(name = "箱号", sort = 1, width = 25, isMerge = true)
private String caseNum;
最终效果:
感谢 @番茄你个马铃薯提交的分支记录,
#好了,本次教程到这里就结束了,希望大家多多点赞关注支持(首席摸鱼师 微信同号),持续跟踪最新文章吧~