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 > ,  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 > =  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 > =  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 > =  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 ( ) ; 
    }