深度拷贝Excel文件中sheet工作簿

使用POI复制sheet工作簿,网上的绝大多数教程都是挨个单元格复制,由于我的业务需要深度拷贝,以下是复制工作簿到新工作簿的代码实现:

/**
* 复制sheet工作簿
*
* @param sourceFile   源文件
* @param sheetIndex   要复制sheet的索引
* @param newSheetName 复制sheet后的新名称
* @throws IOException 流错误
*/
public static void copySheet(File sourceFile, Integer sheetIndex, String newSheetName) throws IOException {
    //一定要用文件输入流最为参数加到workbook,将文件直接作为参数加入workbook会报错    
    InputStream sourceIn = new FileInputStream(sourceFile);
    XSSFWorkbook sourceWorkbook = new XSSFWorkbook(sourceIn);

    //poi提供了可以不加的新名称的方法
    XSSFSheet targetSheet = sourceWorkbook.cloneSheet(sheetIndex, newSheetName);

    //将文件一定要转为输出流,因为克隆的sheet是在workbook对象中,没有在文件中,需要workbook写入输出流
    //修改workbook后,一定要记得将work重新写入文件的输出流中,是不是源文件都可以
    FileOutputStream fileOut = new FileOutputStream(sourceFile);
    sourceWorkbook.write(fileOut);
    
    fileOut.flush();
    fileOut.close();
    sourceWorkbook.close();
}

注意:克隆出来的sheet表格不会克隆Excel顶端标题行,需要自己指定,具体代码如下所示:

//作用是将excel的各种设置放到XSSFName对象中
XSSFName name1 = workbook.createName();
//顶端标题行的标志是"_xlnm.Print_Titles"
name1.setNameName("_xlnm.Print_Titles");
//sheet工作簿名称中含有"-"字符,Excel会将sheet工作簿名称进行切割,所以需要将sheet工作簿名称放到单引号中,38、39代表标题行的行号,
name1.setRefersToFormula("'20TR01001TR-2-1-1_D'!$38:$39");
//可以设置,也可以不设置,1代表sheet工作簿的序号,在上一行代码中已经指明了sheet工作簿
name1.setSheetIndex(1);
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值