本文实例为大家分享了Java使用POI将多个Sheet合并为一个Sheet的具体代码,供大家参考,具体内容如下
一、情景描述
最近在项目中客户提到一个新的需求,一开始是在列表查询时导出多个Excel表格,后面提到将多个Excel表格进行合并,实现一个sheet显示多个sheet内容,图示如下:
一开始:
合并后(不同表格空一行隔开):
二、实现思路
首先,先按照生成五张表的思路来生成创建一个Workbook sourceWorkbook
,然后再创建一个Workbook targetWorkbook
,创建一个新的Sheet targetSheet
工作表,之后将sourceWorkbook
中第一个Sheet sheet1
中的内容复制到该表中,再将第二个Sheet sheet2
中的内容复制到targetSheet
中,依次操作,复制完sourceWorkbook
中全部的五张表,即可实现将多个Sheet合并为一个Sheet的操作。
三、示例代码
1.POIUtil工具类
package com.cdtye.itps.jjxt.model.util; import com.cdtye.itps.jjxt.model.excel.CellRangeAddressExcelVo; import org.apache.poi.ss.usermodel.*; import org.springframework.util.CollectionUtils; import java.util.List; /** * @Author Zhongks * @Description //TODO POI导出excel工具类 * @Date 17:16 2021/5/11 * @Param * @return **/ public class POIUtil { /** * @Author Zhongks * @Description //TODO 拷贝sheet(表) * @Date 17:16 2021/5/11 * @Param [targetSheet, sourceSheet, targetWork, sourceWork, startRow, cellRangeAddressExcelVoList] * @return void **/ public static void copySheet(Sheet targetSheet, Sheet sourceSheet, Workbook targetWork, Workbook sourceWork, int startRow, List cellRangeAddressExcelVoList) { if(targetSheet == null || sourceSheet == null || targetWork == null || sourceWork == null){ throw new IllegalArgumentException("调用PoiUtil.copySheet()方法时,targetSheet、sourceSheet、targetWork、sourceWork都不能为空,故抛出该异常!"); } //设置单元格默认宽度 targetSheet.setDefaultColumnWidth(25); //复制源表中的行 for (int i = sourceSheet.getFirstRowNum(); i <= sourceSheet.getLastRowNum(); i++) { Row sourceRow = sourceSheet.getRow(i); Row targetRow = targetSheet.createRow(i+startRow); //创建新的row if (sourceRow != null) { copyRow(targetRow, sourceRow, targetWork, sourceWork); } } //自定义合并单元格样式(若不需要进行单元格合并操作,将cellRangeAddressExcelVoList赋值为null即可) if(!CollectionUtils.isEmpty(cellRangeAddressExcelVoList)){ //合并单元格 for(CellRangeAddressExcelVo model:cellRangeAddressExcelVoList){ targetSheet.addMergedRegion(new org.apache.poi.ss.util.CellRangeAddress(model.getFirstRow(),model.getLastRow(),model.getFirstCol(),model.getLastCol())); } } } /** * @Author Zhongks * @Description //TODO 拷贝row(行) * @Date 17:17 2021/5/11 * @Param [targetRow, sourceRow, targetWork, sourceWork] * @return void **/ public static void copyRow(Row targetRow, Row sourceRow, Workbook targetWork, Workbook sourceWork) { if(targetRow == null || sourceRow == null || targetWork == null || sourceWork == null ){ throw new IllegalArgumentException("调用PoiUtil.copyRow()方法时,targetRow、sourceRow、targetWork、sourceWork、targetPatriarch都不能为空,故抛出该异常!"); } //设置行高 targetRow.setHeight(sourceRow.getHeight()); for (int i = sourceRow.getFirstCellNum(); i
2.需要合并的单元格位置信息实体
package com.cdtye.itps.jjxt.model.excel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.experimental.Accessors; /** * @ClassName CellRangeAddressExcelVo * @Description TODO 需要合并的单元格位置信息Vo * @Author Zhongks * @Date 2021/5/11 14:09 * @Version 1.0 **/ @Data @Accessors(chain = true) @AllArgsConstructor public class CellRangeAddressExcelVo { //起始行号 private int firstRow; //终止行号 private int lastRow; //起始列号 private int firstCol; //终止列号 private int lastCol; }
该实体类是为了进行合并单元格操作,用来存储需要合并的单元格位置信息:
Service层代码:
* * @Author Zhongks * @Description //TODO excel导出 * @Date 12:25 2021/5/7 * @Param [list, response] * @return void **/ public void export(BureauDayShiftVo bureauDayShiftVo,HttpServletResponse response) { try { // 设置下载的Excel名称,以当前时间为文件后缀, String dateTime = DateUtil.formatDateString(new Date(), DateUtil.DATE_FORMAT); String fileName = "供电安全质量日交班表"+dateTime+".xlsx"; // 设置响应输出的头类型 response.setHeader("content-Type", "application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename="+fileName); // excel信息部分 //供电处重点信息追踪表信息 bureauDayShiftVo.setTrackFlag(1); Map trackSafeQualityMap =this.getTrackSafeQualityMap(bureauDayShiftVo); //日安全质量信息表信息 bureauDayShiftVo.setTrackFlag(0); Map safeQualityParamsMap =this.getTrackSafeQualityMap(bureauDayShiftVo); //天窗兑现统计表 Map skylightCashStatisticsMap = this.getSkylightCashStatisticsMap(); //其他安全质量信息表 Map otherSafeQualityInfoMap = this.getOtherSafeQualityInfoMap(bureauDayShiftVo); //安全质量考核表 Map safeQualityAssessmentMap = this.getSafeQualityAssessmentMap(); //添加表 List
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持0133技术站。