You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:41:44