精华内容
下载资源
问答
  • java excel 合并单元格

    2020-12-11 14:44:05
    easy-poi注解导出,@Excel 注解有个 needMerge 属性,属性描述:是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row),这个属性默认为false,若为true,则会将当前单元格与上

    案例

    Excel 导入导出,大部分使用 easy-poi 或者 easy-excel 两个工具类就可以了,对于简单的一行一行(像关系型数据库表记录)的导出那可真的是啪的一声,很快啊。

    就像下图这样:

    sheet1

    可是要想导出成下图:

    sheet2

    这就有点难度了。

    工具现成方法

    easy-poi

    easy-poi注解导出,@Excel 注解有个 needMerge 属性,属性描述:是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row),这个属性默认为false,若为true,则会将当前单元格与上一行同列单元格进行比较,如果一样,则会合并单元格,这样应付上图是可以的,但是要是跨列,好像就不支持了。

    easy-excel

    easy-excel 注解导出有个 @ContentLoopMerge 注解,表示每隔几列合并单元格,这样对于有固定规律的表格是没问题的,如果是 23333 这种,应该也就不支持了。

    利用 poi Api 完成

    思路
    1. 首先根据渲染的数据,根据需要合并的属性,进行分组,然后计算出,合并单元格数量
    2. 利用easy-poieasy-excel 渲染 Excel ,获得 Workbook
    3. 再根据导出sheet名称,获取Sheet
    4. 利用Sheet#addMergedRegion方法进行合并
    5. done
    计算获得合并单元格

    一般渲染都是list,可以利用 stream 操作进行 GroupBy

    
    TreeMap<String, List<E>> treeMap = list.stream()
            .collect(Collectors.groupingBy(key,
            () -> new TreeMap<String, List<E>>(comparator), 
            Collectors.toList()));
            
    List<Integer> groups = Lists.newArrayList();
    for (Map.Entry<String, List<E>> entry : treeMap.entrySet()) {
        groups.add(entry.getValue().size());
    }
    

    这里主要讲下,一定要用TreeMap这个结构,因为HashMap这种key是乱序的,一旦乱序,就会与已经导出的Excel不一致,一旦不一致,就是乱合并。

    所以groupingBy的第二个参数里面的比较器就尤为重要了,一定要用比较器去控制排序与真实Excel一致。

    分组完毕之后就是将,每个分组size记录下来,以便进行计算格子。

    /**
     * 计算合并格子
     *
     * @param startRow 表头最后行
     * @param cols     需要合并的列 数组
     * @return
     */
    public List<CellRangeAddress> computeRange(int startRow, int[] cols) {
        List<CellRangeAddress> mergeCell = Lists.newArrayList();
        for (Integer group : this.groups) {
            int interval = group;
            if (interval == 1) {
                startRow = startRow + 1;
                continue;
            }
            int beginRow = startRow;
            int endRow = beginRow + interval - 1;
            for (int col : cols) {
                CellRangeAddress range = singleRowCellRange(beginRow, endRow, col);
                mergeCell.add(range);
            }
            startRow = endRow + 1;
        }
        return mergeCell;
    }
    

    每次只能计算一个合并列,需要过滤表头以及知道合并的列,计算获得一系列的CellRangeAddress

    合并
    Sheet sheet = workbook.getSheet(sheetName);
    List<CellRangeAddress> addresses = ranges.get(sheetName);
    for (CellRangeAddress cellAddresses : addresses) {
        sheet.addMergedRegion(cellAddresses);
    }
    

    END

    按照这个方法,基本上可以实现任意合并了,只是稍微有些繁琐。我自己整理了个工具方法,可以稍微简化下流程。

    SheetMerge<TestEntity> sheetMerge = new SheetMerge(list);
    sheetMerge.range("test", TestEntity::getA, (a, b) -> CompareUtil.compare(a, b), new int[]{0}, 1);
    
    ExportParams exportParams = new ExportParams();
    exportParams.setSheetName("test");
    Workbook workbook = ExcelExportUtil.exportExcel(exportParams, TestEntity.class, list);
    sheetMerge.merge(workbook);
    @Cleanup
    BufferedOutputStream outputStream = FileUtil.getOutputStream(file_name);
    workbook.write(outputStream);
    

    最后贴下源码地址:excel-merge

    展开全文
  • Java Excel 合并单元格

    2017-04-23 13:21:00
    //合并单元格CellRangeAddress cra = new CellRangeAddress(0, 0, 0, 4);sheet.addMergedRegion(cra); 转载于:https://www.cnblogs.com/mingyi123/p/6752294.html
    //合并单元格
    CellRangeAddress cra = new CellRangeAddress(0, 0, 0, 4);
    sheet.addMergedRegion(cra);

    转载于:https://www.cnblogs.com/mingyi123/p/6752294.html

    展开全文
  • java excel合并单元格读取

    千次阅读 2019-07-04 10:29:16
    // 判断是否具有合并单元格 if (isMerge) { String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex()); //System.out.print(rs + "_"+ row.getRowNum()+"_"+c.getColumnIndex() +"_"); ...

    转自  https://blog.csdn.net/qq_21454973/article/details/80581459 并稍微改动60行 读取cell内容。

    文件: 

    输出: 

    厂家1_1000000_自然人11_196493_
    厂家1_1000000_自然人12_164194_
    厂家1_1000000_自然人13_17269_
    厂家1_1000000_自然人14_56635_
    厂家1_1000000_自然人15_565406_
    厂家2_2000000_自然人21_483501_
    厂家2_2000000_自然人22_621527_
    厂家2_2000000_自然人23_415647_
    厂家2_2000000_自然人24_54321_
    厂家2_2000000_自然人25_425002_

    pom.xml

    <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.15</version>
    </dependency>

    代码:

    package com.navitek.utils;
    
    
    
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.text.SimpleDateFormat;
    
    /**
     * @Author: syl
     * @Date: 2019/7/3 0003 16:39
     * @Description:
     */
    
    public class ExcelUtils {
    
        public static void main(String[] args) {
            getAllByExcel("E:\\all_temp\\temp.xls");
    
        }
        public static void getAllByExcel(String filepath) {
            try {
                // 同时支持Excel 2003、2007
                File excelFile = new File(filepath); // 创建文件对象
                FileInputStream is = new FileInputStream(excelFile); // 文件流
                Workbook workbook = WorkbookFactory.create(is); // 这种方式 Excel
    
                String[] res = readExcel(workbook, 0, 1, 0);
                for (int i = 0; i < res.length; i++) {
                    System.out.println(res[i]);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        private static String[] readExcel(Workbook wb, int sheetIndex, int startReadLine, int tailLine) {
            Sheet sheet = wb.getSheetAt(sheetIndex);
            Row row = null;
            String[] res = new String[sheet.getLastRowNum() - tailLine + 1];
    
            for (int i = startReadLine; i < sheet.getLastRowNum() - tailLine + 1; i++) {
    
                row = sheet.getRow(i);
                res[i] = "";
                for (Cell c : row) {
                    boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
                    // 判断是否具有合并单元格
                    if (isMerge) {
                        String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
                        //System.out.print(rs + "_"+ row.getRowNum()+"_"+c.getColumnIndex() +"_");
                        res[i] += rs+ "_";
                    } else {
                        //System.out.print(c.getRichStringCellValue() + "");
                        res[i] += getCellValue(c)+ "_";
                    }
                }
                //System.out.println();
            }
    
            if(startReadLine > 0){
                String[] result = new String[res.length - startReadLine];
                for (int i = 0; i < startReadLine; i++) {
                    for (int j = 0; j < res.length; j++) {
                        if(j == res.length - 1)
                            continue;
                        res[j] = res[j+1];
                    }
                }
                for (int i = 0; i < result.length; i++) {
                    result[i] = res[i];
                }
                return result;
            }else{
                return res;
            }
        }
    
        private static boolean isMergedRegion(Sheet sheet, int row, int column) {
            int sheetMergeCount = sheet.getNumMergedRegions();
            for (int i = 0; i < sheetMergeCount; i++) {
                CellRangeAddress range = sheet.getMergedRegion(i);
                int firstColumn = range.getFirstColumn();
                int lastColumn = range.getLastColumn();
                int firstRow = range.getFirstRow();
                int lastRow = range.getLastRow();
                if (row >= firstRow && row <= lastRow) {
                    if (column >= firstColumn && column <= lastColumn) {
                        return true;
                    }
                }
            }
            return false;
        }
    
        public static String getMergedRegionValue(Sheet sheet, int row, int column) {
            int sheetMergeCount = sheet.getNumMergedRegions();
    
            for (int i = 0; i < sheetMergeCount; i++) {
                CellRangeAddress ca = sheet.getMergedRegion(i);
                int firstColumn = ca.getFirstColumn();
                int lastColumn = ca.getLastColumn();
                int firstRow = ca.getFirstRow();
                int lastRow = ca.getLastRow();
    
                if (row >= firstRow && row <= lastRow) {
    
                    if (column >= firstColumn && column <= lastColumn) {
                        Row fRow = sheet.getRow(firstRow);
                        Cell fCell = fRow.getCell(firstColumn);
                        return getCellValue(fCell);
                    }
                }
            }
    
            return null;
        }
    
        private static String getCellValue(Cell cell) {
            SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
            String cellValue = "";
            int cellType = cell.getCellType();
            switch (cellType) {
                case Cell.CELL_TYPE_STRING: // 文本
                    cellValue = cell.getStringCellValue();
                    break;
                case Cell.CELL_TYPE_NUMERIC: // 数字、日期
                    if (DateUtil.isCellDateFormatted(cell)) {
                        cellValue = fmt.format(cell.getDateCellValue()); // 日期型
                    } else {
                        cellValue = String.valueOf((int) cell.getNumericCellValue()); // 数字
                    }
                    break;
                case Cell.CELL_TYPE_BOOLEAN: // 布尔型
                    cellValue = String.valueOf(cell.getBooleanCellValue());
                    break;
                case Cell.CELL_TYPE_BLANK: // 空白
                    cellValue = cell.getStringCellValue();
                    break;
                case Cell.CELL_TYPE_ERROR: // 错误
                    cellValue = "错误";
                    break;
                case Cell.CELL_TYPE_FORMULA: // 公式
                    cellValue = "错误";
                    break;
                default:
                    cellValue = "错误";
            }
            return cellValue;
        }
    }

     

     

    展开全文
  • //在excel中创建一行 row0.createCell(0).setCellValue("月份");//在第一个格子中放入月份 row0.createCell(1).setCellValue("第二个单元格"); row0.createCell(2).setCellValue("横向合并...
    Row row0 = sheet.createRow(0);//在excel中创建一行
            row0.createCell(0).setCellValue("月份");//在第一个格子中放入月份
            row0.createCell(1).setCellValue("第二个单元格");
            row0.createCell(2).setCellValue("横向合并1-12");
            row0.createCell(12).setCellValue("正常-->关注");
            row0.createCell(14).setCellValue("横向合并13-22");
            //合并行合并列。将第一列第二列到第十二列合并
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 2, 11));
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 12, 13));
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 14, 23));
                Row row1 = sheet.createRow(1);//创建第二行
                //循环判断将月份合并
                 if (list.size() > 1) {
                for (int i = 4; i <= rowNum - 1; i++) {
                    for (int start = 3; start < i; start++) {
                        String month = sheet.getRow(start).getCell(0).getStringCellValue();
                        String monthX = sheet.getRow(i).getCell(0).getStringCellValue();
                        if (month.equals(monthX)) {
                            sheet.addMergedRegion(new CellRangeAddress(start, i, 0, 0));
                        }
                    }
                }
    
            }
            ```
    
    展开全文
  • 之前在网上找的方法都得一个表格一个表格的去画,每次写一个导出都要花费很多时间。 最近又要做合并行,防止以后再去写那些重复代码, 于是我就写了个能满足大部分合并单元格导出需求的方法。
  • poi操作excel合并单元格java合并excel单元格 import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi...
  • java excel poi合并单元格
  • I have a Excel file in .xlsx format. I have stored data by merging cells to form various ... I am reading the Excel file via a Java web application and saving its data to a database (MySQL). But ...
  • Java导出Excel合并单元格

    千次阅读 2019-02-07 13:56:11
    Java导出Excel合并单元格
  • java导出Excel合并单元格

    万次阅读 多人点赞 2017-10-22 11:43:03
    网上java导出excel表格并合并单元格的资料不完全,我整理了一份,并亲测能用,附截图。 ①java导出excel用到POI所有jar包,大家可以直接到下面地址下载点击打开链接 ②模拟数据类 package org; public class ...
  • /** * 合并单元格 * * @param sheet * @param firstRow 开始行 * @param lastRow 结束行 * @param firstCol 开始列 * @param lastCol 结束列 */ private void mergeRegion(Sheet sheet...
  • JAVAExcel合并单元格数据读取

    千次阅读 2018-10-26 10:54:37
    使用poi解析excel后,若为合并单元格,仅第一行有数据,后面的合并单元格没有数据; 解决办法 判断cell是否为合并单元格,之后分类处理 //判断是否为合并行 if(isMergedRegion(sheet,j,0)){ int lastRow = ...
  • java导出excel合并单元格

    千次阅读 2018-12-31 13:17:32
    1、java导出excel用到POI所有jar包 ,大家可以直接到下面地址下载点击打开链接 2、导出excel的方法 package org; import java.io.FileOutputStream; import java.util.List; import org.apache.poi.hssf....
  • java合并EXCEL单元格.rarjava合并EXCEL单元格.rarjava合并EXCEL单元格.rarjava合并EXCEL单元格.rarjava合并EXCEL单元格.rarjava合并EXCEL单元格.rarjava合并EXCEL单元格.rarjava合并EXCEL单元格.rarjava合并EXCEL...
  • Java使用POI操作Excel合并单元格

    万次阅读 多人点赞 2018-04-12 15:43:39
    合并单元格的方法: 指定 4 个参数,起始行,结束行,起始列,结束列。然后这个区域将被合并。CellRangeAddress region = new CellRangeAddress(startRow, endRow, startCol, endCol); sheet.addMergedRegion...
  • 合并单元格代码: CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 1, 0, 0); sheet.addMergedRegion(cellRangeAddress); //加入边框 setBorderStyle(BorderStyle.THIN, cellRangeAddress, sheet);...
  • JAVA excel合并单元格原生poi 合并后的效果 直接上代码 (该方法为如果指定行的单元格里面的值一致则进行合并,直接粘贴使用即可) * * @param sheet * @param colIdx 合并的列 * @param startRow 起始行 * @...
  • Java POI 对Excel合并单元格的数据处理 最近在项目开发过程中,有个一个导入Excel文件处理合并单元格数据的需求,就自己在网上找了一个模板,自己进行二次开发来开发需求。 Excel工具类 public class ExcelUtil { ...
  • POI 导出excel文件下拉框问题 1.https://blog.csdn.net/sdaujsj1/article/details/81004209 java导出Excel合并单元格 2https://blog.csdn.net/datangxiajun/article/details/78308979
  • 主要给大家介绍了关于java实现合并单元格的同时并导出excel的相关资料,文中先进行了简单的介绍,之后给出了详细的示例代码,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
  • //合并单元格 sheet.addMergedRegion(new CellRangeAddress(0,0,2,6));//起始行,结束行,起始列,结束列 // 设置 列宽 1.第几列 2.尺寸 sheet.setColumnWidth((short) (7), (short) (30*200));
  • java导出excel合并单元格及设置

    千次阅读 2019-04-23 15:16:12
    package checkout_excel; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; public class MainOut { public static void main(String args[]){ //模拟部分数据 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,176
精华内容 3,670
关键字:

javaexcel合并单元格

java 订阅