深度拷贝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);
上一篇: python 类详解及简单实例
下一篇: 将多个EXCEl表中的Sheet簿合并