使用Java Apache POI复制Excel工作表未保留原格式的问题咨询
Apache POI 复制Excel工作表保留完整格式解决方案
问题原因
Apache POI 提供的cloneSheet()方法默认仅复制工作表的单元格内容、单元格样式、公式等核心业务数据,不会同步视图属性、打印配置这类展示类参数,缩放比例属于工作表的视图配置项,因此会出现复制后缩放比例恢复默认100%的问题。
修复后完整代码
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.ss.util.CellAddress; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class CloneSheet { public static void main(String[] args) throws Exception { FileInputStream file = new FileInputStream(new File("exemple.xlsx")); XSSFWorkbook workbook = new XSSFWorkbook(file); // 获取原工作表 XSSFSheet originSheet = workbook.getSheetAt(0); // 克隆工作表 XSSFSheet sheet_copy = workbook.cloneSheet(0); int num = workbook.getSheetIndex(sheet_copy); workbook.setSheetName(num, "copy_file"); // 核心:同步缩放比例 sheet_copy.setZoom(originSheet.getZoom()); // 可选:同步打印配置,导出PDF时保证布局完全一致 sheet_copy.getPrintSetup().setPaperSize(originSheet.getPrintSetup().getPaperSize()); sheet_copy.setMargin(Sheet.LeftMargin, originSheet.getMargin(Sheet.LeftMargin)); sheet_copy.setMargin(Sheet.RightMargin, originSheet.getMargin(Sheet.RightMargin)); sheet_copy.setMargin(Sheet.TopMargin, originSheet.getMargin(Sheet.TopMargin)); sheet_copy.setMargin(Sheet.BottomMargin, originSheet.getMargin(Sheet.BottomMargin)); sheet_copy.setFitToPage(originSheet.getFitToPage()); // 可选:同步冻结窗格配置 if (originSheet.getPaneInformation() != null) { CellAddress freezeAddress = originSheet.getPaneInformation().getTopLeftCell(); sheet_copy.createFreezePane(freezeAddress.getColumn(), freezeAddress.getRow(), freezeAddress.getColumn(), freezeAddress.getRow()); } FileOutputStream outputStream = new FileOutputStream("exemple.xlsx"); workbook.write(outputStream); // 关闭流避免资源泄漏 outputStream.close(); workbook.close(); file.close(); } }
说明
- 仅需要解决缩放比例问题的话,只需要保留
setZoom相关的一行代码即可。 - 如有导出PDF的需求,建议加上打印配置同步的代码,可避免出现页边距、纸张大小、分页位置不一致的问题。
内容的提问来源于stack exchange,提问作者dEs12ZER
相关产品推荐
相关产品推荐

