POI 复制多个excel文件 合并为一个总excel文件

JAVA合并Excel,把多个Excel合并成一个Excel,合并内容仅包括文字,图片 合并Excel,把多个Excel合并成一个Excel,合并内容仅包括文字,图片 阅读详情

参考:
http://blog.youkuaiyun.com/wutbiao/article/details/8696446
项目中需求:
将12个excel文件合并为一个总excel文件。首先想的思路是读取每个excel文件的sheet然后再copy到总excel文件里,查阅了前辈写的POI工具类,最后生成成功。但逐次打开12个excle文件效率很低,耗时9s,决定换其他思路开发。现将此工具类代码暂放,以后再学习使用。

import java.util.Iterator;
import org.apache.poi.ss.usermodel.DateUtil; 
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class POIUtils {
	public class XSSFDateUtil extends DateUtil {  
	     
	}  
	public static void copyCellStyle(XSSFCellStyle fromStyle, XSSFCellStyle toStyle) {
		
		toStyle.cloneStyleFrom(fromStyle);//此一行代码搞定
		//下面统统不用
		/*
		//对齐方式
        toStyle.setAlignment(fromStyle.getAlignment());  
        //边框和边框颜色  
        toStyle.setBorderBottom(fromStyle.getBorderBottom());  
        toStyle.setBorderLeft(fromStyle.getBorderLeft());  
        toStyle.setBorderRight(fromStyle.getBorderRight());  
        toStyle.setBorderTop(fromStyle.getBorderTop());  
        toStyle.setTopBorderColor(fromStyle.getTopBorderColor());  
        toStyle.setBottomBorderColor(fromStyle.getBottomBorderColor());  
        toStyle.setRightBorderColor(fromStyle.getRightBorderColor());  
        toStyle.setLeftBorderColor(fromStyle.getLeftBorderColor());   
        //背景和前景  
        //toStyle.setFillPattern(fromStyle.getFillPattern());  //填充图案,不起作用,转为黑色  
        toStyle.setFillBackgroundColor(fromStyle.getFillBackgroundColor());  //不起作用
        toStyle.setFillForegroundColor(fromStyle.getFillForegroundColor());  
        toStyle.setDataFormat(fromStyle.getDataFormat());  //数据格式 
        //toStyle.setFont(fromStyle.getFont());  //不起作用
        toStyle.setHidden(fromStyle.getHidden());  
        toStyle.setIndention(fromStyle.getIndention());//首行缩进  
        toStyle.setLocked(fromStyle.getLocked());  
        toStyle.setRotation(fromStyle.getRotation());//旋转  
        toStyle.setVerticalAlignment(fromStyle.getVerticalAlignment());  //垂直对齐
        toStyle.setWrapText(fromStyle.getWrapText()); //文本换行 
        */  
    }  
	public static void mergeSheetAllRegion(XSSFSheet fromSheet, XSSFSheet toSheet) {//合并单元格
		int num = fromSheet.getNumMergedRegions();
		CellRangeAddress cellR = null;
		for (int i = 0; i < num; i++) {
			cellR = fromSheet.getMergedRegion(i);
			toSheet.addMergedRegion(cellR);
		}
	} 
	
	public static void copyCell(XSSFWorkbook wb,XSSFCell fromCell, XSSFCell toCell) {  
        XSSFCellStyle newstyle=wb.createCellStyle();  
        copyCellStyle(fromCell.getCellStyle(), newstyle);  
        //toCell.setEncoding(fromCell.getEncoding());  
        //样式  
        toCell.setCellStyle(newstyle);   
        if (fromCell.getCellComment() != null) {  
            toCell.setCellComment(fromCell.getCellComment());  
        }  
        // 不同数据类型处理  
        int fromCellType = fromCell.getCellType();  
        toCell.setCellType(fromCellType);  
        if (fromCellType == XSSFCell.CELL_TYPE_NUMERIC) {  
            if (XSSFDateUtil.isCellDateFormatted(fromCell)) {  
                    toCell.setCellValue(fromCell.getDateCellValue());  
                } else {  
                    toCell.setCellValue(fromCell.getNumericCellValue());  
                }  
            } else if (fromCellType == XSSFCell.CELL_TYPE_STRING) {  
                toCell.setCellValue(fromCell.getRichStringCellValue());  
            } else if (fromCellType == XSSFCell.CELL_TYPE_BLANK) {  
                // nothing21  
            } else if (fromCellType == XSSFCell.CELL_TYPE_BOOLEAN) {  
                toCell.setCellValue(fromCell.getBooleanCellValue());  
            } else if (fromCellType == XSSFCell.CELL_TYPE_ERROR) {  
                toCell.setCellErrorValue(fromCell.getErrorCellValue());  
            } else if (fromCellType == XSSFCell.CELL_TYPE_FORMULA) {  
                toCell.setCellFormula(fromCell.getCellFormula());  
            } else { // nothing29  
            }  
          
    }  

	public static void copyRow(XSSFWorkbook wb,XSSFRow oldRow,XSSFRow toRow){  
		toRow.setHeight(oldRow.getHeight());
        for (Iterator cellIt = oldRow.cellIterator(); cellIt.hasNext();) {  
            XSSFCell tmpCell = (XSSFCell) cellIt.next();  
            XSSFCell newCell = toRow.createCell(tmpCell.getColumnIndex());  
            copyCell(wb,tmpCell, newCell);  
        }  
    }  
	public static void copySheet(XSSFWorkbook wb,XSSFSheet fromSheet, XSSFSheet toSheet) {   
		mergeSheetAllRegion(fromSheet, toSheet);     
		//设置列宽
        for(int i=0;i<=fromSheet.getRow(fromSheet.getFirstRowNum()).getLastCellNum();i++){ 
        	toSheet.setColumnWidth(i,fromSheet.getColumnWidth(i)); 
        } 
        for (Iterator rowIt = fromSheet.rowIterator(); rowIt.hasNext();) {  
            XSSFRow oldRow = (XSSFRow) rowIt.next(); 
            XSSFRow newRow = toSheet.createRow(oldRow.getRowNum()); 
            copyRow(wb,oldRow,newRow);  
        }  
    }  
	
	
}

