首页 > 其他分享 >EasyExcel复杂导出 一对多

EasyExcel复杂导出 一对多

时间:2024-07-26 14:52:07浏览次数:11  
标签:int 合并 EasyExcel 导出 cell curColIndex 一对 preCell curRowIndex

 将数据一条一条查出来 千万不要用一对多查询 最后用方法进行合并

public class ExcelFileCellMergeStrategy implements CellWriteHandler{

/**
* 合并列的范围索引
*/
private int[] mergeColumnIndex;

/**
* 合并起始行索引
*/
private int mergeRowIndex;

/**
* 合并校验列值
*/
private int colIndex;


public ExcelFileCellMergeStrategy(int[] mergeColumnIndex, int mergeRowIndex, int colIndex) {
this.mergeColumnIndex = mergeColumnIndex;
this.mergeRowIndex = mergeRowIndex;
this.colIndex = colIndex;
}


@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

//当前行
int curRowIndex = cell.getRowIndex();
//当前列
int curColIndex = cell.getColumnIndex();
//某行开始合并
if (curRowIndex > mergeRowIndex) {
//判断每行的第一列是否相同,相同时进行合并
if (isSame(cell, curRowIndex)) {
for (int columnIndex : mergeColumnIndex) {
//对应的列进行合并
if (curColIndex == columnIndex) {
mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
break;
}
}
}
}
}

private Boolean isSame(Cell cell, int curRowIndex){
//获取当前行的某列的数据
Cell curCell = cell.getSheet().getRow(curRowIndex).getCell(colIndex);
//当前行某列值
Object curData = curCell.getCellTypeEnum() == CellType.STRING ? curCell.getStringCellValue() : curCell.getNumericCellValue();
//获取当前行的上一行数据
Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(colIndex);
//上一行某列值
Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
// 比较当前行的某列的单元格与上一行是否相同,相同合并当前单元格与上一行
return curData.equals(preData);
}

private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
//获取当前行的当前列的数据和上一行的当前列数据,通过上一行数据是否相同进行合并
Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
Cell preCell = cell.getSheet().getRow(curRowIndex - 1 ).getCell(curColIndex);
Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
//比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行
if (curData.equals(preData)){
Sheet sheet = writeSheetHolder.getSheet();
List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
boolean isMerged = false;
for (int i = 0; i < mergedRegions.size() && !isMerged; i++) {
CellRangeAddress cellAddresses = mergedRegions.get(i);
//若上 一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
if (cellAddresses.isInRange(curRowIndex - 1 , curColIndex)){
sheet.removeMergedRegion(i);
cellAddresses.setLastRow(curRowIndex);
sheet.addMergedRegion(cellAddresses);
isMerged = true;
}
}
//若上一个单元格未被合并,则新增合并单元
if (!isMerged){
CellRangeAddress cellAddresses = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
sheet.addMergedRegion(cellAddresses);
}
}
}

}
这个是进行合并的类方法 到时候导入到类里面直接调用就行
可以直接粘贴复制 不需要修改

 

标签:int,合并,EasyExcel,导出,cell,curColIndex,一对,preCell,curRowIndex
From: https://www.cnblogs.com/yzxsx/p/18325337

相关文章

  • EasyExcel简单导出
    @ApiOperation("导出历史上送记录")@PostMapping(value="/exportSend",produces="application/octet-stream")publicvoidexportExcel(@RequestBodyExportSendVOsendVO,HttpServletResponseresponse)throwsException{//获取数据List&......
  • 导出字体安装调试
    导出字体安装调试本教程由做字体网(www.zuoziti.com)友情提供!本教程是制作手写字体系列教程,建议从序言部分开始阅读学习!如需交流,请加QQ924268440本节视频教程在FontCreator中调试字体在FontCreator中调试字体很简单,直接按F5键即可。这里可以设置字体大小,我一般使用26......
  • Day10--mybatis多表连接查询学习(一对一、一对多、多对多)
    MyBatis是一个优秀的持久层框架,支持将SQL语句、存储过程以及高级映射转换成Java对象。下面是MyBatis处理一对一、一对多、多对多关系的方式及相应的代码示例。数据库表假设有四个表:user、orders、role、user_role---->创建代码(占位较长)放在文章末尾···首先先了解对应......
  • Django 管理员:一对一关系作为内联?
    我正在为satchmo应用程序整理管理员。Satchmo使用OneToOne关系来扩展基本模型Product,我想在一页上编辑所有内容。是否可以将OneToOne关系作为内联关系?如果没有,将一些字段添加到管理员的给定页面并最终保存到OneToOne关系中的最佳方法是什么?例如:clas......
  • 数据库导出到Excel, 使用mybatis分批导出,防止oom
    DAO层:@Select("<script>"+"select*fromlegal_contract_tbwhere1=1"+"<iftest='legalContractBean.contractName!=nullandlegalContractBean.contractName!=\"\"'>"......
  • ThinkPHP一对一关联模型的运用(ORM)
    一、序言最近在写ThinkPHP关联模型的时候一些用法总忘,我就想通过写博客的方式复习和整理下一些用法。具体版本:topthink/framework:6.1.4topthink/think-orm:2.0.61 二、实例应用1、一对一关联1.1、我先设计了两张表,分别为用户表(user),用户扩展表(user_extend) 1.2、分别......
  • EasyExcel 读取xls 监听行数据问题
    需求:导入xls文件需要判断是否空值,时间格式是否问题监听器classExcelListenerextendsAnalysisEventListener<RevWaterUserDocAndUserPayImportExl>{publicExcelListener(List<RevWaterUserDocAndUserPayImportExl>result){this.list=result;......
  • springboot+vue前后端分离项目:导出功能报错Request processing failed: cn.hutool.cor
    1.报错截图: 2.hutool官网,推荐引入poi-ooxml依赖 3.mvn仓库找到依赖 4.用最新版依赖 5.复制到本项目pom.xml,刷新maven 解决......
  • 表情符号错误plotly kaleido静态图片导出不支持表情符号
    https://github.com/misrori/goldhandyoutube/blob/main/aranykez.ipynb在colab中,当您显示时它会起作用。但是当您导出时它不会fromgoldhandimport*tw=Tw()t=GoldHand('TSLA')p=t.plotly_last_year(tw.get_plotly_title('TSLA'))p.upd......
  • 调用后端接口返回导出表格
    //fetch('/record/export/report',{//method:'POST',//指定请求方法为POST//headers:{//'Content-Type':'application/json',//设置请求头,指明发送的是JSON格式的数据//......