java复制sheet_Java 操作POI 之复制sheet页

该代码段展示了如何使用Apache POI库在Java中复制HSSFSheet(Excel工作表)的内容,包括行、列及合并单元格,并在目标工作表中保持原有的样式和数据类型。它遍历源工作表的所有行和列,复制单元格数据,处理合并区域,并调整列宽。此功能适用于需要批量复制Excel工作表内容的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来点干货直接上代码,就不细说了

package com.qs.web.tools.core.excel;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

import java.util.TreeSet;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.ss.util.CellRangeAddress;

public   class ExcelCopySheetUtil {

public ExcelCopySheetUtil() {

}

public static void copySheets(HSSFSheet newSheet, HSSFSheet sheet) {

copySheets(newSheet, sheet, true);

}

public static void copySheets(HSSFSheet newSheet, HSSFSheet sheet,

boolean copyStyle) {

int maxColumnNum = 0;

Map styleMap = (copyStyle) ? new HashMap()

: null;

for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {

HSSFRow srcRow = sheet.getRow(i);

HSSFRow destRow = newSheet.createRow(i);

if (srcRow != null) {

ExcelCopySheetUtil.copyRow(sheet, newSheet, srcRow, destRow,

styleMap);

if (srcRow.getLastCellNum() > maxColumnNum) {

maxColumnNum = srcRow.getLastCellNum();

}

}

}

for (int i = 0; i <= maxColumnNum; i++) {    //设置列宽

newSheet.setColumnWidth(i, sheet.getColumnWidth(i));

}

}

/**

* 复制并合并单元格

* @param  newSheet

* @param  sheet

* @param  copyStyle

*/

public static void copyRow(HSSFSheet srcSheet, HSSFSheet destSheet,

HSSFRow srcRow, HSSFRow destRow,

Map styleMap) {

Set mergedRegions = new TreeSet();

destRow.setHeight(srcRow.getHeight());

int deltaRows = destRow.getRowNum() - srcRow.getRowNum(); //如果copy到另一个sheet的起始行数不同

for (int j = srcRow.getFirstCellNum(); j <= srcRow.getLastCellNum(); j++) {

HSSFCell oldCell = srcRow.getCell(j); // old cell

HSSFCell newCell = destRow.getCell(j); // new cell

if (oldCell != null) {

if (newCell == null) {

newCell = destRow.createCell(j);

}

copyCell(oldCell, newCell, styleMap);

CellRangeAddress mergedRegion = getMergedRegion(srcSheet,

srcRow.getRowNum(), (short) oldCell.getColumnIndex());

if (mergedRegion != null) {

CellRangeAddress newMergedRegion = new CellRangeAddress(

mergedRegion.getFirstRow() + deltaRows,

mergedRegion.getLastRow() + deltaRows, mergedRegion

.getFirstColumn(), mergedRegion

.getLastColumn());

CellRangeAddressWrapper wrapper = new CellRangeAddressWrapper(

newMergedRegion);

if (isNewMergedRegion(wrapper, mergedRegions)) {

mergedRegions.add(wrapper);

destSheet.addMergedRegion(wrapper.range);

}

}

}

}

}

/**

* 把原来的Sheet中cell(列)的样式和数据类型复制到新的sheet的cell(列)中      *

* @param  oldCell

* @param  newCell

* @param styleMap

*/

public static void copyCell(HSSFCell oldCell, HSSFCell newCell,

Map styleMap) {

if (styleMap != null) {

if (oldCell.getSheet().getWorkbook() == newCell.getSheet()

.getWorkbook()) {

newCell.setCellStyle(oldCell.getCellStyle());

} else {

int stHashCode = oldCell.getCellStyle().hashCode();

HSSFCellStyle newCellStyle = styleMap.get(stHashCode);

if (newCellStyle == null) {

newCellStyle = newCell.getSheet().getWorkbook()

.createCellStyle();

newCellStyle.cloneStyleFrom(oldCell.getCellStyle());

styleMap.put(stHashCode, newCellStyle);

}

newCellStyle.setLocked(false);

newCell.setCellStyle(newCellStyle);

}

}

switch (oldCell.getCellType()) {

case HSSFCell.CELL_TYPE_STRING:

newCell.setCellValue(oldCell.getStringCellValue());

break;

case HSSFCell.CELL_TYPE_NUMERIC:

newCell.setCellValue(oldCell.getNumericCellValue());

break;

case HSSFCell.CELL_TYPE_BLANK:

newCell.setCellType(HSSFCell.CELL_TYPE_BLANK);

break;

case HSSFCell.CELL_TYPE_BOOLEAN:

newCell.setCellValue(oldCell.getBooleanCellValue());

break;

case HSSFCell.CELL_TYPE_ERROR:

newCell.setCellErrorValue(oldCell.getErrorCellValue());

break;

case HSSFCell.CELL_TYPE_FORMULA:

newCell.setCellFormula(oldCell.getCellFormula());

break;

default:

break;

}

}

// 获取merge对象

public static CellRangeAddress getMergedRegion(HSSFSheet sheet, int rowNum,

short cellNum) {

for (int i = 0; i < sheet.getNumMergedRegions(); i++) {

CellRangeAddress merged = sheet.getMergedRegion(i);

if (merged.isInRange(rowNum, cellNum)) {

return merged;

}

}

return null;

}

private static boolean isNewMergedRegion(

CellRangeAddressWrapper newMergedRegion,

Set mergedRegions) {

boolean bool = mergedRegions.contains(newMergedRegion);

return !bool;

}

}

可以使用 Apache POI 库中的 `cloneSheet()` 方法实现将一个 sheet 复制到另一个 Excel 文件的 sheet 中。 具体实现步骤如下: 1. 创建一个新的工作簿对象,例如 `Workbook wb2 = new XSSFWorkbook();`。 2. 使用 `wb2.createSheet()` 方法创建一个新的 sheet 对象,并指定要将要复制sheet 的名称。 3. 使用 `wb1.getSheet(sheetName)` 方法获取要复制sheet 对象。 4. 使用 `wb2.cloneSheet()` 方法将要复制sheet 复制到新的工作簿对象中。该方法返回一个新的 sheet 对象,保存在变量中。 5. 使用 `wb2.write()` 方法将新的工作簿对象保存到磁盘上的 Excel 文件中。 示例代码如下: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class CopySheetToAnotherExcel { public static void main(String[] args) throws Exception { // 打开旧的 Excel 文件 FileInputStream fis = new FileInputStream(new File("old.xlsx")); Workbook wb1 = new XSSFWorkbook(fis); fis.close(); // 创建新的工作簿对象 Workbook wb2 = new XSSFWorkbook(); // 创建新的 sheet,名称为 "newSheet" Sheet newSheet = wb2.createSheet("newSheet"); // 获取要复制sheet Sheet oldSheet = wb1.getSheet("oldSheet"); // 将旧的 sheet 复制到新的工作簿对象中,并返回新的 sheet 对象 Sheet clonedSheet = wb2.cloneSheet(wb1.getSheetIndex(oldSheet)); // 将新的 sheet 对象复制到新的工作簿对象中 wb2.setSheetName(wb2.getSheetIndex(clonedSheet), newSheet.getSheetName()); // 将新的工作簿对象保存到磁盘上的 Excel 文件中 FileOutputStream fos = new FileOutputStream(new File("new.xlsx")); wb2.write(fos); fos.close(); } } ``` 上述代码将旧的 Excel 文件中名为 "oldSheet" 的 sheet 复制到一个新的 Excel 文件中,并将其命名为 "newSheet"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值