欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-23 19:40:04
...

使用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);
相关标签: poi poi