业务层处理:

//将所有类型的尽调excel文件合并成一个excel文件
XSSFWorkbook newExcelCreat = new XSSFWorkbook(); 
for(String fromExcelName:fileNameList) {//遍历每个源excel文件,fileNameList为源文件的名称集合
	 InputStream in = new FileInputStream(tempUrl+ File.separator +fromExcelName);
	 XSSFWorkbook fromExcel = new XSSFWorkbook(in);
	 for(int i = 0; i < fromExcel.getNumberOfSheets(); i++) {//遍历每个sheet
		 XSSFSheet oldSheet = fromExcel.getSheetAt(i);
		 XSSFSheet newSheet = newExcelCreat.createSheet(oldSheet.getSheetName()); 
		 POIUtils.copySheet(newExcelCreat, oldSheet, newSheet);
	 } 
 }
 String allFileName=tempUrl+File.separator+"总文件_"+format.format(new Date())+".xlsx";
 FileOutputStream fileOut = new FileOutputStream(allFileName);
 newExcelCreat.write(fileOut); 
 fileOut.flush(); 
 fileOut.close();
 //删除各个源文件
 for(String fromExcelName:fileNameList) {//遍历每个源excel文件
	 File file=new File(tempUrl+File.separator+fromExcelName);
	 if(file.exists()){
		 file.delete();
	 } 
 }

2020.05.14更新博文
 首先不好意思,现在才补充当时的另外一种实现思路。
 因为年代久远,翻了下以前的代码,不知道当时的逻辑是不是解决了效率的问题,各位同学暂且试一下吧。
思路:
 以上弃用的逻辑是遍历读取每个源excel文件,这样肯定耗时。以下的逻辑是只打开读取一次excel源文件,然后将数据塞入,再写出来。
 1.首先定义一个总Excel的模板:allFiles.xlsx,里面每个sheet名字事先定义好,每个sheet里的内容也和各自对应的子Excel文件内容对应好。
在这里插入图片描述
 2.拿到业务数据,遍历每条业务记录,根据目标记录的业务类型+在allFiles.xlsx中对应的sheet,调用各自业务的’下载生成Excel’方法,各自业务操作时处理的都是同一个对象XSSFWorkbook
 3.最后将XSSFWorkbook对象写出
 代码如下:

