Java操作Excel文件

这篇博客分享了作者如何使用Java进行Excel文件的合并操作。通过学习和研究现有代码,作者成功实现了文档合并,并感到兴奋和成就感。文章主要涵盖合并的主方法。

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

最近在做excel合并,之前一点也不了解java类操作excel,开始做之前不知道怎么做,还有点小紧张,不过看了之前系统有部分代码,再加上网上搜了些关于这方面的知识,现在把文档合并弄好了,好高兴,又学新知识啦,啦啦啦啦啦了!!!

1. 合并主方法

private String combine(List<String> list,String taskId,String modelName){
	//合并附件
	GetTogether comb = new GetTogether();
	//合并附件后存放的位置
	File file = new File(resultCombinepath);
	if (!file.exists()) {
		System.out.println("创建文件夹:"+file.getAbsolutePath());
		//创建一个目录,它的路径名由当前 File 对象指定。 
		file.mkdirs();
	}
		
	String resultDocName = modelName.substring(0, modelName.length()-4) + "合并文档" + modelName.substring(modelName.length()-4, modelName.length());
	//合并文档存储路径
	String fileName = resultCombinepath+resultDocName;
	file = new File(file,taskId+".xls");
	int startRow = 0;// 开始合并行数
	if(list.size() > 1){
		startRow = decideStartRows(list.get(0));
	}
	for(int i=1;i<list.size();i++){
		if(comb.Together(list.get(0), list.get(i), fileName, startRow)){
			list.set(0, fileName);
		}else{
			return 0+":第"+i+"个文件合并失败!";
		}
	}

2.下面对上面代码中主要的合并方法comb.Together(list.get(0), list.get(i), fileName, startRow)进行记录

/**
	 * @param obj1 需要合并的第一个文档
	 * @param obj2 需要合并的第二个文档
	 * @param obj3 合并的最终文档
 */
	@RemoteMethod
	public boolean Together(Object obj1, Object obj2, Object obj3, int startRow) {
		       /* 合并的最终文档路径  */
			name = (String) obj3; 
			try {
				//创建对这两个工作薄的引用
				first(obj1, obj2);
			} catch(Exception e){
				e.printStackTrace();
				return false;
			}
			wb = Copy(wb1, name);  
			
			//对两个工作薄的工作表的引用
			Sheet sheet2 = wb2.getSheetAt(0);
			Sheet sheet = wb.getSheetAt(0);
			
			Row row, row2;
			//得到第一行(表头)
			row2 = sheet2.getRow(startRow);
			row = sheet.getRow(startRow);
			Cell cell, cell2;
			//两个表头共有的单元格数(列数)
			ID = new int[row2.getLastCellNum() + row.getLastCellNum()];
			int k = -1;
			boolean b = false;
			//比较表头信息,记录数组,以待下面信息复制使用
			for (int i = 0; row2.getCell(i) != null; i++) {
				int j = 0;
				b = false;
				//指定列的单元格对象
				cell2 = row2.getCell(i);
				for (j = 0; row.getCell(j) != null; j++) {
					cell = row.getCell(j);
					//判断单元格的值是否相同
					if (cell.getStringCellValue().equals(cell2.getStringCellValue())) {
						b = true;
						break;
					}
				}
				if (b) {
					ID[++k] = j;
				} else {  //如果row2的某一列和row中的任何一列都不同,则将row2的这一列写到row中最后一列
					ID[++k] = row.getLastCellNum();
					row.createCell(row.getLastCellNum());
					this.changeCellValue(row.getCell(row.getLastCallNum()-1),cell2);
				}
			}
			//从第二行开始加数据
			for (short i = (short)(startRow+1); i <= sheet2.getLastRowNum(); i++) {
				row2 = sheet2.getRow(i);
				addRow(ID, row2);
			}
			Save(wb, name);
		return true;
	}


3.对上面first(obj1,obj2)进行记录

        /**
	 * 初始化WorkbookFactory
	 * @param obj1 需要合并的第一个文档 
	 * @param obj2 需要合并的第二个文档
	 * @throws IOException 
	 * @throws InvalidFormatException 
	 */
	protected void first(Object obj1, Object obj2) throws Exception{
		InputStream inp1 = null;
		InputStream inp2 = null;
		inp1 = new FileInputStream("" + (String) obj1);
		inp2 = new FileInputStream("" + (String) obj2);
		wb1 = WorkbookFactory.create(inp1);
		wb2 = WorkbookFactory.create(inp2);
	}

4.对上面Copy(wb1, name)代码记录

	/**
	 * 
	 * @param _wb1 要复制到的Workbook对象
	 * @param fileName 
	 * @return 需要复制的Workbook的目标对象
	 */
	protected Workbook Copy(Workbook _wb1,String filename){
		//将需要复制的_wb1输出到filename的excel中
		Save(_wb1, filename);
		//创建目标文件的引用
		InputStream inp = null;
		Workbook _wb = null;
		try {
			//根据目标文件的输入流,创建一个对目标文件的引用
			inp = new FileInputStream("" + filename);
			_wb = WorkbookFactory.create(inp);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (InvalidFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return _wb;
	}


5.对以上代码Save(_wb1,filename)记录

	/**
	 * 
	 * @param _wb 需要保存的Workbook对象
	 * @param fileName 保存的目标对象路径
	 * @return 保存后的Workbook对象,第一层是时是生成空的目标文件空xls
	 */
	protected Object Save(Workbook _wb, String fileName){
		FileOutputStream fileOut = null;
		try {
			fileOut = new FileOutputStream("" + fileName);
			//把_wb对象输出到fileName(如:合并文档.xls)中,及创建目标文件的xls,空的xls
			_wb.write(fileOut);
			fileOut.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return _wb;
	}


     以上代码只是整体代码的梗概,但是已经描述出java操作excel的基本知识。进行文档合并,首先需要生成目标文件的excel:Save(_wb1,filename),然后再对需要复制的excel和已生成的目标文件引用,最后就可以通过excel读取行列等知识进行复制操作了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值