如何使用Apache POI和Java复制Excel工作表并在第二次运行时移除它
实现思路与代码示例
首先咱们得明确两个核心需求:一是复制指定Excel工作表,二是程序第二次运行时自动移除之前复制的那张表。结合你现有的Apache POI代码,我给你整理了完整的实现步骤和代码片段:
第一步:先处理「第二次运行时移除复制工作表」的逻辑
咱们给复制的工作表起一个固定的名称(比如"Wire_Drawing_Copy"),这样每次程序启动时,先检查工作簿里有没有这个名字的表,有的话直接删除。把这段代码放在你现有业务逻辑的最开头:
// 定义复制工作表的固定标识名称,方便后续识别 String copiedSheetName = "Wire_Drawing_Copy"; // 遍历工作簿中的所有工作表,检查是否存在目标复制表 for (int i = 0; i < wb.getNumberOfSheets(); i++) { if (copiedSheetName.equals(wb.getSheetName(i))) { // 移除该工作表 wb.removeSheetAt(i); break; // 找到后立即退出循环,避免索引偏移问题 } }
第二步:执行你原有的数据插入逻辑
这部分就是你已经写好的代码,直接保留即可:
// 原有插入数据逻辑 XSSFSheet wire_drawing = (XSSFSheet) wb.getSheetAt(0); XSSFRow r1 = wire_drawing.getRow(3); XSSFCell c1 = r1.getCell(8); c1.setCellValue(wd); NoOfTickects(n1,"0"); XSSFRow row5 = wire_drawing.getRow(3); XSSFCell cell4 = row5.getCell(4); cell4.setCellValue("2/"+ diameter + "mm HD"); XSSFSheet stranding = (XSSFSheet) wb.getSheetAt(1); XSSFRow r2 = stranding.getRow(2); XSSFCell c2 = r2.getCell(10); c2.setCellValue(bs); NoOfTickects(n2,"1");
第三步:复制指定工作表
完成数据插入后,使用Apache POI的cloneSheet方法复制目标工作表(这里以复制第一个工作表wire_drawing为例),然后给复制的表设置咱们之前定义的固定名称:
// 复制索引为0的工作表(即wire_drawing表),返回新表的索引 int copiedSheetIndex = wb.cloneSheet(0); XSSFSheet copiedSheet = (XSSFSheet) wb.getSheetAt(copiedSheetIndex); // 设置复制表的名称,方便下次运行识别删除 copiedSheet.setSheetName(copiedSheetName);
最后:别忘了保存工作簿
所有操作完成后,一定要将修改后的工作簿写入文件,否则所有操作都不会生效:
// 写入并关闭资源 try (FileOutputStream fos = new FileOutputStream("your-excel-file.xlsx")) { wb.write(fos); } catch (IOException e) { e.printStackTrace(); } wb.close();
逻辑说明
- 第一次运行:程序先检查是否存在
Wire_Drawing_Copy表(此时不存在),然后执行数据插入,最后复制工作表并命名,保存后Excel中就多了一张复制的表。 - 第二次运行:程序启动后会先找到并删除
Wire_Drawing_Copy表,然后执行数据插入,再重新复制一张新的(如果你不需要重新复制,可以把第三步的复制代码注释掉,只保留删除逻辑即可)。
内容的提问来源于stack exchange,提问作者user9073028
相关产品推荐
相关产品推荐