//1.拿到目标业务数据,封装ddType tableId
if (fileList != null && fileList.size() > 0) {
   for (int i = 0; i < fileList.size(); i++) {
   	String ddType = fileList.get(i).getProfileType();
   	String tableId = fileList.get(i).getCognateTableId();
   	Map<String,String> map=Maps.newHashMap();
   	map.put("ddType", ddType);//ddType:业务类型
   	map.put("tableId", tableId);//tableId:数据库表某条记录的主键id
   	mapList.add(i,map);
   }
}
...
//2.遍历每条记录,根据不同的业务类型进行处理
if (mapList != null && mapList.size() > 0) {
   //2-1.指定总excel的模板文件
   String pathFrom = "/exceltemplates/allFiles.xlsx";   
   @SuppressWarnings("resource")
   XSSFWorkbook fromWorkbook=new XSSFWorkbook(当前类.class.getResourceAsStream(pathFrom)); 
   XSSFWorkbook toWorkbook=new XSSFWorkbook();
   XSSFSheet fromSheet=null;  
   //2-2.遍历,开始生成excle文件的sheet页 
   Map<String,Object> map=new HashMap<String,Object>(); 
   for (int i = 0; i < mapList.size(); i++) {  
   		String ddType = mapList.get(i).get("ddType");
   		String tableId = mapList.get(i).get("tableId");
   		if (ddType.equals("A")) {
   			fromSheet=fromWorkbook.getSheetAt(0);
   			toWorkbook=xxxService.createFile(toWorkbook,fromSheet,tableId);
   		} else if (ddType.equals("B")) {
   			...
   		} 
   		...//省略其他十几个业务类型
   }
}
//3.输出总excle文件到tempurl下
String allDdFilesName = "总文件_" + format.format(new Date()) + ".xlsx";
FileOutputStream workbookOut = new FileOutputStream(tempUrl + allDdFilesName);
toWorkbook.write(workbookOut);
workbookOut.flush();
workbookOut.close(); 
...

  其中某一个业务类的生成excle的方法实现:

public XSSFWorkbook createFile(XSSFWorkbook toWorkbook,XSSFSheet fromSheet,String tableId) throws IOException{  
  	//1.对sheet进行命名
  	XSSFSheet toSheet=toWorkbook.createSheet(); 
  	int sheetAmount=toWorkbook.getNumberOfSheets();
  	int sheetMatchAmount=0;
  	for(int i=0;i<sheetAmount;i++){//遍历sheet
  		if(toWorkbook.getSheetName(i).startsWith("财务报表")){
  			sheetMatchAmount++;
  		}
  	}
  	if(sheetMatchAmount==0){ 
  		toWorkbook.setSheetName(sheetAmount-1, "财务报表_1");
  	}else{ 
  		toWorkbook.setSheetName(sheetAmount-1,"财务报表_"+(sheetMatchAmount+1));
  	}
  	//2.复制源文件sheet框架 
  	POIUtils.copySheet(toWorkbook, fromSheet, toSheet);//调用的还是博文上面的那个工具类
  	//3.根据tableId从数据库中获得数据并封装为map
  	Map<String, Object> paramMap = this.putData(true, tableId);
  	//4.填充数据
  	boolean isData=(boolean)paramMap.get("isData");
      if (isData) {
      	toWorkbook=this.createFile(toWorkbook, toSheet, paramMap);
  	}   
      return toWorkbook;
  }
  
从数据库读取数据后使用EasyExcel将数据填充进excle模板中,再上传到minIO 先将数据从数据库读取出来,我们这里使用的是map根据每条线路的不同,分多个sheet去填充数据的,resolveDbDataToExcelDataUtils类中就是处理数据库数据到excel填充实体类之间的一个转换,如果你数据库里的字段和excel填充实体类中的一致,那也可以不用写,我这里是需要做一个转换的。在很多时候我们都会碰到关于文件上传和下载的问题,本项目中我们使用的是minIO。在此之前我们需先导入这两个依赖,hutool是给后面做压缩文件下载准备的。下载文件,压缩,并响应。 阅读详情

相关推荐

POI 多个excel 合并到同一个sheet(2003版本)

