1、合并单元格工具类


/*** 导出excel工具类*/
public class ExportExcelUtil {public ExportExcelUtil() {super();}/*** @Param [columnNames 表头, column 字段名称, rows 数据, excelName 文件名称, mergeIndex 合并列, response]**/public static void CombineExcel(String[] columnNames, String[] column, List<实体类型> rows, String excelName, int[] mergeIndex, HttpServletResponse response) {SXSSFWorkbook workbook = new SXSSFWorkbook(); // 创建工作薄,相当于一个文件SXSSFSheet sheet = workbook.createSheet("sheet名字"); // 创建一个表// 标题样式CellStyle titleStyle = workbook.createCellStyle();// 标题字体Font titleFont = workbook.createFont();titleFont.setFontHeightInPoints((short) 12); // 字体大小titleFont.setFontName("宋体");titleStyle.setFont(titleFont);// 表头样式CellStyle headerStyle = workbook.createCellStyle();headerStyle.setWrapText(true); // 设置多行显示DataFormat format = workbook.createDataFormat();headerStyle.setDataFormat(format.getFormat("@"));// 表头字体Font headerFont = workbook.createFont();headerFont.setFontHeightInPoints((short) 12);headerFont.setFontName("宋体");headerFont.setBold(true);headerStyle.setFont(headerFont);// 数据样式CellStyle dataStyle = workbook.createCellStyle();// 数据字体Font dataFont = workbook.createFont();dataFont.setFontHeightInPoints((short) 9);dataFont.setFontName("宋体");dataStyle.setFont(dataFont);Row row = null;Cell cell = null;row = sheet.createRow(0);//设置表头for (int i = 0; i < columnNames.length; i++) {row.setHeight((short) (2 * 256));cell = row.createCell(i);cell.setCellValue(columnNames[i]);cell.setCellStyle(headerStyle);}List<PoiModel> poiModels = Lists.newArrayList();//设置数据行for (int i = 0; i < rows.size(); i++) {Row dataRow = sheet.createRow(i + 1);sheet.trackAllColumnsForAutoSizing();//设置对应的实体实体类型 project = rows.get(i); // 当前行数据int index = i + 1; // 当前行// 循环字段名称数组for (int j = 0; j < column.length; j++) {// 循环需要合并的列listfor (int mer : mergeIndex) {// 如果是第一行 为PoiModel赋值记录数据后结束循环if (index == 1) {String content=null;String oldContent=null;//设置那些列需要合并if(mer == 0){// 对应列 的 字段值//注意:project.具体的实体类型1(),这是获取实体的get方法。oldContent = project.具体的实体类型1() == null ? "" : project.具体的实体类型1()();content = project.具体的实体类型1() == null ? "" : project.具体的实体类型1()();}else if(mer == 1){// 对应列 的 字段值oldContent = project.具体的实体类型2() == null ? "" : project.具体的实体类型2();content = project.具体的实体类型2() == null ? "" : project.具体的实体类型2();}// 为poiModel 赋值PoiModel poiModel = PoiModel.builder().oldContent(oldContent).content(content).rowIndex(1).cellIndex(j).build();poiModels.add(poiModel);break;}// 如果记录list中有值if (poiModels != null && poiModels.size() > 0) {// 对应列 的 PoiModelPoiModel poiModel = poiModels.get(j);String content=null;//设置那些列需要合并if(mer == 0){// 对应列 的 字段值content = project.具体的实体类型1() == null ? "" : project.具体的实体类型1();}else if(mer == 1){content = project.具体的实体类型2() == null ? "" : project.具体的实体类型2();}if (j > 0 && mer == j) {if (!poiModel.getContent().equals(content)) {get(poiModel, content, index, j, sheet);}}if (mer == j && j == 0 && !poiModel.getContent().equals(content)) {get(poiModel, content, index, j, sheet);}if (mer == j && index == rows.size() && poiModels.get(j).getRowIndex() != index) {CellRangeAddress cra = new CellRangeAddress(poiModels.get(j).getRowIndex(), index, poiModels.get(j).getCellIndex(), poiModels.get(j).getCellIndex());sheet.addMergedRegion(cra);}}}//将值传入对应单元格Cell dataCell = dataRow.createCell(j);sheet.autoSizeColumn(j, true);if(column[j] == "实体1"){dataCell.setCellValue(project.具体的实体类型1());}else if(column[j] == "实体2"){dataCell.setCellValue(project.具体的实体类型2());}else if(column[j] == "实体3"){dataCell.setCellValue(project.具体的实体类型3());}else if(column[j] == "实体4"){dataCell.setCellValue(project.具体的实体类型4());}else if(column[j] == "实体5"){dataCell.setCellValue(project.具体的实体类型5());}dataCell.setCellStyle(dataStyle);}}OutputStream os = null;try {// 创建一个普通输出流os = response.getOutputStream();// 请求浏览器打开下载窗口response.reset();response.setCharacterEncoding("UTF-8");excelName = new String(excelName.getBytes(), "ISO8859-1");response.setHeader("Content-Disposition", "attachment; filename=" + excelName);// 要保存的文件名response.setContentType("application/octet-stream");workbook.write(os);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {workbook.close();os.close();} catch (IOException e) {e.printStackTrace();}}}private static void get(PoiModel poiModel, String content, int index, int i, Sheet sheet) {// 如果 PoiModel记录的行数 不是 当前行 则合并if (poiModel.getRowIndex() != index - 1) {// 相同值第一次出现的行数  到当前行数-1 (下标)  合并开始列  合并结束列CellRangeAddress cra = new CellRangeAddress(poiModel.getRowIndex(), index - 1, poiModel.getCellIndex(), poiModel.getCellIndex());//在sheet里增加合并单元格sheet.addMergedRegion(cra);}/*重新记录该列的内容为当前内容,行标记改为当前行标记,列标记则为当前列*/poiModel.setContent(content);poiModel.setRowIndex(index);poiModel.setCellIndex(i);}
}

2、工具类引用的import:

import org.apache.commons.compress.utils.Lists;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

3、合并单元格具体的方法调用:

