POI excel 多个excel的多个sheet合并

该文章介绍了如何使用ApachePOI库在Java中合并多个Excel文件的不同sheet,包括设置标题样式、内容样式,以及校验和格式化单元格数据的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

POI excel 多个excel的多个sheet合并

POI excel 多个excel的多个sheet合并

public class MergeExcelUtils {

    static Logger logger = LoggerFactory.getLogger(MergeExcelUtils.class);


    public static final  String IDCARD_REGEX="/(^\\d{15}$)|(^\\d{17}[\\d|x|X]$)/";

    public static Workbook mergerExcels(List<InputStream> inputStreamList) throws IOException {

        //新建一个sheet的集合
        List<Sheet> sheets = new ArrayList<>();
        // 读取所有需要合并的Excel文件中的所有Sheet,放到一个列表中
        for (InputStream input : inputStreamList) {
//            FileInputStream input = new FileInputStream(file);
            Workbook workbook = WorkbookFactory.create(input);
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                sheets.add(workbook.getSheetAt(i));
            }
            if(input != null){
                input.close();
            }
        }

        //默认使用第一个的excel的格式
//        // 新建一个目标工作簿和工作表
//        Workbook mergedWorkbook = null;
//        //版本控制流
//        InputStream versionJudgmentInputStream =  null ;
//        //确定excel的版本
//        if(!CollectionUtils.isEmpty(files)){
//            File file = files.get(NumberUtils.INTEGER_ZERO);
//            versionJudgmentInputStream = new FileInputStream(file);
//            mergedWorkbook = WorkbookFactory.create(versionJudgmentInputStream);
//        }else{
//            //默认excel的后缀是xlsx 使用xssf
//            mergedWorkbook = WorkbookFactory.create(true);
//        }
        //指定excel的格式
        // 新建一个目标工作簿和工作表
        Workbook mergedWorkbook = WorkbookFactory.create(true);

        //        mergedWorkbook.setH
        Sheet mergedSheet = mergedWorkbook.createSheet("Merged Sheet");

        //2 设置标题样式
//        CellStyle titleStyle = mergedWorkbook.createCellStyle();
//        titleStyle.setAlignment(HorizontalAlignment.CENTER);//左右居中
//        titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);//上下居中
////        titleStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex());//设置背景色
////        titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//必须设置 否则无效
//        Font titleFont = mergedWorkbook.createFont();
//        titleFont.setFontHeightInPoints((short) 15);//字体大小
//        titleFont.setFontName("黑体");//字体样式
//        titleStyle.setFont(titleFont);
//
//        //设置标题
//        Row row0 = mergedSheet.createRow((int) 0);
//        row0.setHeightInPoints(40);
//        Cell cell0 = row0.createCell(0);
//        cell0.setCellValue("各个学校考试学生信息汇总");
//        cell0.setCellStyle(titleStyle);

        // 3. 设置内容样式
        //设置字体
        Font font = mergedWorkbook.createFont();
        font.setFontHeightInPoints((short)10);
        font.setFontName("宋体");

        /**
         *正确模版
         */
        CellStyle successStyle = mergedWorkbook.createCellStyle();
        //水平居中
        successStyle.setAlignment(HorizontalAlignment.CENTER);
        //垂直居中
        successStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //设置字体
        successStyle.setFont(font);

        /**
         * 错误的模版
         */
        //错误模版
        CellStyle errorStyle = mergedWorkbook.createCellStyle();
        //水平居中
        errorStyle.setAlignment(HorizontalAlignment.CENTER);
        //垂直居中
        errorStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //设置字体
        errorStyle.setFont(font);
        //设置前景颜色
        errorStyle.setFillForegroundColor(IndexedColors.RED.getIndex()); // 是设置前景色不是背景色
        errorStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        //最大的列数
        int maxCell = -1;
        //目标excel的行起始位置,有标题行
        int currentRowNum = 1;
//        mergedSheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5));
        //判断标头列
        Row headerRow = null;

        // 在目标工作表中逐行逐列地复制所有源工作表中的内容
        for (Sheet sheet : sheets) {
            for (int i = 0; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i);
                //判断行是否为空
                if(row  == null){
                    continue;
                }
                //判断这一行的第一个列是否为空
                if (row.getCell(0).getStringCellValue()==null|| row.getCell(0).getStringCellValue().equals("")) {
                    logger.info("continue");
                    continue;
                }
                if(i == 0){
//                    在去判断每一个sheet的第一行row 标题行
                    if(headerRow == null || Short.compare(headerRow.getLastCellNum(),row.getLastCellNum())  < 0 ){
                        headerRow = row;
                    }
                    continue;
                }
                System.out.println(currentRowNum);
                Row mergedRow = mergedSheet.createRow(currentRowNum++);

                for (int j = 0; j < row.getLastCellNum(); j++) {
                    Cell cell = row.getCell(j);
                    if (cell == null) {
                        continue;
                    }
                    Cell mergedCell = mergedRow.createCell(j);
                    boolean styleFlag = true;
                    // i == 1 的时候去判断身份证 i== 2 的时候去判断手机号
                    if(currentRowNum > 2){
                        if(j == 1){
                            //^[1-9]\d{5}(19|20)\d{2}([1-9]|1[-2])([1-9]|[1-2][-9]|3[-1])\d{3}[-9Xx]$
                            Matcher matcher = Pattern.compile(RegexUtils.ID_CARD_NUMBER).matcher(cell.getStringCellValue());
                            boolean b = matcher.find();
                            if(!b){
                                styleFlag = false;
                            }
                        }

                        if(j == 2){
                            Matcher matcher = Pattern.compile(RegexUtils.PHONE_NUMBER).matcher(cell.getStringCellValue());
                            boolean b = matcher.find();
                            if(!b){
                                styleFlag = false;
                            }
                        }
                    }
                    if(styleFlag){
                        mergedCell.setCellStyle(successStyle);
                    }else{
                        mergedCell.setCellStyle(errorStyle);
                    }
                    mergedCell.setCellValue(cell.getStringCellValue());
                }
                // 调整列宽
                for (int colNum = 0; colNum < row.getLastCellNum() ; colNum++) {
                    mergedSheet.autoSizeColumn(colNum);
                    int width = mergedSheet.getColumnWidth(colNum) + 2048;
                    // 设置最小列宽
                    mergedSheet.setColumnWidth(colNum, Math.max(width, 15 * 256));
                }
            }
//            mergedSheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headerRow.getLastCellNum()));
        }
        //标题行
        Row mergedRow = mergedSheet.createRow(0);
        for (int j = 0; j < headerRow.getLastCellNum(); j++) {
            Cell cell = headerRow.getCell(j);
            if (cell == null) {
                continue;
            }
            Cell mergedCell = mergedRow.createCell(j);
            mergedCell.setCellStyle(successStyle);
            mergedCell.setCellValue(cell.getStringCellValue());

            // 调整列宽
            for (int colNum = 0; colNum < headerRow.getLastCellNum() ; colNum++) {
                mergedSheet.autoSizeColumn(colNum);
                int width = mergedSheet.getColumnWidth(colNum) + 2048;
                // 设置最小列宽
                mergedSheet.setColumnWidth(colNum, Math.max(width, 15 * 256));
            }
        }

        // 将目标工作簿中的内容输出到一个新的Excel文件中
//        ByteArrayOutputStream bos = new ByteArrayOutputStream();
//        mergedWorkbook.write(bos);
//        byte[] barray = bos.toByteArray();
//        InputStream is = new ByteArrayInputStream(barray);

        logger.info("合并完成");

        return mergedWorkbook;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值