Java poi 根据业务合并单元格

原创 2018年04月16日 17:51:54

        Java poi操作Excel 是比较常用的,通常我们用来导出Excel格式的文本数据。比如说两个表,一个是入库明细,一个是结算明细。针对每一条的入库明细可能有对于的几条的结算明细信息,结算明细中有id关联到入库明细。这时候可能会要求把数据展示在一张Excel中。

类似以下的表格


从入库时间到有效期是 来自于 入库明细的表,从结算时间到后面的列是来源于结算明细的表。

要操作合并单元格 主要用到的对 CellRangeAddress的操作。

public CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 计算好 它的构造参数的值

根据每条入库明细下的结算明细数量 计算出跨行的 firstRow 与lastRow

/**
     * 根据跨行数来转化 CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 的 firstRow 与 lastRow
     * @param list   每条记录需要的跨行数
     * @param minRow 从第几行开始跨行
     * @return
     */
    private Map<Integer,Integer> transPositionMap(List<Integer> list,Integer minRow){
    	if(CollectionUtils.isNotEmpty(list)){
    		Map<Integer,Integer> linkedMap = new LinkedHashMap<>();
        	List<Integer> xPositionList = new ArrayList<>();
        	xPositionList.add(minRow);
        	for(Integer pos:list){
        		if(pos == 1 || pos == 0){
        			pos = 1;
        			Integer xPosition = Collections.max(xPositionList);
        			xPositionList.add(xPosition+pos);
        			continue;
        		}
        		Integer xPosition = Collections.max(xPositionList);
        		linkedMap.put(xPosition, xPosition+pos-1);
        		xPositionList.add(xPosition+pos);
        	}
        	return linkedMap;
    	}
		return Collections.emptyMap();
    }
@Test
    public void test3(){
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("test");
        HSSFRow row = sheet.createRow(0);
        String[] strArr = {"入库时间","产品名","商业公司","批号","单价","数量","金额","有效期","结算时间","实际结算数量","实际结算单价","实际结算金额","票号","税金","备注"};
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        Font fontStyle = workbook.createFont();
        fontStyle.setFontHeightInPoints((short) 11);  
        cellStyle.setFont(fontStyle);  
        cellStyle.setAlignment(HorizontalAlignment.CENTER); 
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        for(int i = 0;i<strArr.length;i++){
        	HSSFCell cell = row.createCell(i);
        	cell.setCellValue(strArr[i]);
        	cell.setCellStyle(cellStyle);
        }
        for(int i = 1;i < 20 ;i++){
        	row = sheet.createRow(i);
        	for(int j = 0;j<strArr.length;j++){
        		HSSFCell cell = row.createCell(j); 
        		cell.setCellValue("单元格"+i);
        		cell.setCellStyle(cellStyle);
        	}
        }
        //spanRows 表示 每条记录可能的跨行数
        List<Integer> spanRows = Arrays.asList(1,3,4,4,4,3,1);
        Map<Integer,Integer> positions = transPositionMap(spanRows, 1);
        for(int j = 0;j<8 ;j++){
        	for(Map.Entry<Integer, Integer> entry:positions.entrySet()){
        		CellRangeAddress cra =new CellRangeAddress(entry.getKey(),entry.getValue(), j, j);// 起始行, 终止行, 起始列, 终止列  
                sheet.addMergedRegion(cra); 
        	}
        }
        String excelName = "D:/myExcel.xls";  
        FileOutputStream out = null;  
        try {  
            out = new FileOutputStream(excelName);  
            workbook.write(out);  
            out.flush();  
            out.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            if (out != null)  
                try {  
                    out.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            out = null;  
        }  
    }

控制台执行单元测试后


以上为了简便,直接用的数据来模拟效果。实际中比如 agent_stock 入库明细表 agent_stock 结算明细表

1.agent_stock   left join  agent_stock  来刷选匹配的记录集

2.agent_stock  left join  agent_stock  group by agent_stock  的id ,count(agent_stock.id) 计算每条 agent_stock的跨行数

即相当于单元测试中  List<Integer> spanRows 的作用。

3.注意private Map<Integer,Integer> transPositionMap(List<Integer> list,Integer minRow) 中的方法。


poi导入/导出Excel表格,合并单元格的读取和设置

  • 2017年03月25日 14:25
  • 8KB
  • 下载

java poi 合并单元格

poi 合并 单元格 XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet sheet = wb.createSheet(); //这个就是合并单元格 ...
  • a919423654
  • a919423654
  • 2017-03-29 16:39:01
  • 7162

poi导出数据(需要合并单元格)

import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException...
  • u012572955
  • u012572955
  • 2016-10-09 10:02:46
  • 3854

POI 动态合并单元格

/***** 查询结果 根据机构ID排序的 ******/ /** * 报表导出 * * @throws Exception */ public void queryExce...
  • skieske
  • skieske
  • 2017-01-09 17:57:26
  • 1801

POI导出Excel--合并单元格

package com.test.util; import java.io.FileNotFoundException; import java.io.FileOutputStream; impor...
  • A_lele123
  • A_lele123
  • 2015-01-19 16:36:19
  • 5271

POI实战-java开发excel详解(第四章 常用操作-单元格合并与数据读取)

4.2单元格合并与数据读取 POI中支持单元格合并,主要类为org.apache.poi.hssf.util.Region,通过new Region(rowFrom, colFrom, rowTo,...
  • yuzhenling
  • yuzhenling
  • 2015-08-31 13:54:11
  • 4050

poi 如何实现Excel合并单元格和设置内容

/** * 合并单元格的方法 * * @param sheet一个HSSFSheet对象 * @param row一个行对象 * @param rowindex行索引 * @p...
  • wsbg54
  • wsbg54
  • 2016-08-28 11:05:29
  • 4380

poi获取合并单元格的值

poi获取合并单元格时,如果是遍历获取合并单元格的所有子单元格的值,office的excel都会有值,wps的excel只会第一个子单元格有值,其他子单元格都没值,即cell=null。故意凡是获取合...
  • fuck487
  • fuck487
  • 2017-02-16 16:34:53
  • 4035

POI中设置Excel单元格格式样式(居中,字体,边框,背景色、列宽、合并单元格等)

HSSFSheet sheet = workbook.createSheet("sheet1");//新建sheet页 HSSFCellStyle cellStyle = wb.createCellS...
  • tolcf
  • tolcf
  • 2015-09-10 17:53:45
  • 13020

Apache POI如何获取Excel合并单元格的值

/** * 获取合并单元格的值 * @param sheet * @param row * @param column * @return */ public ...
  • ycb1689
  • ycb1689
  • 2013-08-05 10:56:42
  • 4523
收藏助手
不良信息举报
您举报文章:Java poi 根据业务合并单元格
举报原因:
原因补充:

(最多只允许输入30个字)