使用Java 拷贝sheet 到其他excel上
话不多说直接上代码,大家自己理解即可,代码比较简单
我都加上了注释,方便理解
/**
* 拷贝Excel工作表的方法。
*
* @param
* @throws Exception 如果发生错误则抛出异常
*/
public void copySheet() throws Exception {
// 获取日志记录器实例
Logger logger = Logger.getLogger("copySheet");
logger.info("开始拷贝sheet");
// 设置ZipSecureFile的最小解压比率,防止某些压缩文件导致内存溢出
ZipSecureFile.setMinInflateRatio(0.001);
// 获取要复制的工作表名称
String sheetName = "sheet";
// 获取源Excel文件路径
String sourceExcelFilePath = "source.xlsx";
// 获取目标Excel文件路径
String targetExcelFilePath = "target.xlsx";
try (
// 打开源Excel文件输入流
FileInputStream sourceFis = new FileInputStream(sourceExcelFilePath);
// 创建源Workbook对象
Workbook sourceWorkbook = new XSSFWorkbook(sourceFis);
// 打开目标Excel文件输入流
FileInputStream targetFis = new FileInputStream(targetExcelFilePath);
// 创建目标Workbook对象
Workbook targetWorkbook = new XSSFWorkbook(targetFis)
) {
// 获取源工作表(这里假设只处理第一个工作表)
Sheet sourceSheet = sourceWorkbook.getSheetAt(0);
if (sourceSheet == null) {
logger.info("没有找到源sheet");
throw new Exception("没有找到源sheet");
}
// 检查目标工作簿中是否已经存在同名的工作表
Sheet ifExist = targetWorkbook.getSheet(sheetName);
if (ifExist != null) {
logger.info("Sheet '" + sheetName + "' 已经存在");
throw new Exception("Sheet '" + sheetName + "' 已经存在");
}
// 在目标工作簿中创建新的工作表
Sheet targetSheet = targetWorkbook.createSheet(sheetName);
// 遍历源工作表的所有行并逐行复制到目标工作表
for (int i = 0; i <= sourceSheet.getLastRowNum(); i++) {
Row sourceRow = sourceSheet.getRow(i);
if (sourceRow != null) {
Row targetRow = targetSheet.createRow(i);
copyRow(sourceWorkbook, targetWorkbook, sourceSheet, targetSheet, sourceRow, targetRow);
}
}
// 将更改写回到目标Excel文件
try (FileOutputStream fos = new FileOutputStream(targetExcelFilePath)) {
targetWorkbook.write(fos);
}
logger.info("Sheet '" + sheetName + "' 复制成功");
}
}
/**
* 复制单个行及其单元格的内容和样式。
*
* @param sourceWorkbook 源工作簿
* @param targetWorkbook 目标工作簿
* @param sourceSheet 源工作表
* @param targetSheet 目标工作表
* @param sourceRow 源行
* @param targetRow 目标行
*/
private static void copyRow(Workbook sourceWorkbook, Workbook targetWorkbook,
Sheet sourceSheet, Sheet targetSheet,
Row sourceRow, Row targetRow) {
// 设置ZipSecureFile的最小解压比率,防止某些压缩文件导致内存溢出
ZipSecureFile.setMinInflateRatio(0.001);
// 遍历源行中的所有单元格并逐个复制到目标行
for (Cell sourceCell : sourceRow) {
Cell targetCell = targetRow.createCell(sourceCell.getColumnIndex());
copyCell(sourceWorkbook, targetWorkbook, sourceSheet, targetSheet, sourceCell, targetCell);
}
}
/**
* 复制单个单元格的内容和样式。
*
* @param sourceWorkbook 源工作簿
* @param targetWorkbook 目标工作簿
* @param sourceSheet 源工作表
* @param targetSheet 目标工作表
* @param sourceCell 源单元格
* @param targetCell 目标单元格
*/
private static void copyCell(Workbook sourceWorkbook, Workbook targetWorkbook,
Sheet sourceSheet, Sheet targetSheet,
Cell sourceCell, Cell targetCell) {
// 设置ZipSecureFile的最小解压比率,防止某些压缩文件导致内存溢出
ZipSecureFile.setMinInflateRatio(0.001);
// 根据源单元格的数据类型设置目标单元格的内容
switch (sourceCell.getCellType()) {
case STRING:
targetCell.setCellValue(sourceCell.getStringCellValue());
break;
case NUMERIC:
targetCell.setCellValue(sourceCell.getNumericCellValue());
break;
case BOOLEAN:
targetCell.setCellValue(sourceCell.getBooleanCellValue());
break;
case FORMULA:
targetCell.setCellFormula(sourceCell.getCellFormula());
break;
default:
break;
}
// 复制源单元格的样式到目标单元格
CellStyle newCellStyle = targetWorkbook.createCellStyle();
newCellStyle.cloneStyleFrom(sourceCell.getCellStyle());
targetCell.setCellStyle(newCellStyle);
}