    @GetMapping("/接口名")public void exportManageExcel1(HttpServletResponse response,String 参数1) throws Exception {try {List<实体> list = XXXService.exportExcel(参数1);String[] headers = {"名称1", "名称2", "名称3","名称4", "名称5"};String[] column = {"实体1", "实体2", "实体3", "实体4", "实体5"};String excelName = "表名.xlsx";ExportExcelUtil exportExcelUtil = new ExportExcelUtil();int[] mergeIndex = {0,1};exportExcelUtil.CombineExcel(headers, column, list, excelName, mergeIndex, response);} catch (Exception e) {e.printStackTrace();}}

Excel导出且合并相同值的单元格相关推荐

  1. Excel函数 - 批量合并相同内容的单元格

    问题:如下图所示,我想把相同的种类合并到1个单元格中.由图1变为图2. 第一步:我们在C列标题行下面的第一行(即c2单元格)写下这样的公式"=IF(A2=A1,C1,C1+1) " ...

  2. aspose.words 合并相同值的单元格_合并相同的单元格,你用了1小时,同事只要30秒,还支持自动刷新...

    Hello.大家好,今天跟大家分享下如何批量合并表格中相同的单元格,并且还能达到自动刷新的效果.合并相同单元格能够让表格看起来更加的美观,同时也能让表格看起来层次分明,更加方便我们阅读数据.话不多说, ...

  3. hutool导出excel大数据_Hutool excel导出并合并单元格

    一.Hutool介绍 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的&q ...

  4. excel单元格内容拆分_Excel批量合并相同内容的单元格

    因为我平常工作中整理数据会经常需要批量合并单元格,所以我各处学习,整理了如下批量合并相同内容单元格的方法,以下有WPS的应用截图,也有excel的应用截图,但原理是一样的,供大家参考. 在日常办公中经 ...

  5. java excel导出(表头合并,多行表头)

    java excel导出(表头合并,多行表头) 原创:http://www.cnblogs.com/NJM-F/p/10222152.html @RequestMapping(value=" ...

  6. 报表中怎么把相同值的单元格合并成一个大格

    同值合并单元格的情况一般分两种: 1.一种是比较简单的情况:对分类或者分类扩展字段进行同值合并处理(如下图所示的效果图:对供应商数据进行同值合并) 这种情况大多数报表工具都能直接支持,使用分组功能即可 ...

  7. excel中设置同一行中出现重复值时单元格突出显示

    问题 条件格式中直接选择有重复值时单元格变色是作用于整个所选区域的,也就是说在该区域里,只要有重复值时单元格就会突出显示(具体怎样显示可以自己设置,如使单元格填充色为红色). 那如果我们想对于每一行( ...

  8. Excel vba 具有零值的单元格中显示0

    1.编写VBA宏:具有零值的单元格中显示0,并保存到"PERSONAL"个人工作簿 2.快速访问工具栏    设置自定义宏按钮 Sub 具有0值的单元格中显示0() Dim A$ ...

  9. 对应的ctrl_取消单元格合并,对空白单元格填充数据,学会Ctrl+Enter五秒搞定

    Excel统计数据过程中,相信大家最不想碰到的就是合并单元格,因为合并区域会对我们的数据统计造成各种麻烦.取消单元格合并后,除第一个单元格有内容外其他的单元格都成了空值. 案例说明:如上图所示,我们需 ...

最新文章

  1. 南大周志华清华胡事民入围院士候选!计算机领域共计7人
  2. python:如何传递一个列表参数
  3. date time 分开存储如何合并_如何将多个日期跨度合并/拆分为一个时间轴(Oracle 11g)?...
  4. android框架连接mysql_三层架构 android访问MSSQL数据库 程序 (服务器端)
  5. Java中的各种数据类型的转换
  6. Win11更新补丁导致应用程序崩溃错误代码0xc0000135怎么解决?
  7. 2019厦门大学计算机复试,2019年厦门大学考研复试分数线已出现
  8. 不再有“寒冬”的人工智能
  9. C++ 填入数字1-9 使数学等式成立
  10. oracle返回工作日的函数,oracle计算一个日期加上指定工作日(排除周六周日和一系列节假日)时间...
  11. React Native布局实践:开发京东客户端首页(四)——首页功能按钮及控件封装
  12. [翻译学习]MonoSLAM: Real-Time Single Camera SLAM
  13. (干货)一文了解导航电子地图领域有哪些前沿热点技术
  14. Echarts 柱状图柱体颜色渐变效果
  15. google 面试题
  16. PPT结尾只会说“谢谢”?学会这些PPT结尾,观众主动为你鼓掌
  17. Python-csv文件打开、csv文件保存和csv文件删除行信息
  18. Adobe After Effects CS6安装失败
  19. 悟空机器人框架以及安装教程
  20. 关于weekendd_

热门文章

  1. 新手自学php,curl应用时接口数据无返回值
  2. 优雅删除Redis中以xx开头的key
  3. https协议使用百度地图api
  4. 网站开发————JavaEE/实训实训实训
  5. reiserfs分区配置
  6. strripos stripos()函数
  7. Java和.NET两个世界的极点:赚钱和娱乐
  8. 支付宝接口第三方调用问题
  9. 移动客服系统怎么样?
  10. UE4蓝图第一人称转第三人称视角编辑(GameOver时)