ExcelMergeUtil工具类
package com. sdy. resdir. biz. util ;
import com. alibaba. excel. metadata. CellData ;
import com. alibaba. excel. metadata. Head ;
import com. alibaba. excel. write. handler. CellWriteHandler ;
import com. alibaba. excel. write. metadata. holder. WriteSheetHolder ;
import com. alibaba. excel. write. metadata. holder. WriteTableHolder ;
import org. apache. poi. ss. usermodel. Cell ;
import org. apache. poi. ss. usermodel. CellType ;
import org. apache. poi. ss. usermodel. Row ;
import org. apache. poi. ss. usermodel. Sheet ;
import org. apache. poi. ss. util. CellRangeAddress ;
import java. math. BigDecimal ;
import java. util. List ;
import static org. apache. poi. ss. usermodel. CellType . NUMERIC ;
public class ExcelMergeUtil implements CellWriteHandler {
private int [ ] mergeColumnIndex;
private int mergeRowIndex;
public ExcelMergeUtil ( ) {
}
public ExcelMergeUtil ( int mergeRowIndex, int [ ] mergeColumnIndex) {
this . mergeRowIndex = mergeRowIndex;
this . mergeColumnIndex = mergeColumnIndex;
}
@Override
public void beforeCellCreate ( WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellCreate ( WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellDataConverted ( WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellDispose ( WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List < CellData > cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
int curRowIndex = cell. getRowIndex ( ) ;
int curColIndex = cell. getColumnIndex ( ) ;
if ( curRowIndex > mergeRowIndex) {
for ( int i = 0 ; i < mergeColumnIndex. length; i++ ) {
if ( curColIndex == mergeColumnIndex[ i] ) {
mergeWithPrevRow ( writeSheetHolder, cell, curRowIndex, curColIndex) ;
break ;
}
}
}
}
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 ( ) ;
Boolean dataBool = preData. equals ( curData) ;
if ( dataBool) {
Sheet sheet = writeSheetHolder. getSheet ( ) ;
List < CellRangeAddress > mergeRegions = sheet. getMergedRegions ( ) ;
boolean isMerged = false ;
for ( int i = 0 ; i < mergeRegions. size ( ) && ! isMerged; i++ ) {
CellRangeAddress cellRangeAddr = mergeRegions. get ( i) ;
if ( cellRangeAddr. isInRange ( curRowIndex - 1 , curColIndex) ) {
sheet. removeMergedRegion ( i) ;
cellRangeAddr. setLastRow ( curRowIndex) ;
sheet. addMergedRegion ( cellRangeAddr) ;
isMerged = true ;
}
}
if ( ! isMerged) {
CellRangeAddress cellRangeAddress = new CellRangeAddress ( curRowIndex - 1 , curRowIndex, curColIndex, curColIndex) ;
sheet. addMergedRegion ( cellRangeAddress) ;
}
}
}
}
控制层调用
public void downLoadResItem ( HttpServletResponse response, String resName, Integer isOnline, Integer resType, Integer resLevel, Integer resPower, Integer resPowerDept, Integer realmId) throws IOException {
if ( StringUtil . isNotBlank ( resName) ) {
resName = URLDecoder . decode ( resName, "UTF-8" ) ;
}
List < RdResourceDirExcelDTO > rdResourceDirList = rdResourceDirService. getList ( resName, isOnline, resType, resLevel, resPower, resPowerDept, realmId) ;
response. setContentType ( "application/vnd.ms-excel" ) ;
response. setCharacterEncoding ( "utf-8" ) ;
String fileName = URLEncoder . encode ( "资源列表下载" , "UTF-8" ) ;
response. setHeader ( "Content-disposition" , "attachment;filename=" + fileName + ".xls" ) ;
ServletOutputStream output = response. getOutputStream ( ) ;
ExcelWriter writer = new ExcelWriter ( output, ExcelTypeEnum . XLS , true ) ;
Sheet sheet = new Sheet ( 1 , 0 , ResItemExcelVo . class ) ;
List < ResItemExcelVo > voList = setResItemData ( rdResourceDirList) ;
int [ ] mergeColumeIndex = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } ;
int mergeRowIndex = 2 ;
EasyExcel . write ( response. getOutputStream ( ) , ResItemExcelVo . class )
. sheet ( "第一页" )
. registerWriteHandler ( new ExcelMergeUtil ( mergeRowIndex, mergeColumeIndex) )
. doWrite ( voList) ;
writer. finish ( ) ;
output. flush ( ) ;
}
效果类似下图