excle 合并行

版权声明:本文为CSDN博主「清风掠影_XQ」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xqq580231/article/details/80167909

 

如下:

记录一下,以后备用

首先在maven工程的pom.xml文件中添加

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.14</version>
</dependency>
package com.test.testexcel;
 
public class PoiModel {
    private String content;  
	  
    private String oldContent;  
  
    private int rowIndex;  
  
    private int cellIndex;  
  
    public String getOldContent() {  
        return oldContent;  
    }  
  
    public void setOldContent(String oldContent) {  
        this.oldContent = oldContent;  
    }  
  
    public String getContent() {  
        return content;  
    }  
  
    public void setContent(String content) {  
        this.content = content;  
    }  
  
    public int getRowIndex() {  
        return rowIndex;  
    }  
  
    public void setRowIndex(int rowIndex) {  
        this.rowIndex = rowIndex;  
    }  
  
    public int getCellIndex() {  
        return cellIndex;  
    }  
  
    public void setCellIndex(int cellIndex) {  
        this.cellIndex = cellIndex;  
    }
}
package com.test.testexcel;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
 
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
import com.inforstack.excel.util.PoiModel;  
 
public class Test {
	/** 
     * @param headers 标题集合 tilte的长度应该与list中的model的属性个数一致 
     * @param dataset 内容集合 
     * @param mergeColumns 合并单元格的列 
     */  
    public static String createExcel(String[] headers, List<Map<String, String>> dataset, String[] mergeColumns) {  
        if (headers.length==0){  
            return null;  
        }  
        /*初始化excel模板*/  
        Workbook workbook = new XSSFWorkbook();  
        Sheet sheet = null;  
        try {  
            sheet = workbook.createSheet();  
        }catch (Exception e){  
            e.printStackTrace();  
        }  
        
        /*初始化head,填值标题行(第一行)*/  
        Row row0 = sheet.createRow(0);  
        for(int i = 0; i < headers.length; i++){  
            /*创建单元格,指定类型*/  
            Cell cell_1 = row0.createCell(i, Cell.CELL_TYPE_STRING);  
            cell_1.setCellValue(headers[i]);  
        } 
        
        List<PoiModel> poiModels = new ArrayList<PoiModel>();  
        Iterator<Map<String, String>> iterator = dataset.iterator();  
        int index = 1;	//这里1是从excel的第二行开始,第一行已经塞入标题了  
        while (iterator.hasNext()){  
            Row row = sheet.createRow(index);  
            // 取得当前这行的map,该map中以key,value的形式存着这一行值
            Map<String, String> map = iterator.next();  
            // 循环列数,给当前行塞值  
            for(int i = 0; i < headers.length; i++) {  
                String old = "";  
                // old存的是上一行统一位置的单元的值,第一行是最上一行了,所以从第二行开始记
                if(index > 1) {  
                    old = poiModels.get(i) == null ? "" : poiModels.get(i).getContent();  
                }  
                
                String value = map.get(headers[i]);
                CellRangeAddress cra = null;
            	// 循环需要合并的列  
            	for(int j = 0; j < mergeColumns.length; j++){ 
            		PoiModel poiModel = null;
            		if(index == 1) {  
            			poiModel = new PoiModel();  
            			poiModel.setOldContent(value);  
            			poiModel.setContent(value);  
            			poiModel.setRowIndex(1);  
            			poiModel.setCellIndex(i);  
            			poiModels.add(poiModel);  
            			old = value;
            			break;  
            		}  
            		poiModel = poiModels.get(i);
            		
            		int rowStartIndex = poiModel.getRowIndex();
            		int rowEndIndex = index - 1;
            		int cellIndex = poiModel.getCellIndex();
            		String content = poiModel.getContent();
            		String preOldContent = poiModels.get(0).getOldContent();
            		String preValue = map.get(headers[0]);
            		Boolean isHeaderEquals = mergeColumns[j].equals(headers[i]);
            		
            		if(i == 0 && isHeaderEquals && !content.equals(value)) {  
            			if (rowStartIndex != rowEndIndex) {
            				cra=new CellRangeAddress(rowStartIndex, rowEndIndex, cellIndex, cellIndex);  
            				sheet.addMergedRegion(cra);  
            			}
            			// 重新记录该列的内容为当前内容,行标记改为当前行标记  
            			poiModel.setContent(value);  
            			poiModel.setRowIndex(index);  
            			poiModel.setCellIndex(i);  
            		} else if (i > 0 && isHeaderEquals) {
            			if(!content.equals(value) || (content.equals(value) && !preOldContent.equals(preValue))) {  
            				if (rowStartIndex != rowEndIndex) {
            					cra = new CellRangeAddress(rowStartIndex, rowEndIndex, cellIndex, cellIndex);  
                            	sheet.addMergedRegion(cra);  
                            }
                            poiModels.get(i).setContent(value);  
                            poiModels.get(i).setRowIndex(index);  
                            poiModels.get(i).setCellIndex(i);  
                        } 
            		}
            		if(isHeaderEquals && index == dataset.size()) {
            			if (i == 0) {
            				if (content.equals(value)) {
            					cra = new CellRangeAddress(rowStartIndex, index, cellIndex, cellIndex);  
                				sheet.addMergedRegion(cra);
            				}
            			} else if (i > 0) {
            				if (content.equals(value) && preOldContent.equals(preValue)) {
            					cra = new CellRangeAddress(rowStartIndex, index, cellIndex, cellIndex);  
                				sheet.addMergedRegion(cra);
            				}
            			}
                    } 
            	}  
                Cell cell = row.createCell(i, Cell.CELL_TYPE_STRING);  
                cell.setCellValue(value);  
            	// 在每一个单元格处理完成后,把这个单元格内容设置为old内容  
            	poiModels.get(i).setOldContent(old);  
            }  
            index++;  
        }  
        
        /*生成临时文件*/  
        FileOutputStream out = null;  
        String localPath = null;  
        File tempFile = null;  
        String fileName = String.valueOf(new Date().getTime()/1000);  
        try {  
            tempFile = File.createTempFile(fileName, ".xlsx");  
            localPath = tempFile.getAbsolutePath();  
            out = new FileOutputStream(localPath);  
            workbook.write(out);  
        } catch (IOException e){  
            e.printStackTrace();  
        } finally {  
            try {  
                out.flush();  
                out.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        return localPath;  
    }  
  
    public static void main(String[] args) throws IOException{
    	String[] headers = {"单位名称", "IP", "IP分类", "危险程度"};    
        List<Map<String, String>> list = new ArrayList<Map<String, String>>();    
          
        Map<String, String> map = new HashMap<String, String>();    
        map.put("单位名称","test");    
        map.put("IP","10.130.138.96");    
        map.put("IP分类","主机IP");  
        map.put("危险程度","高危");  
        list.add(map);   
        map = new HashMap<String, String>();    
        map.put("单位名称","test");    
        map.put("IP","10.130.138.96");    
        map.put("IP分类","主机IP");    
        map.put("危险程度","高危");  
        list.add(map);  
        list.add(map);  
        map = new HashMap<String, String>();    
        map.put("单位名称","test111");    
        map.put("IP","10.130.138.96");    
        map.put("IP分类","主机IP");  
        map.put("危险程度","高危");  
        list.add(map);  
        list.add(map);  
        list.add(map);  
        list.add(map);  
        String[] regions = new String[]{"单位名称", "IP", "IP分类", "危险程度"};  
        System.out.println(createExcel(headers, list, regions));
    }  
}

感谢大神的分享

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值