自己以前找了蛮久,后来发现其实也不是很难。不废话 上代码:  public void downloadmore(String mongoId, HttpServletResponse res) throws IOException, InvalidFormatException {                   //        mergeUtil.downloadmore(mon

u011764573的专栏 4269

java将多个excel合并为一个

java可以通过使用jacob.jar包中的方法实现将多个excel合并为一个,代码如下。 提示:该方法可以合成2010版本的excel,2013版本合成的时候可能会出现问题。 // 首先将所有需要合成的excel放到combineFilePath路径上 String combineFilePath = "D:\test\combine\"; // excelPatn是合成excel的文件路径 String excelPath = "D:\test2\combineFile.xlsx"; JacobExc

weixin_47534665的博客 8698

poi复制sheet的内容到另外一个sheet里

1、具体代码如下所示: HSSFRow row; HSSFSheet sheet1= workbook.getSheet("1"); //现有的sheet1名称为 1 for (int i=2;i<data.size()+1;i++){ //data为从数据库查询到的数据 //复制sheet内容到另外一个sheet(...

mengmeng2222222的博客 1万+

Java将多个excel文件合并到一个excel文件中。

Java将多个excel文件合并到一个excel文件中。

qq_43770558的博客 3440

Java使用POI实现多个excel合并成一个excel

Java使用POI实现多个excel合并成一个excel。 (1)使用技术 编程语言:Java 依赖jar包:poi poi组件下载地址:https://archive.apache.org/dist/poi/release/bin/ (2)代码实现 实现思路: excel操作主要有如下几个步骤: 创建新的excel工作簿 合并单元格 创建行 创建列 设置单元格样式 设置单元格值 实现代码: package com.gitee.zhuyb.excel.util;

✅ Java 开发工程师 6872

Apache POI在Java中合并多个Excel表格的实战指南

Apache POI 是一个开源的Java库,用于处理Microsoft Office文档格式。它提供了一套丰富的API,能够让我们轻松地创建、修改、显示或打印多种文档,其中以Excel文件格式的处理最为人所熟知。通过使用Apache POI,开发者可以实现对Microsoft Office文件的读写操作,无需依赖任何Microsoft Office组件。Apache POI支持的文件格式包括:HSSF:用于处理旧版Excel文件(.xls)。

weixin_36444661的博客 906

POI多个Excel合并到一个Excel多个sheet中

文章目录前言一、maven依赖二、操作示例1.引入工具类2.合并Excel示例总结 前言 在合并大量的Excel的时候是否遇到下面这些问题: This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workbook to the cell of a differnt workbook? 或者:The maximum number of cell styles was exce

qq_45116294的博客 2661

《科研伦理与学术规范》期末考试答案2023

26单选(2 分)某学术杂志的评稿人同时是某高校相关专业的硕士生导师,在评判一个稿件的时候,他发现该作者研究的题目很有价值, 他便一边压下这个稿子,一边将稿子的纲要传给自己门下的硕士生, 指导他们使用这个题目独立写出一篇论文,并帮助他们发表在其他期 刊上。D.要善待实验动物,是指在饲养管理和使用实验动物过程中,要采取有效措施,使实验动物免遭不必要的伤害、饥渴、不适、惊恐、折磨、疾病和疼痛,保证动物能够实现自然行为,受到良好的管理与照料,为其提供清洁、舒适的生活环境。张某在压力之下不得不屈从。

Glenseeds的博客 4万+

poi 多个excel合并

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; .

停止使用 981

ABAP BOM展开避坑指南:CS_BOM_EXPL_MAT_V2函数参数配置详解

本文深入解析了SAP ABAP开发中用于物料清单展开的核心函数CS_BOM_EXPL_MAT_V2。针对其复杂的参数配置,如CAPID、STLAN、DATUV和MEHRS,提供了详细的避坑指南和最佳实践,帮助开发者避免数据错误与性能陷阱,实现高效、准确的BOM多层展开。

pea55的博客 852

傻白入门芯片设计,芯片键合(Die Bonding)(四)

傻白入门芯片设计,芯片键合(Die Bonding)(四) 引线键合、倒装芯片键合、管脚贴合技术

qq_46675545的博客 3万+

将多个excel合并成一个包含多个sheet的excel

先定义一个工具类 package com.lmbx.edu.utils; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.x...

文殊的博客 3153

逆变器并联--下垂控制引入虚拟阻抗

说明传统下垂控制的缺点、分析虚拟阻抗的原理和实现方法

weixin_58670090的博客 1万+

JAVA用poi实现多个excel的Sheet合并

前言 项目中遇到需求,需要将多个excel的sheet合并到一个excel里面。网上看了一下文章,但是很多都是断章取义,不是代码不全,就是jar包版本不同一,为此自己解决这个问题后,把解决方案记录下来,供后来的童鞋参考: 第一步:导入poi相关jar包 <dependency> <groupId>org.apache.poi</gr......

lingerlan510的博客 7070

物联网 Mixly-智能楼道灯

一、实验目的及要求 熟悉声音及人体红外传感器用法。 二、实验原理与内容 1.使用声音传感器实现声控灯功能。 2.使用人体红外传感器实现人体检测控制灯功能。 三、实验软硬件环境 硬件:Arduino、LED灯、声音传感器、人体红外传感器 软件:Mixly IDE 四、实验过程(实验步骤、记录、数据、分析) 核心代码截图 声控灯: 人体红外检测灯: 3.实验效果图: (1)、声控灯总线连接: (1)、声控灯声音大于一某个值时灯亮,经过2秒后灯灭: (3)、人体红外检测灯连接总线: (4)、人体红外

qq_43430810的博客 1916

Android Termux 安装Kali Linux 或 kali Nethunter史诗级详细教程

Termux 安装kali

风云小虾米的博客 6万+

java-poi 复制Sheet到另一个excel的sheet中

这里的代码是介绍使用poi复制一个sheet到另一个excel的sheet中,具体请下如下代码; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; import org.apache.poi.hssf.usermodel.HSSFCell; ...

taruxi 8204

FOFA奇技淫巧:从搜索语法到实战场景的深度挖掘

本文深入探讨了FOFA搜索语法在网络空间测绘中的高效应用,从基础语法到实战场景的深度挖掘。通过渗透测试、威胁狩猎、资产发现等实际案例,展示了如何利用FOFA精准定位目标系统、识别蜜罐、追踪威胁,并提供了合规使用指南和性能优化技巧,助力安全工作者提升效率。

weixin_32428571的博客 235

java poi 如何合并多个sheet 为一个sheet_Java POI组件实现多个Excel文件整合成一个多Sheet的Excel文件...

代码:package com.weichai;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.util.Iterator;import org.apache.poi.ss.usermodel.DateUt...

weixin_36266554的博客 1214

解决Google Play签名问题:Android App Bundle上传指南

摘要:本文分享了解决Android App Bundle上传至Google Play时遇到的签名问题的经验。当使用pepk.jar工具加密私钥时,出现"NoSuchAlgorithmException"错误。解决方案包括:确保使用JDK 11+版本、更新pepk.jar工具、验证密钥库信息,并提供详细命令行示例。通过升级开发环境和正确配置签名参数,最终成功生成加密密钥文件。文章为开发者提供了实用的技术参考,强调耐心排查问题的重要性。(149字)

m0_62153576的博客 143

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java 合并两个excel_JAVA用poi实现多个excel的Sheet合并

importorg.apache.poi.ss.usermodel.CellType;importorg.apache.poi.ss.usermodel.DateUtil;importorg.apache.poi.ss.util.CellRangeAddress;import org.apache.poi.xssf.usermodel.*;import java.io.*;importjava.u...

weixin_31062139的博客 1539

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java 复制excel_java 实现 excel sheet 拷贝到另一个Excel文件中 poi

public class CopyExcelSheetToAnotherExcelSheet {public static void main(String[] args) throws FileNotFoundException, IOException {String fromPath = "D:\\share\\jiemu_new\\";// excel存放路径String toPath =...

weixin_39527163的博客 1973

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【poi】跨excel文件多sheet页复制

【poi】跨excel文件多sheet页复制 import static org.apache.poi.ss.usermodel.CellType.BLANK; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.HashMap; import java.util.List; impo...

tingfeng6623的专栏 2726

poi操作excel,复制sheet,复制行,复制单元格

项目中,我们经常使用Poi来操作excel,但是经常碰到一个不方便的地方,不如最简单常用的,在两个excel之间复制sheet,复制行,复制单元格等。 我这里是最近刚做的一个简单封装。不是很好,必须始终传过去一个“目标workbook“的引用,留下个mark! 源码如下: public class POIUtils { // /** // * 把一个excel中的cellstyleta

playAround的专栏 8万+

Java使用POI将多个Sheet合并为一个Sheet

本文为大家分享了Java使用POI将多个Sheet合并为一个Sheet的具体代码,供大家参考。

Lxl1418的博客 2387
上一篇: POI复制excel时,对列宽的复制
下一篇: IDEA+Springboot+gradle+freemarker整合easyui,实现datagrid数据分页展示、使用jxls导出Excel的功能
谢谋仁
博客等级 码龄10年 7粉丝 29原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值